逆向学习66——LLVM Pass(函数名称加密Pass)

1.函数名称加密PASS

首先创建一个目录

图片

创建下面两个文件

图片


我们可以参考文档,不同版本的文档不一样,我们是12.0.0,就用12.0.0的文档

[https://releases.llvm.org/12.0.0/docs/WritingAnLLVMPass.html)]

图片

我们在文件中加入信息

图片


 

图片

图片

编写PASS

图片


这里PASS编写完成

然后我们来编译一下
 

图片


这里我们直接编译这个项目的名字
 

图片


这里就编译完成

首先我们需要设置PASS环境变量

图片


我们先查询PASS的路径

图片

使用opt运行

图片

经过错误调试,这是因为opt版本不一致导致的

图片

当然我们在执行前可以设置opt的环境变量

图片

然后我们修改名字

图片

再次编译

图片

再次执行

图片

这里说明一个简单的PASS就完成了,然后我们添加功能

我们这里给函数改名字

图片

然后再次编译运行

图片

我们就可以成功的改名了

图片

然后我们给函数名加密
这里我们使用MD5进行加密

图片


 

图片

图片

再次编译运行

图片

函数名就被hash加密

2.在LLVM源码之外开发PASS

[https://llvm.org/docs/CMake.html#cross-compiling]

在源码之外开发PASS,需要创建这样结构的工程

图片

首先创建文件CmakeList.txt

图片


 

图片


 

图片

图片

然后我们使用CLion打开该项目

图片

我们就发现了一些错误,然后我们需要一次补全这些错误
我们根据代码提示配置环境

图片

环境配置完成

图片

编译成功
我们编译一个release版本,设置添加release版本

图片

图片

错误分析,这里是因为没有加入llvm的环境,所以编译时找不到符号

set(LLVM_DIR /root/Desktop/llvm-Compiler/llvm/llvm-project-12.0.0.src/llvm/cmake-build-release/lib/cmake/llvm)

图片


 

图片


这里就成功的编译了

编译流程参考官网:

图片

然后我们要clang可以使用这个Pass
clang -Xclang -load -Xclang /root/Desktop/llvm-Compiler/llvm/llvm-project/lesson2/outlesson2/cmake-build-release/EncodeFunctionName2/LLVMEncodeFunctionName2.so -encode hello.ll -o hello_clang.bc
 

图片


 

图片


clang也可以直接编译可执行文件

我们将pass注册到clang里面

图片

首先创建一个EncodeFunctionName的头文件

图片

图片

调用头文件,并实现相应的函数

图片

图片

然后我们需要将PASS加进来

图片

图片

这里我们将PASS加入
然后编译一下

现在我们的PASS是一个动态库,但是别的都是静态库,我们需要编译成静态库

我们可以参考一个静态库

图片

我们修改原PASS的文件

图片

然后还要在静态配置文件加上

由于我们使用的是12.0.0,LLVMBuild.txt被删除

图片

然后我们进行编译

图片

我们可以看见就成功生成静态链接库,比以往的方式更加简单

然后我们编译一下clang  ninja clang

图片

编译错误

图片

这里报错,我们采用放入IPO的方式
 

图片


编译成功
我们还要加上参数
 

图片


 

图片

并修改完成

我们采用IPO的方式

编译成功

图片


clang -mllvm -encode_name hello_clang.c
报错

图片

这里是没有返回导致的

图片

再次编译

图片


这样就嵌入成功

回顾IPO嵌入的流程:
(1)在include/…/IPO下添加头文件

图片

(2)在lib/…/IPO下添加代码文件

图片

(3)在IPO配置文件CmakeList.txt中加入c文件

图片

(4)在IPO下PassManagerbuilder下添加参数和加载选项
 

图片


 

图片

图片

然后结果是
 

图片


这里打印两次是因为我们注册了两次
 

图片

3.Clion调试

首先编译一下opt

图片

然后设置一下编译器

图片

-load /root/Desktop/llvm-Compiler/llvm/llvm-project/lesson2/outlesson2/cmake-build-debug/EncodeFunctionName2/LLVMEncodeFunctionName2.so -encode /root/Desktop/llvm-Compiler/llvm/llvm-project/lesson2/hello_clang.ll

然后下断点

图片

然后进行调试

图片

转自:Android逆向学习66——LLVM Pass(函数名称加密Pass)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值