如何使用OLLVM和常规方法实现Android SO文件混淆以提高应用安全性

一、引言

在移动应用开发中,应用的安全性越来越受到关注。特别是在Android应用中,SO(Shared Object)文件往往会保存一些需要加密的关键数据,如API密钥、应用密钥等。如果这些重要的信息没有经过适当的混淆和保护,极容易被恶意第三方通过逆向工程手段破解,进而导致一系列安全问题。

对SO文件进行混淆和保护与对Java和Kotlin代码进行混淆一样重要。混淆不仅可以增加破解难度,还可以有效地保护应用内部的核心算法和功能逻辑。本篇文章将探讨如何利用CMake常规方法和开源的OLLVM工具对SO文件进行混淆,以提高应用安全性。同时,我们也将对两种方法的混淆效果进行验证和对比,并探讨如何解决集成过程中的常见问题。

二、常规混淆方法

在对SO文件进行混淆保护时,我们常使用一些配置参数来编译和链接代码,以提升其安全性。以下是一些常用的CMake参数及其功能:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -fvisibility=hidden -fstack-protector-strong -fPIE")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -fvisibility=hidden -fstack-protector-strong -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s -Wl,-z,relro,-z,now -pie")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s -Wl,-z,relro,-z,now -pie")
  • -02:
    进行较高级别的优化,既能提升代码执行效率,又不会显著增加编译时间。
  • -fvisibility=hidden:
    将符号默认可见性设为隐藏,避免外部重复定义或滥用内部API。
  • -fstack-protector-strong:
    防止栈溢出攻击,通过在函数的返回地址前插入保护符。
  • -fPIE 和 -pie:
    启用位置无关代码,使执行文件在内存中随处可加载,增加攻击难度。
  • -s:
    去除符号表和重定位信息,减小生成文件的大小。
  • -Wl,-z,relro,-z,now:
    relro(可重定位读写部分)和 now(完全重定位保护),这些参数进一步加强执行时的安全性。
    为了验证这些参数的效果,我们使用IDA(Interactive Disassembler)对未混淆和混淆后的SO文件进行了分析。
未混淆SO文件

在不使用上述参数进行混淆的情况下,我们将生成的SO文件导入到IDA中,如下图所示:


17237769872916.png

可以明显看到字符串和native方法,信息一览无遗,极易被逆向工程人员识别和破解。

使用常规参数混淆后的SO文件

当我们在CMake中添加上述混淆参数后,重新生成SO文件并在IDA中进行查看,发现以下变化:


17237770373346.png

尽管SO文件的大小有所减小,但混淆效果并不显著。字符串和native方法仍然容易被识别,代码行数虽然减少,但不足以达到预期的混淆效果。

通过上述比较,我们可以看出单纯依靠这些常规方法进行混淆效果有限。为进一步提高SO文件的混淆效果,我们接下来将介绍一种更为有效的开源工具——OLLVM。

三、OLLVM介绍

OLLVM(Obfuscator with LLVM)是基于LLVM(Low Level Virtual Machine)的一个开源混淆器。它通过对程序代码进行变形和混淆,使得逆向工程变得更加困难,从而显著增强了程序的安全性和保护机制。相比于传统的混淆方法,OLLVM提供了一些高级的混淆技术,使其成为保护SO文件的重要工具。

OLLVM的主要功能包括:

  • 控制流扁平化(-mllvm -fla):通过扁平化控制流,使代码的执行路径变得复杂且难以理解,从而增加逆向工程的难度。

  • 指令替换(-mllvm -sub):用等效但不同的指令序列替换原有指令,增加代码阅读和分析的复杂度。

  • 虚假控制流程(-mllvm -bcf):在代码中插入虚假的控制流和逻辑,使得代码看起来混乱且难以推理。

  • 字符串加密(-mllvm -sobf):对字符串进行加密处理,防止字符串在二进制文件中被轻易识别和解析。

