《逆向工程核心原理》一书中win32程序Hello World!.exe为例
调试代码时,main函数并不直接位于可执行文件的EP位置上,出现在此的是编译器生成的启动函数。我们需要查看的main哈数距离EP代码很远,这里有一些方法可以帮助我们快速查找到main函数,每个人在调试中快速查找所需要码时都有不同方法,但是归结起来最基本最常用的方法只有4种。

一、代码执行法

我们需要查找的是main函数中调用MessageBox函数的代码。一路F8,在某个时刻弹出消息对话框,此时Ctrl+F2再次载入并重新调试,如此重复直到 找出关键的函数调用指令,之后F7进入函数即为所要查找的main函数
注:Win32应用程序中。API哈数的参数是通过栈传递的。VC++中默认字符串是使用Unicode码表示的,并且,处理字符串的API函数也全部变更为Unicode系列函数。
_

二、字符串检索法

OD初次载入待调试的程序时,都会先经历一个预分析过程。此过程中会查看进程内存,程序中引用的字符串和调用的API函数都会被摘录出来,整理到另外一个列表中,这样的列表对调试时相当有用的。鼠标右键菜单-Search for-All referenced text strings
找到地址后,在OD中的Dump窗口中使用Go to(Ctrl+G)命令,可以进一步查看位于该内存地址处的字符串。
注:VC++中,static字符串会被默认保存为Unicode码形式,static字符串是指在程序内部被硬编码(Hard Coding)的字符串。
需注意4092A0这个地址,该地址与我们之前看到的代码区块地址(401XXX)不同。Hello World.exe进程中,409XXX地址空间被用来保存程序使用的数据。代码与数据所在的区块是彼此分开的。

三、API检索法(1):在调用代码中设置断点

鼠标右键菜单-Search for-All intermodular calls
Windows编程中,若想向显示器显示内容,则需要使用Win32API向OS请求显示器输出。换言之,应用程序向显示器画面输出内容时,需要在程序内部调用Win32 API,若能进一步查找到调用的Win32 API,则会为程序调试带来极大便利。以HelloWorld.exe为例,它在运行时会弹出一个消息窗口,由此我们可以推断出该程序调用了user32.MessageBoxW() API。
在OD的预分析中,不仅可以分析出程序中使用的字符串,还可以摘录出程序运行时调用的API函数列表。若只想查看程序代码中调用了哪些API函数,可以直接使用All intermodular calls命令。
观察一个程序的行为特征,若能事先推测出代码中使用的API,则使用上述方法能够帮助我们快速查找到需要的部分。

四、API检索法(2):在API代码中设置断点

鼠标右键菜单-Search for-Name in all modules
OD并不能为所有可执行文件都列出API函数调用列表。使用压缩器/保护器工具对可执行文件进行压缩或保护之后,文件结构就会改变,此时OD无法列出API调用列表了,甚至连调试都将变得十分困难。
注:压缩器/保护器=压缩壳/保护壳
这种情况下,DLL代码库被加载到进程之后可以直接向DLL代码库添加断点。在OD菜单栏中依次选择View-Memory菜单(快捷键Alt+M),打开内存映射窗口。使用OD中的Name in all modules命令可以列出被加载的DLL文件中提供的所有API。使用Name in all modules命令打开All names窗口,单击Name栏目按名称排序,通过键盘敲出MessageBox W后,光标自动定位到MessageBox W上。
USER32模块中有一个Export类型的MEssageBox W函数,实现于USER32.dll库中。
观察MessageBox W函数的地址空间可以发现,它与HelloWorld.exe使用的地址空间完全不同。在函数起始地址上按F2键设置好断点之后按F9继续执行。若程序中调用了MessageBox W() API,则调试时程序运行到该处就会暂停。
程序的main()函数调用完MessageBox W函数后程序执行流将返回到对应的返回地址处。按Ctrl+F9快捷键使程序运行到MessageBox W函数的RETN命令处,然后按F7键也可以返回到返回地址处。