编辑: 会说话的鱼 | 2019-07-04 |
2 通用虚拟机结构 …又来了;
-) …好了,又该是我们打开mp3播放器的时候了;
-) 如果我们检查虚拟机的结构, 我们通常会发现一个大的循环来控制虚拟机的运转, 来模 拟一个处理器的运行,进行获取数据,解码和执行指令.HyperCrackme2使用的就是虚拟机 的常规结构:
1、 设置虚拟机运行环境(VM_Context) .
2、 进入虚拟机循环.
3、 从VM.EIP地址读取指令字节,检查指令类型以支持不同的指令类型: i. 二进制指令 ii. 一元指令 iii. 流程控制指令 iv. 特殊指令 v. 调试指令 vi. 空指令和挂起指令( 退出虚拟机 的别名)-虚拟机循环的结束
4、 跳到虚拟机循环的开始. 这个结构很容易记住.总的来看,每个虚拟机都包括以下要素: l 虚拟机的初始化块/函数. ww PDF created with pdfFactory Pro trial version www.pdffactory.com l 一个循环的函数块/函数来扫描和执行虚拟机程序的指令. l 一个通用块或函数用来解释虚拟机指令的操作码和它的参数, 寄存器, 索引方式和 其它任何虚拟机作者想放入的东东. l 一张虚拟机指令地址表, 每个代表一条指令. 它们与用来分解和执行的普通汇编指 令的微代码CPU的基本等效. l 一套宏函数,是虚拟机特有的,不太容易与汇编代码对应起来.这些指令可能很难 理解. HyperCrackme2这个例子的初始结构要素可以通过查看下面的IDA注释片段来了解: 如你所见,RESTART_VM_PROCESS是上面描述的第(2)项.反之在ja short IS_UNARY_INSTR之下的部分等效于第(3.i)项.在本段中的代码,清理寄存器,取第一 条操作码(VM.EIP指向的字节)并分析它,以选择虚拟机相应 执行单元 . 现在我们来看一个虚拟机构建部分,Setup_Binary_Instruction_Params函数,它负责 处理二进制虚拟机操作码.我们已经知道EAX包换VM_CONTEXT,我们也知道eax+8中是 我们的VM.IEP. 我想我们必须知道我们想要什么, 否则一切分析都是无用功. 我们在试图去恢复虚拟机 指令结构, 并弄清虚拟机结构的更多细节. 用于为二进制指令填充参数的过程必须知道如何 解码二进制指令,因此通过检查操作代码的字节如何生成,我们可以重建虚拟机指令格式. 我们希望找到什么呢?它主要取决于指令集的复杂度, 因此, 我们必须始终细心的查看指令 字节是如何被应用的.请记住虚拟机指令并不总是相同大小,如x86指令的大小就各不相 同… 你无法将下面的方法应用到其它虚拟机上. 每个虚拟机使用它自己的操作码和虚拟机结 构,因此,你应试图去理解那些会给重构虚拟机一些线索的代码片段. 我们来看这个代码: 这个片段应该清楚了:我们装载由我们的虚拟EIP指向的第二个字节,[eax+1],接着它 ww PDF created with pdfFactory Pro trial version www.pdffactory.com 被送到dl寄存器. 在我们做详细注释之前, 我们应该注意我们只用了一个字节产生一条指令. 我们继续吧: 这个代码段与前一个非常相似(概念上) .EAX仍然包含我们的VM.EIP地址,现在构成 操作码的第三个字节在内存中被载入和测试(只有它的高位被测试,你可以通过and/shr这对 指令可以看出).请注意接下来的指令,EDI包含我们的VM_CONTEXT指针.ECX寄存器包 好一个双字索引,它被用在VM_CONTEXT结构中,来重新获得一个双字指针,接着它被偏 移了10h,但是你是否还记得,VM_CONTEXT+10h= VM_ESP,这意味着,当ECX=0h时, 在这里我们将会得到ESP寄存器的地址.当ECX=1h直到15h(1个半位元组范围是0-15) 对应的是ESP之后的1-15个双字.于是我们立刻检测到这个二进制指令的第三个字节的可能 用法-至少是用了它的高4位.下面这个片段是如果我们在上面的JZ指令实现跳转到的区域. 如你所见,它EAX(是我们的VM.EIP)中第一个双字之后的数据取走,并把它放入EDI 中.我们知道EDI应该包含虚拟机操作指令的目的参数!这使我们知道,第一个双字被用作 操作码,第二个双字是操作码参数. 下面就是我们知道的VM_CONTEXT: 让我们继续我们的二进制操作码的分析,并试图确定VM_INSTRUCTION格式,我们已 经遇到虚拟指令+1,+2偏移的情况,我们来看最后一个,偏移+3的情况: 这个字节通过MOVSX指令被直接装入ecx,你应该已经明白我要说什么了:为什么是 MOVSX?这个字节接着被加到EDI参数上, 那是我们的目的参数: 我们为什么要给我们的EDI 参数(它包含我们的目的操作数)加上些东西?当然,这是偏移…于是我们现在重建了二进 ww PDF created with pdfFactory Pro trial version www.pdffactory.com 制指令的指令结构: 这部分,我没有评论太多,因为它是 虚拟机相关的 .