首页
社区
课程
招聘
[原创]通过编译优化进行VMP代码还原
2017-5-13 14:40 22857

[原创]通过编译优化进行VMP代码还原

2017-5-13 14:40
22857
收藏
免费 2
打赏
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  CCkicker   +1.00 2017/05/22
最新回复 (39)
雪    币: 622
活跃值: (283)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
穆恩 3 2017-5-15 00:21
26
0

发现似乎是某些插件和VMSweeper有冲突导致的。 我使用原版OD去掉其他所有插件后工作就正常了。

VMSweeper还原的代码和原始汇编已经非常接近了

不过某些寄存器还是恢复不出来。

++++++++++++++++++++++++++++++++++++
  Section a12 final
++++++++++++++++++++++++++++++++++++
004100BC: pushfd 
004100C2: test efl, 0x00000100
00410246: jnz 0x00411848
0041030F: pop rvm_0C
00410347: push ebp
0041034E: rvm_1C = esp
00410355: push esi
00410361: push edi
00410382: [rvm_1C + 0xFFFFFFFC] = 0
004103AD: esi = [rvm_1C + 8]
004103BD: eax = [rvm_1C + 0xFFFFFFFC]
004103EA: ebp = [rvm_1C + 0xFFFFFFFC]
0041041E: eax = [rvm_1C + 8]
00410433: eax = [eax * 4 + esi]
0041049C: ecx = [rvm_1C + 0x0000000C]
004104C2: eax = [rvm_1C + 0xFFFFFFFC]
004104CC: ebp = ebp * 4 + eax + 4 + eax
00410509: [eax * 4 + ecx] = ebp
0041051E: eax = [rvm_1C + 0xFFFFFFFC]
00410528: edx = eax + 1
00410565: [rvm_1C + 0xFFFFFFFC] = edx
00410580: esi = [rvm_1C + 0xFFFFFFFC]
004105A0: rvm_30 = [rvm_1C + 8]
004105C0: edx = [rvm_1C + 8]
004105DB: eax = [rvm_1C + 0xFFFFFFFC]
00410616: eax = [eax * 4 + edx]
0041069B: rvm_14 = [rvm_1C + 0xFFFFFFFC]

不过如果是简单指令的话 (比如楼上的样本)基本可以做到完美还原,很强! 

从log中可以看到VMSweeper识别出伪代码之后,也是先转化成表达式,再进行规则化简。

还可以看到推断寄存器轮转过程中的真实寄存器的过程。

很值得学习的工具。 


附上样本和VMSweeper的日志 


上传的附件:
雪    币: 781
活跃值: (1096)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
bambooqj 2017-5-15 12:16
27
0




穆恩

发现似乎是某些插件和VMSweeper有冲突导致的。 我使用原版OD去掉其他所有插件后工作就正常了。VMSweeper还原的代码和原始汇编已经非常接近了不过某些寄存器还是恢复不出来。+++++++++ ...

还是不错的.某些寄存器基本也是不用还原的.毕竟 寄存器的理解只是咱们的主观观念.用变量替代也没关系.对实际代码其实并没有什么影响.可以用任意无用寄存器替代.结合上下文其实反推  也是可以的..这个插件真的很强..但是问题也很多.复杂代码下  容易崩溃.代码太多.还原的话.要自己结合全篇  去反推语句..VMP  果然恶心的不行.觉得可以跟师傅的方法结合下  进行二次优化.其实这个给的伪码参考价值在实际应用中  不怎么大...会有很多遗漏的地方..也可能是我自己技术不到家...最好是结合他申请的代码.自己一步一步推逻辑..伪码仅供参考..

