《逆向工程核心原理》--- 逆向分析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 有三种方式来载入程序进行调试

  1. 一种是点击菜单 文件->打开 (快捷键是 F3)来打开一个可执行文件进行调试,
  2. 另一种是点击菜单 文件->附加 来附加到一个已运行的进程上进行调试。注意这里要附加的程序必须已运行
  3. 第三种就是用右键菜单来载入程序(不知这种算不算)。一般情况下我们选第一种方式。比如我们选择一个 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次

 

posted @ 2020-05-17 17:49  坚持,每天进步一点点  阅读(799)  评论(0编辑  收藏  举报