目录
  1. 1. OD 常见汇编指令知识小结
    1. 1.1. 关于寄存器
    2. 1.2. 关于“call”指令
    3. 1.3. 关于“mov”指令
    4. 1.4. 关于“cmp”指令
    5. 1.5. 关于标志位
    6. 1.6. 关于逻辑运算
    7. 1.7. 关于 “text”指令
    8. 1.8. 关于条件跳转指令
    9. 1.9. patch
    10. 1.10. PE文件头常见问题
    11. 1.11. 关于“SEH”
OD常见汇编知识总结

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),即 结构化异常处理
文章作者: Sakura式
文章链接: http://yoursite.com/2020/09/18/OD%E5%B8%B8%E8%A7%81%E6%B1%87%E7%BC%96%E7%9F%A5%E8%AF%86%E6%80%BB%E7%BB%93/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo
打赏
  • 微信
  • 支付寶