一、目标
Rolf Rolles大佬曾经说过,一图胜千言
一堆丑陋的 While 是没有加立白的效果,干净漂亮的 if 是加了立白的效果。
二、步骤
控制流平坦化示意图
上图是个漂亮的if else 结构。
先给每个块分配一个label标签
然后增加一个块变量,来指示应该执行哪个块。
每个块跑完之后不直接到自己的后继块,而是到主分发器块,这样漂亮的if else结构就由丑陋的switch语句代替了。
反控制流平坦化
- 先找到主分发器
- 再找到 块变量
- 后继块只有一个块的,把块变量删除,然后直接goto到后继块
- 后继块有两个块的,把块变量删除之后,增加比较操作。恢复 if else结构
分析下D810是怎么搞的
plugins\d810\log.ini 中
[logger_D810Unflat]
level=DEBUG
handlers=defaultFileHandler
qualname=D810.unflat
propagate=0
[logger_D810Tracker]
level=DEBUG
handlers=defaultFileHandler
qualname=D810.tracker
propagate=0
打开这两处调试信息的打印。
然后F5一下 anel.bin,的 sub_1000CF20 函数
之后,在日志文件里面就会清晰的打印出,unflat过程中的日志信息在 plugins\d810_logs\d810.log
需要重点分析的是 plugins\d810\tracker.py 和 plugins\d810\optimizers\flow\flattening\generic.py 文件。
generic.py 文件中的 GenericDispatcherUnflatteningRule.remove_flattening 函数做了块的乾坤大挪移的动作。
三、总结
我的梦想就是 F5一下,啥ollvm、Tigress混淆都是渣渣。
D810给我们提供了一个非常经典的样例,仔细分析分析它。你的F5从此不一样了。
摔倒了爬起来,赶快走,别心疼摔倒的那个坑
TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,
关注微信公众号: 奋飞安全,最新技术干货实时推送