OD步过后,返回到之前某位置,重新单步执行
找到你想返回的行,
右键选择New origin here
,快捷键Ctrl+Gray *
,
然后程序会返回到这一行,再次按F7
或者F8
等执行即可
从77C3078F
再次执行
定位代码,逐行执行
对于代码量较小的程序,这种方式也是可以接受的。
方法就是一直F7
配合F8
等,直到调用我们想要的功能,
那CALL
调用的这个函数就是我们要定位的函数了。
定位代码,快速搜索
OD加载待调试程序时,会预分析过程。
此过程会查看进程内存,程序中引用的字符串和API会被摘录出来。
也可以利用这个特点快速定位。
过程如下:
1.首先用OD打开待调试的程序
2.右键, Search for
, All referenced text strings
这时候会打开R
窗口,显示搜索的结果,
3.R窗口中查询你要查询的字符串
右键
, Search for text
,输入你要查询的字符串
找到你要查找的字符串,比如Hello World!
4.双击,定位到函数
5.Dump窗口查看数据
点击下方Dump查看内存窗口,
快捷键Ctrl+G
,或者
右键Go to
, Expression
输入Hello World!
地址00A42108
,
定位代码,API检索定位,在调用代码中定位
同样利用OD预分析加载的特性,通过API实现代码定位。
用OD打开待调试的程序,然后,
右键,Search for
, All intermodular calls
,
查询结果会显示在R窗口,
你可以对API列表排序,Sort by
, Destination
然后,找到你认为是目标的那个API函数,双击,
比如,我这里就打印了一个字符串Hello World!
,API函数用的MessageBox
,我就找到这个API双击
然后,OD会定位到目标函数内部,看看是不是你要找的那个。
同样的可以在Dump窗口查看内存。
定位代码,API检索定位,API代码中定位
有时候发布的程序代码会被压缩或者保护起来,这样OD的预分析加载就废掉了,上面的方式就不能使用了。
这时候,我们需要通过对程序加载的DLL进行分析,在DLL中筛选合适的目标API,进API中下断点,然后调试。
比如还是用MessagexBox
这个API打印Hello World!
字符串,我们假设程序被压缩或者保护了。
分析下目标特征,弹窗打印了一个字符串,那这个应该是使用的MessagexBox
这个函数,这个API所在的DLL
是USER32.DLL
,那我们就从USER32.DLL下手。
打开内存映射窗口,菜单栏,View
, Memory
或者快捷键 Alt+M
找到USER32.DLL
,确认被加载到了内存,
列出所有模块中的API,点击C
窗口,右键,Search for
, Name in all modules
,结果会显示在N
窗口,
可以点击Name
按名字排序,键盘直接输入要查询的API名字,就会自动定位,
上图中显示出了含有MessageBox
字符的所有DLL,这里我们只关心USER32.DLL
,
双击MessageBoxW
(UNICODE版),跳转到函数实现代码,F2
下断点,F9
继续执行代码。
程序暂停到了API断点处,F8
单步步过执行代码,成功打印显示窗口。
左下角寄存器ESP
的值就是调用该函数的进程栈地址,这里我忘记记录了,重新模拟一遍,仅作验证。
00A41014
是返回地址,也就是CALL
调用MessageBox
后,下一条要执行的指令所在地址,那CALL
调用就是上一条真正调用MessageBox
的地址。
跟踪查看地址,Ctrl+G
红色
表示过程调用
地址,绿色
表示过程返回
地址。