Android逆向 ollvm 使用

2022-04-09  本文已影响0人  LiuJP

简介

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

工具

ollvm-9.0.1
ndk21
android2020.3.1

sudo xcode-select --switch /applications/Xcode.app/
(以下的xxx 代表用户名称)

1、编译ollvm

# clone 项目
git clone https://github.com/frankpi/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/
# 出现Build files have been written to: /Users/mark.wu/Desktop/git/obfuscator/build
make -j7
# 等待编译完成

2、将OLLVM的build/bin目录下的clang复制替换掉NDK目录中的对应文件。

需要拷贝下图4个文件

2021060914522837.png

复制替换到 ndk目录/Users/xxx/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin,存在同名文件需要替换掉(复制之前先备份 cp -R bin/ bin_back/)

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

和llvm 的头文件有不一样的地方所以需要复制过去
回到刚才编译完成的build目录下,进入到 lib/clang/9.0.0/include/, 复制如下文件

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

到 ndk目录/Users/xxx/Library/Android/sdk/ndk/21.4.7075529/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

cmake
使用

  externalNativeBuild {
            cmake {
                abiFilters 'armeabi-v7a', 'arm64-v8a'
                cppFlags "-std=c++14 -fexceptions -fvisibility=hidden"
                cppFlags "-mllvm -sub -mllvm -sobf -mllvm -fla -mllvm -bcf"
//                arguments "-DANDROID_STL=c++_shared"
//                arguments "-DANDROID_STL=c++_static"
            }
        }

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

同样的方法


混淆后 混淆前

字符串也自动混淆

原文连接:https://blog.csdn.net/u013314647/article/details/117740784

编译携带opencv 的so 是遇到文件找不到的问题

上一篇下一篇

猜你喜欢

热点阅读