第一次使用OLLVM增加so文件的分析难度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014476720/article/details/85097441

编译ollvm源码(前提:我的这些都是放在/opt文件夹里面操作的)
1. git clone -b obfuscator-llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git
2. mkdir build  //这个目录主要是用于存放编译文件而已,其实不要紧的,到时都只是拿里面的编译后的文件来用而已
3. cd build

4.下面这个执行编译,有时会提示编译失败,说有个test 文件夹已存在

   cmake -DCMAKE_BUILD_TYPE:String=Release ../       注意:../这个是build在项目文件里面的写法,如果你build和项目文件是同级,那就需要指定你编译项目名称 ../obfuscator

  具体报错

CMake Error at cmake/modules/AddLLVM.cmake:1163 (add_custom_target):
  add_custom_target cannot create target "check-llvm-bindings-ocaml" because
  another target with the same name already exists.  The existing target is a
  custom target created in source directory "/opt/obfuscator-llvm-4.0/test".
  See documentation for policy CMP0002 for more details.
Call Stack (most recent call first):
  cmake/modules/AddLLVM.cmake:1226 (add_lit_target)
  test/CMakeLists.txt:150 (add_lit_testsuites)

  如果报错了,就加多一个编译配置参数

cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF  ../

5. make -j2   //这个2是代表线程数,主要还是看你的电脑,我这里是用虚拟机的,我设置了4个处理器,然后很卡,所有就用了两个线程,反正这里编译用了很长时间,如果一直卡死被杀进程,你就减少线程数据就行了,1个也行的

成功之后,用到的就只有build(刚刚创建的那个文件夹的)目录下bin和lib目录下的文件

之后进入到ndk的toolchains目录,找一份原有的llvm进行复制,我这里复制重命名为llvm-4.0

之后将下图里面的两个文件夹删除,用我们刚刚上面编译的bin和lib

我这里用是android-ndk-r10d的NDK

将ndk/toolchains目录下这三个文件夹,复制一份并且重命名,其实就是修改clang3.4为obfuscator4.0(即最后一横之后的字符是用来识别版本的),等一下编译so,配置的时候是要用到obfuscator4.0 ,用于指定obfuscator4.0 这个编译器的

arm-linux-androideabi-clang3.4 -》arm-linux-androideabi-obfuscator4.0

mipsel-linux-android-clang3.4-》mipsel-linux-android-obfuscator4.0

x86-clang3.4-》x86-obfuscator4.0

之后修改上面三个文件夹里面的setup.mk ,将 LLVM_VERSION 改为你对应的版本,我的是4.0

LLVM_VERSION := 4.0
LLVM_NAME := llvm-$(LLVM_VERSION)   //注意这里 llvm-$(LLVM_VERSION) 这个名字是要对应回上面新添加的llvm的,我那里添加的是llvm-4.0

到这里配置基本可以了

混淆配置参数

-mllvm -fla 开启控制流平台化
-mllvm -sub 开启指令替换
-mllvm -bcf 开启虚假控制流
-mllvm -sobf 开启字符串混淆
-mllvm -seed=0xdeadbeaf 指定随机数种子生成器

bcf可以配合下面参数使用
-mllvm -bcf_loop=3 设置函数混淆次数为3次 不加此选项默认为1次
-mllvm -bcf_prob=40 设置代码块被混淆的概率是40%,默认30%
 

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello   # 输出的包名
LOCAL_LDLIBS += -llog -landroid -lc 
LOCAL_SRC_FILES := hello.cpp  #引入的编译文件
LOCAL_CFLAGS += -mllvm -fla -mllvm -sub  #混淆配置
LOCAL_ARM_MODE := arm
include $(BUILD_SHARED_LIBRARY)

Application.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
APP_ABI := armeabi armeabi-v7a   //
NDK_TOOLCHAIN_VERSION := obfuscator4.0  //上面刚刚新添加的4.0作为编译器
APP_PLATFORM = android-16 
APP_STL := c++_shared #llvm编译需此编译库

include $(BUILD_EXECUTABLE)

include $(BUILD_SHARED_LIBRARY) //生成的包有后续名  test.so

include $(BUILD_EXECUTABLE)  //生成的包没有后续名  test

效果:

 

参考来源

https://blog.csdn.net/chrisnotfound/article/details/79026449

https://blog.csdn.net/SilenceCoder/article/details/79401147

https://blog.csdn.net/ASSYIRAN/article/details/81866242

https://www.jianshu.com/p/4a43ca8a9b13

猜你喜欢

转载自blog.csdn.net/u014476720/article/details/85097441