Chinese:
1、32位寄存器要熟悉,EAX,EBX,ECX,EDX是数据寄存器,ESI和EDI是变址寄存器,这些寄存器一般可以随意使用
EAX: 扩展累加寄存器
EBX: 扩展基址寄存器
ECX: 扩展计数寄存器
EDX: 扩展数据寄存器
ESI: 扩展来源寄存器(源地址)
EDI: 扩展目标寄存器(目的地址)
2、指针寄存器EBP,ESP,EIP
EBP: 扩展基址指针寄存器
ESP: 扩展堆栈指针寄存器
EIP: 扩展的指令指针寄存器
注意这三个寄存器,EBP主要用于栈和栈帧;ESP指向当前进程的栈空间地址;EIP总是指向下一条要执行的指令。
3、栈的地址是从高地址到低地址。
4、在反汇编的过程中,经常要找Call,其实Call xxx就是push eip,然后jmp xxx,执行完就ret到Call指令所在的地址。
5、Call的几种方式
call 404000h; 直接跳到函数或过程的地址
call eax; 函数或过程地址存放在eax
call dword ptr [eax]; Call的是eax里面存的地址的值
call dword ptr [eax+5]; Call的是eax里面存的地址+5后的值
call dword ptr [<&API>]; Call一个系统api
6、在反汇编中会经常遇到Test指令,Test指令和And指令一样,对两个操作数进行位于运算,只是不将结果保存,操作后对标志位重新置位。该指令在反汇编中99%是test eax, eax(如果eax为0,则ZF位置1)......
7、在反汇编的过程中经常遇到条件跳转指令
8、在条件跳转指令前也会经常遇到cmp指令
cmp a, b
如果a-b=0, 则ZF置1
无符号时:
CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时a<b
CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时a>b
有符号时:
若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,a>b
若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为a<b
若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出a<b
若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出a>b
最后两个可以作出这种判断的原因是,溢出的本质问题:
两数同为正,相加,值为负,则说明溢出
两数同为负,相加,值为正,则说明溢出
故有,正正得负则溢出,负负得正则溢出