雪    币: 3099
活跃值: (1564)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MsScotch 2017-5-15 12:52
28
0
+21  zhichi
雪    币: 622
活跃值: (283)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
穆恩 3 2017-5-15 17:23
29
0
bambooqj 穆恩 发现似乎是某些插件和VMSweeper有冲突导致的。 我使用原版OD去掉其他所有插件后工作就正常了。VMSweeper还原的代码和原始 ...
VMP这个感觉完美还原汇编基本不太可能了  实在太困难  。。
就是参考各种工具的表达式  猜测推导大概的算法逻辑。
遇到细节还是得用VMP分析插件1.4的调试功能调调靠谱。。
雪    币: 60
活跃值: (2275)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
实都 2017-9-20 15:35
30
0
有价值的思路放出来不易,VMP还原这块  藏着掖着的不少
雪    币: 5
活跃值: (250)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wtyjqpaszl 2018-2-3 12:26
31
0
国内现状,没办法,很多技术还是需要去国外挖掘
雪    币: 11612
活跃值: (4363)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xie风腾 2018-2-3 13:41
32
0
多谢楼主分享哟
雪    币: 244
活跃值: (163)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
airbus 2018-4-17 13:52
33
0
进来学习下
雪    币: 163
活跃值: (426)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
covccc 2018-5-27 16:27
34
0
顶一下,技术含量很高,学习学习!
雪    币: 3712
活跃值: (1306)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
不知世事 1 2019-10-17 20:38
35
0
楼主,你好,之前也想到过类似的思路,只是想着去弄反混淆,想把混淆好的二进制文件,通过自写的反汇编器/反编译器转化到IR层面,尽量的保持语义上的不失真,然后借助于编译器优化规则进行优化;或者C层面,这个时候出来的C可能是伪C,然后借助于llvm框架自写编译器前端进行优化,现在最大问题是混淆之后反编译出来的伪C逻辑上就是错的,难以进行后面的操作;
楼主“将VMP伪指令转化成C语言变量操作的语句”这种怎么做到自动化且语义准确,编译能够通过?希望可以深入的交流一下

雪    币: 83
活跃值: (1077)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
killpy 2 2019-10-18 17:40
36
0
不知世事 楼主,你好,之前也想到过类似的思路,只是想着去弄反混淆,想把混淆好的二进制文件,通过自写的反汇编器/反编译器转化到IR层面,尽量的保持语义上的不失真,然后借助于编译器优化规则进行优化;或者C层面,这个 ...
同问啊  他说的vmp伪代码 是不是 已经在分析出vmp各种handler后  比如处理内存读取的指令handler  处理寄存器操作的handler  等等 完后把这些handler转换为c语言  最后编译优化c语言?
雪    币: 622
活跃值: (283)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
穆恩 3 2020-6-22 17:03
37
0
不好意思 太久没上了
反混淆的话直接用 IDA 将混淆代码转成伪C 逻辑确实很可能是错的。可以考虑直接在 IR 层面上做优化,比如统一转成 LLVM IR,然后用 clang 去编译。或者自己定义 IR,写 IR 的优化算法
雪    币: 622
活跃值: (283)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
穆恩 3 2020-6-22 17:06
38
0
killpy 同问啊 他说的vmp伪代码 是不是 已经在分析出vmp各种handler后 比如处理内存读取的指令handler 处理寄存器操作的handler 等等 完后把这些handler转换为c语言 ...
对的,文章中的 VMP 指令是指已经分析出 handler 之后,将  handler 转化成 C 函数调用,然后整体用编译器去优化这个 C 文件
雪    币: 622
活跃值: (283)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
穆恩 3 2020-6-22 17:07
39
0
不知世事 楼主,你好,之前也想到过类似的思路,只是想着去弄反混淆,想把混淆好的二进制文件,通过自写的反汇编器/反编译器转化到IR层面,尽量的保持语义上的不失真,然后借助于编译器优化规则进行优化;或者C层面,这个 ...
37楼
雪    币: 622
活跃值: (283)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
穆恩 3 2020-6-22 17:14
40
0

本文写于 3 年前,当时我的工作其实做的非常粗糙,只是提出一个思路。


最近 twitter 上看到有人写了还原 VMP 的工具,大体思路是汇编 -> IR -> IR 上做编译优化。 


看起来效果还很不错,但目前还没有开源。不过可以关注一下。


https://twitter.com/_can1357/status/1274486119908990976


最后于 2020-6-22 17:15 被穆恩编辑 ,原因:
游客
登录 | 注册 方可回帖
返回