《逆向工程核心原理》--- 逆向分析Hello World 程序
OllyDbg 使用
面板介绍
2.反汇编窗口
反汇编面板窗口显示被调试程序的代码,它有4个列,分别是地址(address),机器码(hex dump),反汇编代码(disassembly),注释(comment)。最后一列注释栏显示相关API参数或运行简表,非常有用。
address列:显示相对被单击地址的地址,再次双击返回到标准地址模式。
hex dump列:设置或取消无条件断点,对应的快捷键是F2。
disassembly列:条用汇编器,可直接修改汇编代码。
comment列:允许增加或编辑注释,对应的快捷键是“;”键。
3.寄存器面板
这里显示CPU各寄存器的值,支持浮点,MMX和3DNow!寄存器,可以单击鼠标右键或单击窗口标题切换显示寄存器的方式
4.信息面板
动态跟踪时,显示与指令相关的各寄存器值,API函数调用提示和跳转提示信息
5.数据面板
以十六进制和字符方式显示文件在内存中的数据,要显示数据可点击鼠标右键“go to expression”命令或按“Ctrl+G”键打开地址窗口,输入地址
6.堆栈面板
显示了堆栈的内容,即ESP指向地址的内容,堆栈窗口非常重要,各API函数和子程序等都利用它传递参数和变量等
基本调试方法
OllyDBG 有三种方式来载入程序进行调试
- 一种是点击菜单 文件->打开 (快捷键是 F3)来打开一个可执行文件进行调试,
- 另一种是点击菜单 文件->附加 来附加到一个已运行的进程上进行调试。注意这里要附加的程序必须已运行
- 第三种就是用右键菜单来载入程序(不知这种算不算)。一般情况下我们选第一种方式。比如我们选择一个 test.exe 来调试,通过菜单 文件->打开 来载入这个程序
调试中我们经常要用到的快捷键有这些:
F2:设置断点,只要在光标定位的位置(上图中灰色条)按F2键即可,再按一次F2键则会删除断点。(相当于 SoftICE 中的 F9)
F8:单步步过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码。(相当于 SoftICE 中的 F10)
F7:单步步入。功能同单步步过(F8)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。(相当于 SoftICE 中的 F8)
F4:运行到选定位置。作用就是直接运行到光标所在位置处暂停。(相当于 SoftICE 中的 F7)
F9:运行。按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。(相当于 SoftICE 中的 F5)
CTR+F9:执行到返回。此命令在执行到一个 ret (返回指令)指令时暂停,常用于从系统领空返回到我们调试的程序领空。(相当于 SoftICE 中的 F12)
ALT+F9:执行到用户代码。可用于从系统领空快速返回到我们调试的程序领空。(相当于 SoftICE 中的 F11)
调试Hello.exe程序
源程序:
1 #include "windows.h" 2 3 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) 4 { 5 MessageBox( NULL, TEXT("Hello,world!"), TEXT("MessageBox"), 0 ); 6 7 return 0; 8 }
入口点:
入口处EntryPoint: 是windows可执行文件的代码入口处,是执行程序的起始位置
继续跟踪执行:
1.push ebp;保存ebp内容以便调用完后恢复;此时esp <- esp - 4;
2.move ebp esp; 保存调用前栈顶地址以便调用完后恢复 此时,esp ebp 都指向栈顶,esp作为段寄存器访问堆栈段,ebp作为基址寄存器访问堆栈段中的堆栈帧即稍后要分配的 0x4c个字节;
3.sub esp 40 即2里面所说的给调用函数分配0x40字节的局部变量空间堆栈帧;
4. push ebx push esi push edi ;传参
5.LEA EAX, DWORD PTR SS:[EBP-40] 取 DWORD PTR SS:[EBP-40]的地址送到EAX中, 即将地址SS:[EBP-40]送到EAX中(执行后, EAX中的值是SS:[EBP-40])
6.ecx寄存器的值为10h
7.eax为初始化值0ccccccccch
8.rep stos:实际上就是把初始化开辟的空间,初始值为eax寄存器内的值0CCCCCCCCh,
从edi开始(edi保存的esp的位置),向高地址的部分进行字节拷贝,每一次拷贝4个字节。
拷贝的内容就是eax的内容,拷贝次数为10h次