当前位置: 首页 > news >正文

windows编译ollvm笔记

准备工作

1.找到Android SDK目录配置好cmake环境变量 E:\AndroidSDK\cmake\3.18.1(E:\AndroidSDK为 Android SDK目录地址)。

  1. 下载llvm-mingw编译环境(gcc编译器的windows版本,即可以在windows平台上使用gcc编译器),下载地址:https://github.com/mstorsjo/llvm-mingw/releases 选择最新版本,根据系统环境不一样选择自己需要的版本,我电脑是win10下载的是llvm-mingw-20230130-msvcrt-x86_64.zip,下载完后进入bin目录配置好环境变量。

在这里插入图片描述

3.编译代码下载,下载地址:https://github.com/heroims/obfuscator/tree/llvm-9.0.1 下载llvm编译的代码(分支9.0.1 这个是编译成功的版本,其它还没有测试)。

最后执行命令
mkdir build
cd build
cmake.exe -G “MinGW Makefiles” -DCMAKE_BUILD_TYPE=Release …
mingw32=make
mingw32-make install

注意这里安装完成了,会在你的C:\Program Files (x86)\LLVM这个目录下去找
bin文件夹中的clang.exe clang++.exe clang-format.exe 复制到ndk你的ndk目录下的\toolchains\llvm\prebuilt\windows-x86_64\bin文件夹下,覆盖目标文件

将编译后的build\lib\clang\9.0.1\include文件夹中的__stddef_max_align_t.h stddef.h stdarg.h float.h 复制到ndk的21.1.6352462\toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\include文件夹下

最后在你项目的CMakeLists.txt文件里面添加如下代码
set(CMAKE_C_FLAGS_RELEASE “KaTeX parse error: Double subscript at position 9: {CMAKE_C_̲FLAGS_RELEASE} …{CMAKE_CXX_FLAGS_RELEASE} -mllvm -fla -mllvm -split -mllvm -split_num=3 -mllvm -sub -mllvm -sub_loop=3 -mllvm -bcf -mllvm -bcf_prob=40 -mllvm -sobf”)

set(CMAKE_C_FLAGS_DEBUG “KaTeX parse error: Double subscript at position 9: {CMAKE_C_̲FLAGS_DEBUG} -m…{CMAKE_CXX_FLAGS_DEBUG} -mllvm -fla -mllvm -split -mllvm -split_num=3 -mllvm -sub -mllvm -sub_loop=3 -mllvm -bcf -mllvm -bcf_prob=40 -mllvm -sobf”)

上面的代码解释如下
只使用控制流扁平化: -mllvm -fla
只使用指令替换: -mllvm -sub
只使用虚假控制流程: -mllvm -bcf

-mllvm -fla:激活控制流扁平化
-mllvm -split:激活基本块分割。在一起使用时改善展平。
-mllvm -split_num=3:如果激活了传递,则在每个基本块上应用3次。默认值:1

-mllvm -sub:激活指令替换
-mllvm -sub_loop=3:如果激活了传递,则在函数上应用3次。默认值:1

-mllvm -bcf:激活虚假控制流程
-mllvm -bcf_loop=3:如果激活了传递,则在函数上应用3次。默认值:1
-mllvm -bcf_prob=40:如果激活了传递,基本块将以40%的概率进行模糊处理。默认值:30

-mllvm -sobf 开启字符串混淆
-mllvm -seed=0xdeadbeaf 指定随机数种子生成器

注意,添加字符串混淆有的情况会崩溃,如果发现崩溃,对混淆要求不严格的话,可以去掉字符串混淆

参考文章
https://www.cnblogs.com/blogzhangwei/p/17218016.html

http://www.lryc.cn/news/194882.html

相关文章:

  • 问:TCP/IP协议栈在内核态的好还是用户态的好
  • JavaScript-Vue基础语法-创建-组件-路由
  • 前端开发中的 TypeScript 泛型:深入解析
  • 06-spring的beanFactoryPostProcessor的执行
  • 想要精通算法和SQL的成长之路 - 分割数组的最大值
  • 【深度学习】【Opencv】【GPU】python/C++调用onnx模型【基础】
  • Oracle update 关联更新优化方法
  • USB协议学习(一)帧格式以及协议抓取
  • 前端工程化知识系列(8)
  • UnrealEngine iOS 打包 —— 签名证书(cer、p12)生成
  • 【广州华锐互动】VR高层火灾应急疏散演练提供一种无风险的逃生体验
  • 定档通知2024中国(上海)国际品牌叉车展览会
  • Ubuntu编译安装colmap遇到的几个问题以及解决
  • 【Qt上位机】打开本地表格文件并获取其中全部数据
  • 香港服务器选纯国际线路上网稳定吗?
  • USB PD3.1
  • unity面试八股文 - 基础篇
  • 构建高效问题解答平台:使用Cpolar和Tipas在Ubuntu上搭建专属问答网站
  • 前馈型BP神经网络
  • 数据库实验一:学生信息管理系统数据库结构搭建和表的创建
  • 解决 vscode使用Prettier格式化js文件报错:Cannot find module ‘./parser-babylon‘
  • 汉服商城小程序的作用是什么
  • 9月大型语言模型研究论文总结
  • 微信小程序--小程序框架
  • Java 全栈体系(三)
  • 爬虫学习日记第七篇(爬取github搜索仓库接口,其实不算爬虫)
  • 子组件监听父组件消息,随之变化与不变化
  • 计算机操作系统面试题自用
  • redis作为消息队列的缺点
  • Redis五大数据类型的底层设计