原文:https://ricardonarvaja.info/WEB/IDA DESDE CERO/
实验材料:https://github.com/aprz512/reversing-with-ida-pro-from-scratch
在这个 IDA 系列教程中,会由浅入深地讲解包括:IDA基本操作、静态及动态逆向分析、脱壳破解、漏洞开发等。
以 windows 程序为例(x86汇编)。
将会比较少的介绍基础知识,如果遇到不能理解的可看前一个系列与《CSAPP》。
以 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 A, B 指令将 A 与 B 的值互换。
PUSH 将一个对象保存在栈的顶部(压栈)。