求精啊俺的Vmp静态分析心得
Vmprotect 是当前应用比较广泛的代码变形工具,对代码的保护可以说相当强悍。但是计算机内没有秘密,计算机本身是一个自动机器,机器的特点是: 在机器内发生的所有事情都只能遵循既定的路线进行,x86不例外,risc 计算机也不例外, 同样 vmprotect 也不例外。所以,我准备遵循计算机的这种机器属性,来对 vmprotect 进行一次深入的分析。包括以下内容
1) pe文件代码优化,x86指令层面优化执行代码。事实证明, vmprotect 产生的 executor代码,充满了大概 2/3 的垃圾代码,包括各种jump/call/ret, 我们在分析 VmExeutor 的时候,将需要使用手段将这些代码剔除掉,留下需要的代码。
2) 寻找Vm 入口地址。Vmprotect 编译过的代码,在运行时,总需要进入 Vm 环境,每个Vm 环境都有一个或者多个入口,每个 Executor 大概有4-5个入口。
3) Vm Executor 的分析、建模简化。 我们需要从简化的最终代码中分析出解释执行变形后的代码。需要识别出VmExeutor 里面各种解密算法,找到每个opcode的handler, 每个opcode的代码长度,甚至进入/推出VmExecutor时候的寄存器映射
4) 解密 Vm byte 码的读出(dump)。原始的x86代码,经过vmprotect 编译后,变成只有 vm-executor 执行的 byte-code, 在这一步,我们将这些byte-code 全部读出来。
5) Vm byte code 的简单优化,我们发现 Vmprotect 产生的 byte-code 也是经过垃圾填充的,这一步,我们在 byte-code层,将垃圾代码剔除,将byte-code 简化,便于后面的分析
6) Vm byte-code -> x86 代码的转换,其中包括指令模式匹配,中间代码生成,入口寄存器映射,以及最后目标代码生成/优化的工作
7) 回收Vmprotect 占用的 .text 段数据,写入最终还原的代码
这其中,需要用到的计算机基础知识: 需要清楚PE格式,x86反汇编,编译原理的代码生成原理,代码优化原理(data-flow, control-flow), 编写 Vm-Executor 模拟器。当然,还需要必要的程序能力,我选择的是C#
