WINDOWS 环境下编译 OLLVM 替换到 NDK 环境

这篇具有很好参考价值的文章主要介绍了WINDOWS 环境下编译 OLLVM 替换到 NDK 环境。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

编译 OLLVM

环境准备

这里使用的是AGP 7.2.2NDK 25.2.9519653llvm 14.0.7cmake 3.22.1python39

git

用来下载源码

python

搞到这一步环境变量里应该已经有python了吧

NDK

AGP 的 7.2.2 版本默认使用的 NDK 版本为21.4.7075529,对应的 LLVM 为9.0.9

WINDOWS 环境下编译 OLLVM 替换到 NDK 环境

需要根据实际情况选择 NDK 对应的 LLVM 版本,编译 OLLVM,LLVM 版本号可以通过Sdk_DIR\ndk\$version\toolchains\llvm\prebuilt\windows-x86_64\AndroidVersion.txt文件看到,如SDK Manager 中的最新版本25.2.9519653为:

14.0.7
based on r450784d1
for additional information on LLVM revision and cherry-picks, see clang_source_info.md

在 module 的build.gradle中指定 NDK 版本

android {
    ndkVersion "25.2.9519653"
}

OLLVM

可以在 github/heroims/obfuscator 仓库的分支中找到对应的移植源码,

WINDOWS 环境下编译 OLLVM 替换到 NDK 环境

13x14x版本也可以在 github/yangyiyu08/ollvm-project 仓库的对应分支中获取。14x版本还可以直接在 Releases 中下载作者编译好的文件,跳过编译的步骤。但这个文件在我的环境下会有NDK编译错误的情况,我自己编译出来的文件运行正常。

这里使用NDK 25.2.9519653,需要下载 14x 的源码。

CMAKE

AGP 的 7.2.2 版本默认使用的 cmake 版本为3.18.1,在指定 NDK 版本到 25.2.9519653 后,会在编译时提示需要升级到 3.19 版本以上的信息。所以这里在编译前就通过 SDK Manager 下载 3.22.1 版本,并把所在目录添加到环境变量

同时在build.gradleCMakeLists中修改工程的 cmake 版本。

开始编译

在源码的目录执行以下命令构建 cmake 配置
cmake -S llvm -B build -G Ninja -DLLVM_ENABLE_PROJECTS="clang" -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF -DLLVM_ENABLE_NEW_PASS_MANAGER=OFF

对应的参数:

-G Ninja: 使用 ninja 进行编译源码
-DLLVM_ENABLE_PROJECTS="clang": 启用clang,有多个选择 但我们只需要clang,官方文档有说明
-DCMAKE_BUILD_TYPE=Release: 构建 release 版本,比 debug 版本编译快很多
-DLLVM_INCLUDE_TESTS=OFF: 关闭 llvm 的头文件测试,也是为了加快编译速度
-DLLVM_ENABLE_NEW_PASS_MANAGER=OFF: 这个非常重要,llvm-12.x 开始默认使用 newPM进行编译源码,导致 ollvm 不起作用!因此,需要加上这个参数禁用掉 newPM。(在每个编译时增加flag -flegacy-pass-manager 让 llvm 不走 newPM 编译也可以,但没必要)

执行以上命令后若提示 Configuration done. 则配置成功。接下来执行以下命令开始编译:
cmake --build build -j16

其中-j16为指定的线程数,需要根据 CPU 调整。然后等待编译完成

WINDOWS 环境下编译 OLLVM 替换到 NDK 环境

编译完成

编译完成后打开build/bin目录,找到clang.execlang++.execlang-cl.exe,可以看到三个文件的MD5是相同的。

WINDOWS 环境下编译 OLLVM 替换到 NDK 环境

编译后的文件大小为 137MB,对比 NDK 目录下的 clang.exe 仅有 88.6MB。编译后的文件可以通过strip clang.exe命令剥离可执行文件减小到 113MB。

替换到 NDK 环境