通过结合使用这些功能,OLLVM能够大幅提升SO文件的防护能力,使其更加难以被破解。接下来,我们将深入探讨如何使用OLLVM对SO文件进行混淆,并验证其效果。

四、使用OLLVM进行混淆

接下来我们将介绍如何使用OLLVM对SO文件进行混淆,包括下载、编译、配置并验证其效果。

  • 下载和编译OLLVM
    首先,从GitHub下载OLLVM的源码,并进行编译:
$ git clone -b llvm-9.0.1 https://github.com/heroims/obfuscator
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_CREATE_XCODE_TOOLCHAIN=ON ../obfuscator/
$ make -j7

  • 配置OLLVM
    编译完成后,将生成的build/bin目录拷贝到Android/sdk/ndk/xx.x.xxxxxx/toolchains/ollvm/prebuilt/darwin-x86_64/bin,并替换原有的bin文件夹(注意:是替换,而不是覆盖)。具体步骤如下:
$ cp -r build/bin /path/to/Android/sdk/ndk/xx.x.xxxxxx/toolchains/ollvm/prebuilt/darwin-x86_64/
  • 解决编译报错

在使用OLLVM进行编译时,可能会遇到缺少头文件的问题。根据提示信息,拷贝缺少的头文件到相应目录中。通常需要从build/lib/clang/9.0.0/include/目录复制以下文件:
stdarg.h
stddef.h
_stddef_max_align_t.h
float.h
stdbool.h
将以上文件复制到ndk目录/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include文件夹下。不同的NDK版本可能会有不同的头文件需求,请根据具体错误提示进行操作。

完成这些步骤后,OLLVM已经配置完毕。接下来,在Android Studio中选择Build --> Refresh Linked C++ Projects,然后再次运行程序,验证编译是否通过。

  • 在CMakeLists.txt中应用OLLVM混淆配置

在CMakeLists.txt文件中增加以下配置,用以应用OLLVM的混淆功能:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mllvm -sub -mllvm -sobf -mllvm -fla -mllvm -bcf")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mllvm -sub -mllvm -sobf -mllvm -fla -mllvm -bcf")

这些参数分别启用了OLLVM的指令替换、字符串加密、控制流扁平化和虚假控制流程功能。

  • 混淆效果验证
    混淆后的SO文件在IDA中查看效果如下图所示:


    1723777310240.png

可以看出,代码结构变得更加复杂,明文字符串也被加密,显著提升了代码的混淆效果和安全性。

五、结合使用OLLVM和常规混淆方法

虽然使用OLLVM进行混淆显著提高了SO文件的安全性,但我们发现包的大小却大幅增加。经过混淆处理后,SO文件的大小从原先的210KB增长到了1.2MB,这对应用的整体性能和分发带来了不小的负担。

为了解决包大小的问题,可以结合使用OLLVM和常规的混淆配置。具体的CMake配置如下所示:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -fvisibility=hidden -fstack-protector-strong -fPIE")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -fvisibility=hidden -fstack-protector-strong -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s -Wl,-z,relro,-z,now -pie")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s -Wl,-z,relro,-z,now -pie")

这些配置参数的功能在前文已经进行详细介绍,应用它们不仅有助于提升代码的可读性和安全性,还能减少最终生成的SO文件的大小。

通过重新编译,我们发现SO文件的包大小问题得到了明显改善。最终生成的SO文件不仅保留了OLLVM带来的高级混淆效果,同时也得到了合理的优化和压缩,大小回到了较为理想的范围。

六、结论

通过本文的探讨,我们了解了如何使用OLLVM和常规方法对Android SO文件进行混淆和保护。常规方法易于配置,且对包大小控制良好,但混淆效果有限。OLLVM则提供了更高级的混淆技术,显著提升安全性,但会导致包大小增加。

结合使用OLLVM和常规混淆方法,可以同时实现强大的混淆效果和适当的包大小控制。这种组合方式,不仅提升了代码的安全性和复杂性,还保持了应用的整体性能。通过这些方法,Android应用可以更好地抵御逆向工程和恶意攻击,从而提高整体安全性。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容