快速查找指定代码的四种方法

前言:

在《核心工程逆向原理》中看到的,记录一下,所有流程都是以Hello World.exe为例

正文:

1.代码执行法

注:仅适用于被调试的代码量不大、且程序功能明确的情况
原理:程序功能非常明确时,逐条执行指令来查找所需查找的位置

2.字符串检索法

鼠标右键菜单–Search for–All referenced text strings
当OD载入程序时,会经历一个预分析过程。这个过程中,程序中被引用的字符串和被调用的API都会被摘录出来,整理至另外一个列表中。
使用All referenced text strings命令会弹出一个窗口,其中列出了程序代码所引用的字符串,如图:
快速查找指定代码的四种方法
地址401007处的PUSH 004092A0命令即是引用字符串"Hello World"。双击字符串,光标会定位到main()函数中调用MessageBoxW()函数的代码处。
在Dump窗口使用Go to(Ctrl+G)命令,可以进一步查看内存4092A0地址处的字符串,如下图:
快速查找指定代码的四种方法

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

鼠标右键菜单–Search for–All intermodular calls
原理:在Windows编程中,如果想向显示器显示内容,则需要使用Win32 API想OS请求显示输出。简而言之,就是需要程序内部调用Win32 API。通过推测用到的API来定位地址
快速查找指定代码的四种方法
可以看到调用MessageBoxW()的代码,该函数位于40100E地址处,双击它,定位到调用它的地址处,可以找到"Hello World"
快速查找指定代码的四种方法

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

鼠标右键–Search for–Name in all modules
注:OD并不能把所有文件的API函数调用列表都列出。当使用压缩器/保护器工具对可执行文件进行压缩和保护之后,文件的结构就会发生改变,此时OD就无法列出API的调用表(甚至调试都会非常困难)。
原理:这种情况下,DLL代码库被加载到进程内存后,我们可以直接向DLL代码库添加断点。
OD菜单栏下选择View-Memory菜单(快捷键Alt-M),打开内存映射窗口,可以看到其中显示的一部分"Hello World"和USER32库被加载的内存,如图:
快速查找指定代码的四种方法
使用OD的Name in all modules命令可以列出被加载的DLL库文件中所有的API,通过键盘敲出MessageBoxW,光标会自动定位至MessageBoxW所在位置
快速查找指定代码的四种方法
双击MessageBoxW函数后,就会显示其代码
快速查找指定代码的四种方法
F2设置断点,F9执行至断点,查看进程栈可以了解到,MessageBoxW在0040100E地址处被调用,且执行完毕后返回401014地址处

快速查找指定代码的四种方法
F2把断点取消,Ctrl+F9运行至RETN,F7返回041014地址处,其上方就是调用MessageBoxW函数的地方
快速查找指定代码的四种方法

总结:

第四种方法我还是搞不明白,所出现的地址与书上不符,不知道因为什么…