备份与替换

首先打开当前 NDK 的 llvm 目录,将clang.execlang++.execlang-cl.exe备份,然后把上一步编译后的文件复制到当前目录。

WINDOWS 环境下编译 OLLVM 替换到 NDK 环境

复制 lib 库

此时编译会出现找不到libunwind等库的错误,错误信息显示目录文件不存在

  CMake Error at SDK_DIR/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake:69 (message):
    The C compiler
  
      "SDK_DIR/ndk/25.2.9519653/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe"
  
    is not able to compile a simple test program.
  
    It fails with the following output:
  
      Change Dir: APPLICATION_DIR/app/.cxx/RelWithDebInfo/703a16l3/arm64-v8a/CMakeFiles/CMakeTmp
      
      Run Build Command(s):SDK_DIR\\cmake\3.22.1\bin\ninja.exe cmTC_c87d1 && [1/2] Building C object CMakeFiles/cmTC_c87d1.dir/testCCompiler.c.o
      [2/2] Linking C executable cmTC_c87d1
      FAILED: cmTC_c87d1 
      cmd.exe /C "cd . && SDK_DIR\\ndk\25.2.9519653\toolchains\llvm\prebuilt\windows-x86_64\bin\clang.exe --target=aarch64-none-linux-android26 --sysroot=SDK_DIR/ndk/25.2.9519653/toolchains/llvm/prebuilt/windows-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments CMakeFiles/cmTC_c87d1.dir/testCCompiler.c.o -o cmTC_c87d1  -latomic -lm && cd ."
      ld: error: unable to find library -latomic
      ld: error: cannot open SDK_DIR/ndk/25.2.9519653/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/14.0.0/lib/linux/libclang_rt.builtins-aarch64-android.a: No such file or directory
      ld: error: unable to find library -l:libunwind.a
      ld: error: cannot open SDK_DIR/ndk/25.2.9519653/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/14.0.0/lib/linux/libclang_rt.builtins-aarch64-android.a: No such file or directory
      ld: error: unable to find library -l:libunwind.a
      clang: error: linker command failed with exit code 1 (use -v to see invocation)
      ninja: build stopped: subcommand failed.
      
      
  
    
  
    CMake will not be able to correctly generate this project.
  Call Stack (most recent call first):
    CMakeLists.txt:10 (project)

需要把SDK_DIR/ndk/25.2.9519653/toolchains/llvm/prebuilt/windows-x86_64/lib64/目录下的calng目录,复制到/lib目录中,并把clang/14.0.7修改为14.0.0

这里的14.0.0是根据错误日志中出现的路径提取出来的,在控制台中输入clang -v查看当前 clang 的版本,按照日志中出现或当前使用的 clang 版本调整。

WINDOWS 环境下编译 OLLVM 替换到 NDK 环境

至此,NDK 中 集成 OLLVM 已经完成了。接下来是配置和使用 OLLVM。

配置 OLLVM

这部分网上参考的文档很多,这里也只是简单介绍一下参数

参数

参数 说明
-mllbm -sub 激活指令替换
-mllvm -sub_loop=3 如果激活了传递,则在函数上应用3次。默认值:1
-mllvm -bcf 激活虚假控制流程
-mllvm -bcf_loop=3 如果激活了传递,则在函数上应用3次。默认值:1
-mllvm -bcf_prob=40 如果激活了传递,基本块将以40%的概率进行模糊处理。默认值:30
-mllvm -fla 激活控制流扁平化
-mllvm -split 激活基本块分割。在一起使用时改善展平
-mllvm -split_num=3 如果激活了传递,则在每个基本块上应用3次。默认值:1

拓展参数

heroims在移植 OLLVM 时,集成了Armariris的字符串混淆功能。

参数 说明
-mllvm -sobf 编译时候添加选项开启字符串加密
-mllvm -seed= 指定随机数生成器种子

使用

可以在build.gradle中进行配置,如:

