美文网首页
Android逆向 ollvm 使用

Android逆向 ollvm 使用

作者: LiuJP | 来源:发表于2022-04-09 14:04 被阅读0次

    简介

    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 是遇到文件找不到的问题

    • /Users/xxx/Desktop/git/OpenCV-android-sdk/sdk/native/jni/include/opencv2/core/cv_cpu_dispatch.h:209:12: fatal error: 'arm_neon.h' file not found
      在/Users/xxx/Desktop/git/obfuscator/build/lib/clang/9.0.1/include目录找到

    • /Users/xxx/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1/stdbool.h:28:15: fatal error: 'stdbool.h' file not found
      在/Users/xxx/Desktop/git/obfuscator/build/lib/clang/9.0.1/include目录找到

    相关文章

      网友评论

          本文标题:Android逆向 ollvm 使用

          本文链接:https://www.haomeiwen.com/subject/hqhpsrtx.html