Android给SO库增加混淆(OLLVM)

方式

NDK r21 + ollvm9.0.1 + ndk-build   系统MacOS

唠嗑

网上的教程基本都是 低版本NDK + 低版本ollvm + cmake 进行混淆操作,已经不适合在当下(2021年)使用了,且每个都写得很复杂,就是在坑人。所以在这里写一下高版本ndk如何使用ndk-build进行ollvm的混淆。虽然ollvm反混淆已有方案,但对逆向者而言,已经提高了很大的一个门槛。

简介

OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学安全实验室于2010年6月份发起的一个项目,该项目旨在提供一套开源的针对LLVM的代码混淆工具,以增加对逆向工程的难度。github上地址是https://github.com/obfuscator-llvm/obfuscator,只不过仅更新到llvm的4.0,2017年开始就没在更新。最新的9.0.1等版本均是后来大神修改出来的分支。

步骤

1. clone ollvm工程到本地,切换分支到9.0.1,新建build文件夹并编译。(git、cmake相关请自行百度)

ndk版本我使用的是r21 、r22版本,需要使用9.0.1版本的llvm,下面教程使用的环境是ndk 21.0.6113669。用gtihub慢的话可以把仓库地址切换为我拷贝到gitee的地址https://gitee.com/jzhiyshen/obfuscator.git

 有人反映切换不到9.0.1分支,年代久远,没再深究,可以尝试另一个地址去clone: https://github.com/heroims/obfuscator

#clone 项目
git clone https://github.com/obfuscator-llvm/obfuscator.git
#切换分支
cd obfuscator
git checkout llvm-9.0.1
#新建build目录
mkdir build
cd build
#如果不想跑测试用例加上-DLLVM_INCLUDE_TESTS=OFF 
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_CREATE_XCODE_TOOLCHAIN=ON ../obfuscator/
make -j7

2. 编译完成,将OLLVM的build/bin目录下的clang复制替换掉NDK目录中的对应文件。

需要拷贝下图4个文件

复制替换到 ndk目录/toolchains/llvm/prebuilt/darwin-x86_64/bin,存在同名文件需要替换掉

3. 复制对应的头文件到NDK目录下

回到刚才编译完成的build目录下,进入到 lib/clang/9.0.0/include/, 复制如下文件

stdarg.h
stddef.h
__stddef_max_align_t.h
float.h

到 ndk目录/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include 文件夹下。

4. 到这里,OLLVM环境就搭建好了,对,就是这么简单,没别人说的那么复杂。接下来就是在Android工程中加入OLLVM的混淆参数。

Android工程需要选择刚才已经替换文件的NDK版本,如只有一个NDK版本或已经使用此NDK版本可以忽略,具体如何设置NDK版本请自行百度。

OLLVM 9.0.1支持下面四种混淆方式

-mllvm -fla:控制流扁平化

-mllvm -sub:指令替换

-mllvm -bcf:虚假控制流程

-mllvm -sobf: 字符串加密

在Android项目JNI目录下的 Android.mk 加入编译参数(不加此参数就没有混淆)

LOCAL_CFLAGS   += -mllvm -sub -mllvm -sobf -mllvm -fla -mllvm -bcf

然后clean一下工程,Make Project ,按照平时编译流程来,得到的so库就是混淆后的so库了。

使用IDA看看我们混淆前后的逆向出来的代码的差别

混淆前

混淆后

逆向难度肉眼可见的增加!

enjoy!

  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 29
    评论
### 回答1: 混淆SO文件是指对Android native执行文件(.so文件)中的函数和数据进行加密和混淆,以保护代码的安全性和隐私性。与Java代码混淆不同的是,SO文件的混淆是在编译阶段完成的,而不是在打包和发布阶段。 在Android开发中,NDK(Native Development Kit)是一款可用于编写本地代码的工具集。使用NDK开发的应用程序使用SO文件来提供C/C++函数和。由于NDK代码不会在应用程序中进行编译,因此它们没有类似于Java代码的混淆和加密工具。因此,为了加强SO文件的安全性,需要使用其他的工具来进行混淆。 现在有许多开源的SO混淆工具可供使用。例如,Android NDK提供了一个名为LLVM混淆器的工具,它使用一些与Java代码混淆器不同的技术来优化指令流和掩盖代码逻辑。此外,其他SO混淆工具如YASC、MOVfuscator、O-LLVM等也可以用于混淆SO文件。 SO文件混淆可以通过多种方式实现。例如,针对代码文件进行重命名或修改,删除未引用的函数和数据,加密和混淆重要内容等。此外,也可以通过将硬编码的值替换为映射的值,使用一些外部定义的数据结构来防止反汇编和静态分析等技术来实现混淆。无论采用何种方法,SO文件混淆对于保护代码的安全性和隐私性都具有重要意义。 ### 回答2: 使用Android Studio中的ProGuard工具可以对一个应用程序的Java class文件进行混淆,但是它并不支持对Native代码的混淆。由于so文件是编译后的二进制文件,没有人可读的,对so文件进行混淆通常都是为了防止逆向工程而不是优化程序的运行或缩小它的大小。 现在有一些第三方工具可以用来对so文件进行混淆,比如Bangcle、Qihoo 360、Baidu和信鸽。这些工具通过改变so文件的代码结构、函数名称和变量名等方法来混淆so文件,使之更加难以阅读和理解。 混淆so文件是有一定风险的,因为这可能会导致应用程序的崩溃和功能异常。此外,混淆so文件可能会和某些平台实现产生不兼容的问题。但是如果您确实担心你的so文件受到攻击,那么混淆so文件可能是一个值得考虑的安全策略。
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值