-
-
[原创]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编辑
,原因:
赞赏记录
参与人
雪币
留言
时间
wx_晨梦
感谢你的贡献,论坛因你而更加精彩!
2026-7-16 05:17
Harpe
这个讨论对我很有帮助,谢谢!
2026-7-10 23:41
梧桐生
你的分享对大家帮助很大,非常感谢!
2026-7-9 09:49
Liv_T
+1
感谢你的积极参与,期待更多精彩内容!
2026-7-9 01:38
wx_0.0_522
你的分享对大家帮助很大,非常感谢!
2026-7-8 19:32
赞赏
他的文章
- [原创] 实战去除安卓应用中的多种混淆 3449
- [原创]LLVM Pass编写及去除 —— 间接跳转 1760
- [原创]Android风险环境检测 —— 签名校验 57758
- [原创]Android一二三代壳实现 51023
- [原创]LLVM Pass编写及去除——虚假控制流 10370
赞赏
雪币:
留言: