vmp3.5模拟x86分支指令je、jne、jge和jl的分析
编辑:jimmy
日期: 2024/12/24 浏览:1 次
前言
这篇文章主要是分析vmp3.5对je、jne、jge和jl分支指令的模拟。因为识别出vmp的分支指令后,可以利用符号执行或者其它的trace工具得到程序的全部路径的执行trace,然后合并这些路径重建程序混淆前的控制流图CFG,最后对控制流图进行优化应该是可以还原出与原程序语义上等价的代码。
分支指令模拟分析
x86指令的cmp实际是执行的减法操作,只是不改变操作数的值,而是程序状态寄存器eflags的值。vmp模拟的减法指令如下:
x-y = ~(~x+y)
标志位还原如下:
eflags1 : (~x+y)elfags2 : ~(~x+y)eflags = (eflags1 & 0x815) + (elfags2 & ~0x815)
为什么vmp使用0x815可以参考《VMP学习笔记之万用门(七)》这篇文章。
Jge和Jl指令分析
这里先给出根据trace构建的eflags还原的DAG表示和jge指令模拟执行的DAG表示。
图片1.png
图片2.png
以上两个DAG图都是优化过后得到的,对MBA表达式进行了处理,不然会很难看。主要优化了以下运算:
a&a = aa|a = aa|b = ~(~a & ~b)a&b = ~(~a | ~b)b = ~a, c=~b --> c=aa-b = ~(~a+b)a^b = (a|b) & (~a | ~b)~(a^b) = (a & b) | (~a & ~b)
在eflags还原的DAG中,0xfffff7ea = ~0x815,还原后的eflags值分别与0x80和0x800进行and运算,0x80和0x800对应的是sf和of标志位。分别and运算后也会产生两个eflags值,对应的是第二个DAG图里的eflags10_0和eflags12_68。