一、目标

一、目标

Rolf Rolles大佬曾经说过,一图胜千言

main
1:main

一堆丑陋的 While 是没有加立白的效果,干净漂亮的 if 是加了立白的效果。

二、步骤

控制流平坦化示意图

a1
1:a1

上图是个漂亮的if else 结构。

a2
1:a2

先给每个块分配一个label标签

a3
1:a3

然后增加一个块变量,来指示应该执行哪个块。

a4
1:a4

每个块跑完之后不直接到自己的后继块,而是到主分发器块,这样漂亮的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从此不一样了。

ffshow
1:ffshow

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

100

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

100