android {
    defaultConfig {
        extrnalNativeBuild {
            cmake {
                cppFlags '-mllvm -fla'
            }
        }
    }
}

也可以在CMakeLists中进行配置,如:

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

输出比对

以配置了-fvisibility=hidden -ffunction-sections -fdata-sections 的获取 updatemark 为例,源码为:

static jstring getUpdate(JNIEnv *env, jobject clazz) {
    struct stat sb{};
    int updates = 0;
    int updatens = 0;
    if (stat("/data/data", &sb) == -1) {
        //获取失败
    } else {
        updatens = (int) sb.st_atim.tv_nsec;
        updates = (int) sb.st_atim.tv_sec;
    }
    std::string idRes = std::to_string(updates) + "." + std::to_string(updatens);
    return env->NewStringUTF(idRes.c_str());
}

before

WINDOWS 环境下编译 OLLVM 替换到 NDK 环境

after

WINDOWS 环境下编译 OLLVM 替换到 NDK 环境

遇到的问题

虚假控制流程的问题

实际编译的过程中,增加了-mllvm -bcf参数后,编译超过半个小时还是没有完成,移除后正常编译。
搜索了相关的问题后,发现可能是 ndk 的编译器优化 flag 在 release 时是 -O2 导致的。

This is specifically an issue with llvm / android-ndk when compiling with thumb mode. You'll either need to disable thumb compilation (annoying) or patch the llvm to not generate this type of instructions; it's not actually an obfuscator-llvm issue.

Potentially try upgrading your ndk as well, though I'm doubtful that will fix this issue. If I have extra time later I can try to find the patch I needed to create for llvm to specifically work around this issue.

但在我这边,debug 依然是没有响应,只能是去掉-bcf

CMAKELIST 的 Release 不生效问题

CMAKE_C_FLAGSCMAKE_C_FLAGS_DEBUG配置的参数都可以正常生效,但CMAKE_C_FLAGS_RELEASE配置无法在 release 时生效。只能配置在CMAKE_C_FLAGS中,然后在 CMakeLists 中判断当前环境是否为 DEBUG。文章来源地址https://www.toymoban.com/news/detail-559184.html

参考资料

  • yangyiyu08/【清羽】Windows10下编译OLLVM-14.x
  • heroims/OLLVM代码混淆移植与使用
  • obfuscator/issues/-bcf crashes when compiling ndk project

