原文:https://ricardonarvaja.info/WEB/IDA DESDE CERO/

实验材料:https://github.com/aprz512/reversing-with-ida-pro-from-scratch

在这个 IDA 系列教程中,会由浅入深地讲解包括:IDA基本操作、静态及动态逆向分析、脱壳破解、漏洞开发等。

以 windows 程序为例(x86汇编)。

将会比较少的介绍基础知识,如果遇到不能理解的可看前一个系列与《CSAPP》。

MOV

以 VEViewer.exe 为例。

.text:0042F302 A1 50 FC 46 00                mov     eax, dword_46FC50
.text:0042F307 8B 50 0C                      mov     edx, [eax+0Ch]
.text:0042F30A 8D 4C 90 14                   lea     ecx, [eax+edx*4+14h]
.text:0042F30E 8B 50 08                      mov     edx, [eax+8]
.text:0042F311 56                            push    esi
.text:0042F312 8B F0                         mov     esi, eax
.text:0042F314 51                            push    ecx
.text:0042F315 8D 44 90 14                   lea     eax, [eax+edx*4+14h]
.text:0042F319 50                            push    eax
.text:0042F31A B9 50 FC 46 00                mov     ecx, offset dword_46FC50

看第一行与最后一行的 mov 指令的区别。

mov     eax, dword_46FC50

是将 0x46FC50 地址上储存的内容放入 eax。

mov     ecx, offset dword_46FC50

是将 0x46FC50 放入 ecx。

因此在 IDA 中,地址前面有 OFFSET 这个词时,指代的是这个地址本身的数值,而没有 OFFSET 这个词时,指代的是这个地址上存储的内容。

mov edx, [eax+8] 这种有方括号的也是表示取地址内容的意思(将地址为 eax+8 处的内容放到 edx 里面)。

XCHG

XCHG A, B 指令将 A 与 B 的值互换。

栈指令

PUSH 将一个对象保存在栈的顶部(压栈)。