阅读量:
OD 常见汇编指令知识小结
关于寄存器
- EAX: 扩展累加寄存器
- EBX: 扩展基址寄存器
- ECX: 扩展计数寄存器
- EDX: 扩展数据寄存器
- ESI: 扩展来源寄存器
- EDI: 扩展目标寄存器
- EBP: 扩展基址指针寄存器(主要用于栈和栈帧)
- ESP: 扩展堆栈指针寄存器(指向当前进程中的栈空间地址)
- EIP: 扩展的指令指针寄存器(总是指向下一条要被执行的指令)
- 寄存器大小均为32位(4个字节),可以容纳数据0-FFFFFFFF(无符号数)
- 除了 EBP ESP EIP 以外,其他的寄存器可以随意使用
关于“call”指令
- call XXX; 等于 push eip;然后jmp xxx
- call有以下5种方式
- call 404000h ;直接跳到函数或过程的地址
- call eax ;函数或过程地址存放在eax
- call dword ptr [eax]
- call dword ptr [eax+5]
- call dword ptr [<%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, [404000] ; 将eax和404000地址处的dword型数据相比较并同上置位
- cmp [404000], eax ; 同上
关于标志位
- 所有的标志位归并于一个32位的标志位寄存器, 也就是说有32个不同的标志位
- 每个标志位有两个属性:置1或置0
- 逆向中,真正需要关注的标志位一般是Z/O/C
- Z标志位(0标志),这个标志位是最常用的,运算结果为0时候,Z标志位置1,否则置0
- O标志位(溢出标志),在运行过程中,如操作数超出了机器能表示的范围则称为溢出,此时OF位置1,否则置0
- C标志位(进位标志),记录运算时从最高有效位产生的进位值。例如执行加法指令时,最高有效位进一时置1,否则置0.
关于逻辑运算
operation |
src |
dest |
result |
AND |
1 |
1 |
1 |
(与) |
1 |
0 |
0 |
|
0 |
1 |
0 |
|
0 |
0 |
0 |
OR |
1 |
1 |
1 |
(或) |
1 |
0 |
1 |
|
0 |
1 |
0 |
|
0 |
0 |
0 |
XOR |
1 |
1 |
0 |
(异或) |
1 |
0 |
1 |
|
0 |
1 |
1 |
|
0 |
0 |
0 |
NOT |
0 |
N/A |
1 |
|
1 |
N/A |
0 |
关于 “text”指令
- text指令格式:text dest, src
- 这个指令和and指令一样,对两个操作数进行按位的‘与’运算,唯一不同之处时不将‘与’的结果保存到dest
- 即本指令对两个操作数的内容均不进行修改,仅是在逻辑与操作后,对标志位重新置位
- text实战形态99%是:text eax, eax (如果eax的值为0,则Z的标志位置1)
关于条件跳转指令
指令 |
条件 |
ja ! |
CF=0 and ZF=0 |
jab |
CF=0 |
jb ! |
CF=1 |
jbe |
CF=1 or ZF=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 的“ / ”可以查看所有打过的补丁
PE文件头常见问题
- 摁菜单上的M进入内存界面,按菜单上的C返回
- SizeOfCode一般不会很大
- SizeOfInitializedData一般不会很大
- SizeOfUninitializedData一般不会很大
- AddressOfEntryPoint一般不会很大
- BaseOfCode一般不会很大
- BaseOfData一般不会很大
- ImageBase(基址)可做为以上数据的参考
- 头文件空间特别大是因为NumberOfRvaAndSizes过大,NumberOfRvaAndsizes的值一般为10(即为十进制的16)
- Export Table address 为输出表地址,若一个程序不是一个动态链接库,没有输出,则 Export Table address 的值应为0
- Export Table size 为输出表尺寸,若一个程序不是一个动态链接库,没有输出,则 Export Table size 的值应为0
关于“SEH”
- SEH(Structured Exception Handling),即 结构化异常处理
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo!