OllyDebug调试技巧(二)

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

最后两个可以作出这种判断的原因是,溢出的本质问题:

两数同为正,相加,值为负,则说明溢出

两数同为负,相加,值为正,则说明溢出

故有,正正得负则溢出,负负得正则溢出

原文地址:https://www.cnblogs.com/maplewan/p/3242145.html