一、目标
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从此不一样了。

摔倒了爬起来,赶快走,别心疼摔倒的那个坑

关注微信公众号,最新技术干货实时推送
