首页
社区
课程
招聘
[原创]LLVM Pass编写及去除 —— 间接跳转
发表于: 2026-7-8 19:22 1760

[原创]LLVM Pass编写及去除 —— 间接跳转

2026-7-8 19:22
1760

间接跳转是通过将原本的jmp addr指令,替换成jmp reg,从而混淆块与块之间的跳转关系的方法。

一个最基础的间接跳转pass如下

经典的寄存器跳转,直接给rax赋值。一下就能看出跳转的地址

为了让混淆的效果更好,可以对地址进行加解密操作

现在给寄存器赋的值需要通过全局变量去运算

当然间接跳转混淆的方式多种多样,这里只是基础的两种Pass编写。

关于去除:

有两种去除混淆的方式

1.通过idc脚本计算进行去除

和之前去除控制流平坦化一样,通过idc脚本匹配特征再进行patch,以上面的样本为例,读取全局变量的值后和一个64位值进行简单运算,可以根据特征jmp rax来定位间接跳转部分

然后计算出全局变量的值和加的值

最后patch

完整脚本如下:

(示例脚本仅为非条件跳转)

运行后可自动将间接跳转改为直接跳转

2.自动下断点trace去除

无论是怎样的间接跳转,执行到最后jmp指令的时候都会计算出值,所以动态获取值无疑是很好的办法。

但是在一个混淆样本中jmp指令往往过多,调试去看值是不行的,所以可以使用idc批量下断点,再执行一遍,直接获取到跳转的值

因为有循环,所以重复内容占了很多,可以写一个python脚本去重

结果如下

这样我们就获取到了关键的跳转关系表,可通过脚本或ai辅助patch

样本为strange_xor.exe,混淆方式如图

这一段汇编中只有中间的push ebp是真正有用的程序代码,其余全部为间接跳转服务。


传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!

最后于 2026-7-9 01:43 被mb_wckjnnha编辑 ,原因:
上传的附件:
收藏
免费 5
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回