到了这里,关于WINDOWS 环境下编译 OLLVM 替换到 NDK 环境的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Hadoop实战】Windows环境下编译Hadoop2(2.10.2-R0)

    前提 根据Hadoop源码包解压之后编译帮助文件 BUILDING.txt 中关于windows的要求来准备环境 本机环境 JDK1.8 Windows 10 64位专业版 maven 3.9.2 git 2.41.0 ProtocolBuffer 2.5.0 这个要求要满足不然有报错(Github地址) cmake 2.36.4 Visual Studio 2022 Professional cygwin 安装包 IDEA 2022.2.5 编译方式 使用VS2022的

    2024年02月11日
    浏览(44)
  • 【Spark实战】Windows环境下编译Spark2 Linux上部署Spark On Yarn

    环境准备 git-2.14.1 maven-3.9.2 jdk-1.8 scala-2.11.8 zinc-0.3.15 主下载地址 spark-2.3.4 github官方地址 编译准备 maven远程仓库使用的是阿里云的 解压源码包 spark-2.3.4.zip ,修改根模块的pom文件。主要目的是为了变更hadoop的版本号,默认是 2.6.5 。 修改 spark-2.3.4devmake-distribution.sh 文件 主要是

    2024年02月13日
    浏览(47)
  • NDK交叉编译FFmpeg安卓编译ffmpeg

    编译工具下载 参考这个:https://blog.csdn.net/gaoliang0/article/details/81913291 或者官网 NDK编译工具下载: https://developer.android.google.cn/ndk/downloads?hl=zh-cn 官网老版本: https://github.com/android/ndk/wiki/Unsupported-Downloads 或者从我的百度网盘: 链接:https://pan.baidu.com/s/1FEtM6mVNgER_DvC2myHB5Q?pwd=28l9 提

    2024年02月08日
    浏览(29)
  • android ndk一些编译链接错误及解决办法

    链接opencv库时报链接错误缺少libz库 解决,mediann是本人所编译库的名字 链接librknnrt.so时报 解决 使用的是aarch-linux的库,报错换成android版本的librknnrt.so即可 链接opencv库时报错缺少jnigraphics 解决 链接opencv库时报错确实mediandk 解决 链接opencv时报很多std的链接错误 解决 ndk版本太

    2024年02月09日
    浏览(41)
  • (NDK编译)详解使用Android.mk编译的C/C++程序过程

    想要在 Android设备 上运行 C/C++程序 可执行文件,可采用一个方法就是使用 NDK编译 ,很多时候要比 gcc编译 更适合,这里我采用的是 imx6q开发板 上面装载了自己编写的Android6.0.1镜像,在 Ubuntu64位 系统上采用NDK编译。 目录 1.准备文件 2.编写Android.mk 注意 完整Android.mk代码 3.NDK编

    2024年02月05日
    浏览(35)
  • Linux 下编译和交叉编译FFmpeg、OpenCV(contrib )库

    目录 一、Linux下FFmpeg库的编译 1.1 yasm库 1.2 安装X264 1.3 安装FFmepg 1.4 实验 报错 二、Linux 下OpenCV库的编译 三、环境变量设置 四、FFmpeg Linux交叉编译 4.1 FFmpeg不依赖其他库编译 4.2 FFmpeg编译依赖库(如X264) 以上3部分验证过得,是正确的,第四步没验证 五、OpenCV的交叉编译 hkx@ubun

    2024年01月22日
    浏览(58)
  • NDK编译系列:手机终端运行可执行文件的方法

    该方式为PC上的NDK工具生成的可执行文件和库,利用adb导入到手机(未采用Andriod Studio生成带界面的apk文件),直接通过windows的命令窗在安卓原生linux环境上运行仿真。 利用前文博客总结梳理的方法,假设已经生成了可在手机终端运行的二进制文件和相关动态库,我们该如何

    2024年02月16日
    浏览(38)
  • Windows下编译安装Acise

    Acise (A CAx Industrial Software Ecology)是济南友泉软件公司自主研发的一套跨平台的通用 CAx ( CAD / CAE / CAM )软件开发框架,本文旨在记录Windows下编译安装 Acise 的流程。 操作系统 Windows 10 编译器 Visual Studio 2019 Community CMake 3.24.2 Boost 1.80.0 Qt 5.14.0 SWIG 4.1.1 OpenCASCADE 7.6.0 VTK 9.0.0 下载boo

    2024年02月09日
    浏览(33)
  • NDK编译ffmpeg包含硬件加速vulkan和mediacodec

    NDK编译ffmpeg包含硬件加速vulkan和mediacodec flyfish ffmpeg:ffmpeg-6.0 NDK:android-ndk-r25c 硬件加速:vulkan 和 mediacodec target CPU:armv8-a host:Ubuntu 22.04 因为这里要编译硬件加速版本的ffmpeg-6.0,所以需要把vulkan中include下的两个文件夹 vk_video 和 vulkan 拷贝到 android-ndk-r25c/toolchains/llvm/prebuil

    2024年02月12日
    浏览(27)
  • 在Windows平台编译OpenCV及开发环境配置

    工欲善其事,“必先有其器”。 以下是需要用到的软件和工具清单 表一 软件 用途 下载地址 版本 VS(Visual Studio) 开发和编译(打工人) https://visualstudio.microsoft.com/zh-hans/downloads/ 社区版就够用,版本选择详见表二 CMake 高效编译和组织代码(中介) https://cmake.org/download/ 版本选

    2024年01月21日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包