Tan's Blog.

304Challenge:代码分析4

字数统计: 659阅读时长: 2 min
2019/04/30 Share

sub_E90代码分析

今天分析到case 151、case 152卡了,没有做上匹配,先来说一下我的理解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.text:0000000000000EF3                 movzx   eax, word ptr [rbx+22h]
.text:0000000000000EF7 add eax, 0FFFFFFFEh
.text:0000000000000EFA mov [rbx+22h], ax
.text:0000000000000EFE movzx edx, ax
.text:0000000000000F01 cmp edx, 7FFDh
.text:0000000000000F07 jnb loc_13CF
.text:0000000000000F0D rol di, 8
.text:0000000000000F11 mov [rcx+rdx], di
.text:0000000000000F15 cmp byte ptr [r15], 27h
.text:0000000000000F19 jnz loc_139F
.text:0000000000000F1F movzx eax, word ptr [r15+2]
.text:0000000000000F24 rol ax, 8
.text:0000000000000F28 add [rbx+1Eh], ax
.text:0000000000000F2C jmp loc_EA6

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采用先预读后分配的原则来开辟 虚拟内存,即先对字节码文件的大小进行预读,根据其大小再从物理内存中分配足够的内存作为虚拟内存 ,如果剩余的物理内存无法满足需要 ,则退出该次分配。

CATALOG
  1. 1. sub_E90代码分析
  2. 2. 其他辅助解题的资料