sub_E90代码分析
今天分析到case 151、case 152卡了,没有做上匹配,先来说一下我的理解。
1 | .text:0000000000000EF3 movzx eax, word ptr [rbx+22h] |
EAX和AX存在某种联系,EAX与AX不是独立的,EAX是32位的寄存器,而AX是EAX的低16位。
举例来说mov eax, FFFFFFFEh,那么AX将会是eax的低16位,也就是FFFEh。
而如果此时mov ax,3344h,那么eax的值将变为FFFF3344h,所以对ax的赋值是会影响eax的。
同样,AH是ax的高8位,而AL是ax的低8位,这就是说ah为33h,al为44h。
在EFE处,将ax的数据传送给edx,之后和7FFDh作比较,不低于7FFDh就直接退出了。接下来操作数和39比,不等于跳loc_139F,两种情况做的处理形式差不多。我猜想此功能是对操作数做一个if-else处理,但如果是这样的话就是一个复合的汇编指令了,或者是我没见过的汇编指令,还需要继续查资料。
其他辅助解题的资料
虚拟寄存器
VMRE共有40个寄存器,包括5个段寄存器、5个指针寄存器、10个通用寄存器、 10个双精度寄存器和10个单精度寄存器,如图I所示 。其中,段寄存器把地址空间划分成不同的地址段 ;指针寄存器用来记录指令地址和保存堆栈地址的,例如 :IP是指令指针 ;SP是堆栈指针 ;BP是基址指针;通用数据寄存器是用来存储64位整型数的;双精度寄存器是用来存储64位双精度的浮点数;单精度寄存器是用来存储32位单精度的浮点数。
虚拟内存的设计和管理
在VMRE设计中,通过一个字符串指针来开辟一块连续的内存地址作为虚拟 内存空间,存储程序的字节码指令。由于在32位机器上无法提供这么多的物理内存,因此VMRE采用先预读后分配的原则来开辟 虚拟内存,即先对字节码文件的大小进行预读,根据其大小再从物理内存中分配足够的内存作为虚拟内存 ,如果剩余的物理内存无法满足需要 ,则退出该次分配。