解密调试笔记3
OD使用教程3关于寄存器
寄存器就好比是CPU身上的口袋,方便CPU随时从里边拿出需要的东西来使用。今天的程序中我们涉及到九个寄存器:
- EAX:扩展累加寄存器
- EBX:扩展基址寄存器
- ECX:扩展计数寄存器
- EDX:扩展数据寄存器
- ESI:扩展来源寄存器
- EDI:扩展目标寄存器
- EBP:扩展基址指针寄存器
- ESP:扩展堆栈指针寄存器
- EIP:扩展的指令指针寄存器
这些寄存器的大小是32为(4个字节),他们可以容纳数据从0-FFFFFFFF(无符号数),除了一下三个寄存器,其他我们都可以随意使用:
- EBP:主要是用于栈和栈帖。
- ESP:指向当前进程的栈空间地址。
- EIP:总是指向下一条要被执行的指令。
call指令
call xxx;等于push eip;然后jmp xxx;
call有以下几种方式:
- call:404000h;直接跳到函数或过程的地址
- call eax;函数或过程地址存放在eax
- call dword ptr
- call dword ptr
- call dword ptr[<&API>];执行一个系统API
关于系统API
系统所提供的函数,所以要通过API才能实现对内核的操作;
关于mov指令
mov指令格式:mov dest,src
这是一个很容易理解的指令,mov指令将src的内容拷贝到dest,mov指令总共有以下几种扩展:
- movs/movsb/movsw/movsd edi,esi:这些变体按串/字节/字/双字为单位将esi寄存器指向的数据复制到edi寄存器指向的空间。
- movsx符号位扩展,byte->word,word->dword(扩展后高位全用符号位填充),然后实现mov。
- movzx零扩展,byte->word,word->dword(扩展后高位全用0填充),然后实现mov。
关于cmp指令
cmp指令格式:cmp dest,src
cmp指令比较dest和src两个操作数,并通过比较结果设置C/O/Z标志位。
cmp指令大概有以下几种格式:
- cmp eax,ebx;如果相等,Z标志位置1,否则0.
- cmp eax,;将eax和404000地址处的dword型数据相比较并同上置位。
- cmp,eax;同上。
标志位
事实上所有的标志位归并与一个32位的标志寄存器,也就是说有32个不同的标志位。
每个标志位有两个属性:置1或置0,就相当于我们平时说的ok或不ok。
在逆向中,只要修改cmp指令中的三个:Z/O/C。
- Z标志位(0标志),这个标志位是最常用的,运算结果为0时候,Z标志位置1,否则置0;
- O标志位(溢出标志),在运行过程中,如操作数超出了机器能表示的范围则成为溢出,此时OF位置1,否则置0;
- C标志位(进位标志),记录运算时从最高有效位产生的进位值。例如执行加法指令时,最高有效位有进位时置1,否则置0。
关于test指令
test指令格式:test dest,src
这个指令和and指令一样,对两个操作数进行安慰的‘与’运算,唯一不同之处是不将‘与’的结果保存到dest。
即本指令对两个操作数的内容均不进行修改,仅是在逻辑与操作后,对标志位重新置位。
关于条件跳转指令
条件跳转指令,就是根据各种不同标志位的条件判断是否成立,条件成立则跳转。
ja CF=0 and ZF=0
jab CF=0
jb CF=0
jbe CF=1
jc CF=1
jcxz CX=0
je ZF=1
jecxz ECX=0
jg ZF=0 and SF=OF
jge SF=OF
jl SF!=OF
jle ZF=1 and SF!=OF
jmp 无条件跳转
jna CF=1 or ZF=1
jnae CF=1
jnb CF=0
jnbe CF=0 and ZF=0
jnc CF=0
jne ZF=0
jng ZF=1 or SF!=OF
jnge SF!=OF
jnl SF=OF
jnle ZF=0 and SF=OF
jno OF=0
jnp PF=0
jns SF=0
jnz ZF=0
jo OF=1
jp PF=1
jpe PF=1
jpo PF=0
js SF=1
jz ZF=1
patch
patch也就是我们平时所说的补丁。
所谓给程序打补丁就是我们队程序破解所进行的修改。
ollyDBG的“/”可以查看所有打过的补丁。
页:
[1]