1.如何理解JZ OR JNZ?
Jz=jump if zero (结果为0则设置ZF零标志为1,跳转)
Jnz=jump if not zero (结果不为零(或不相等)则设ZF零标志位0,跳转)
eg.
Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器结果本身不会保存。
TEST AX,BX 与 AND AX,BX 命令有相同效果,只是Test指令不改变AX和BX的内容,而AND指
令会把结果保存到AX中。
test eax,0x4000000 //逻辑与 10000000000000000000000000000000
jnz short KGUI.5DEB7DB4 //如果eax=0x40000000 则跳转
test eax,0x80008000 //逻辑与 10000000000000001000000000000000
je short KGUI.5DEB7D99 //如果 eax 高位 和 低位 不为8 则 跳转
test逻辑与运算结果为零,就把ZF(零标志)置1;
cmp 算术减法运算结果为零,就把ZF(零标志)置1.
2.如何理解ESP?
函数内部:push 一个参数后 (当前地址)ESP=(原地址)ESP-4,相应的下面列表中需要+4.
esp+ | 函数参数 | esp- | 函数局部变量 |
---|---|---|---|
0x4 | 函数第一个参数 | 0x4 | 局部变量第一个参数 |
0x8 | 函数第二个参数 | 0x8 | 局部变量第二个参数 |
0xC | 函数第三个参数 | 0xC | 局部变量第三个参数 |
0x10 | 函数第四个参数 | 0x10 | 局部变量第四个参数 |
0x14 | 函数第五个参数 | 0x14 | 局部变量第五个参数 |
0x18 | 函数第六个参数 | 0x18 | 局部变量第六个参数 |
0x1C | 函数第七个参数 | 0x1C | 局部变量第七个参数 |
0x20 | 函数第八个参数 | 0x20 | 局部变量第八个参数 |
3.通用寄存器
通用寄存器 | |||
---|---|---|---|
EAX | 累加(Accumulator)寄存器 | AX(AH、AL) | 常用于乘、除法和函数返回值 |
EBX | 基址(Base)寄存器 | BX(BH、BL) | 常做内存数据的指针, 或者说常以它为基址来访问内存. |
ECX | 计数器(Counter)寄存器 | CX(CH、CL) | 常做字符串和循环操作中的计数器 |
EDX | 数据(Data)寄存器 | DX(DH、DL) | 常用于乘、除法和 I/O 指针 |
ESI | 来源索引(Source Index)寄存器 | SI | 常做内存数据指针和源字符串指针 |
EDI | 目的索引(Destination Index)寄存器 | DI | 常做内存数据指针和目的字符串指针 |
ESP | 堆栈指针(Stack Point)寄存器 | SP | 只做堆栈的栈顶指针; 不能用于算术运算与数据传送 |
EBP | 基址指针(Base Point)寄存器 | BP | 只做堆栈指针, 可以访问堆栈内任意地址, 经常用于中转 ESP 中的数据, 也常以它为基址来访问堆栈; 不能用于算术运算与数据传送 |
4.短跳转和长跳转 EB E9
00D298B2 /75 04 jnz Xxajh.00D298B8
00D298B4 |33D2 xor edx,edx
00D298B6 |EB 08 jmp Xxajh.00D298C0
00D298B8 |> \8B51 08 mov edx,dword ptr ds:[ecx+0x8]
00D298BB |. 2BD0 sub edx,eax
00D298BD |. C1FA 03 sar edx,0x3
00D298C0 |> 8B71 08 mov esi,dword ptr ds:[ecx+0x8]
=========================================================
00D299D8 . 3B7D 04 cmp edi,dword ptr ss:[ebp+0x4]
00D299DB . 74 04 je Xxajh.00D299E1
00D299DD . 8B3F mov edi,dword ptr ds:[edi]
00D299DF .^ EB CB jmp Xxajh.00D299AC
00D299E1 >^ E9 AAD7FFFF jmp xajh.00D27190
00D299E6 > 8DBE 54010000 lea edi,dword ptr ds:[esi+0x154]
00D299EC . 8BCF mov ecx,edi
00D299EE . E8 2DCFF9FF call xajh.00CC6920
00D299F3 . 8DAE 8C010000 lea ebp,dword ptr ds:[esi+0x18C]
直接的jmp分3种
Short Jump(短跳转)机器码 EB rel8
只能跳转到256字节的范围内
Near Jump(近跳转)机器码 E9 rel16/32
可跳至同一个段的范围内的地址
Far Jump(远跳转)机器码EA ptr 16:16/32
可跳至任意地址,使用48位/32位全指针
5.汇编中寄存器32位,低16位,高8位,低8位的理解