5.继续补充,常用操作指令:
Ctrl+G Go to 移动到指定地址,用来查看代码或内存,运行时不可用
F4 Execute till Cursor 执行到光标位置,即直接转到要调试的地址
; Comment 添加注释
User-defined comment 鼠标右键菜单Search for User-defined comment
: Label 添加标签
User-defined label 鼠标右键惨淡Search for User-defined label
F2 Set/Reset BreakPoint 设置或取消断点(BP)
F9 运行(若设置了断点,则执行至断点处)
* 显示当前EIP(命令指针)位置
- 显示上一个光标的位置
Enter 若光标处有CALL/JMP等指令,则跟踪并显示相关地址(运行时不可用,简单查看函数内容时非常有用)
6.Basecamp 四种方式,直接到想去的位置。
(1)Goto(Ctrl+G),打开Enter expression to follow(输入跟踪表达式)对话框。
(2)设置断点,BP(Break Point,断点)(快捷键F2)。
程序在OD里加载起来的时候,直接F9跑起来,会自动卡到断点处的。
ALT+B 可以打开Breakpoints对话框,列出代码设置的断点。
(3)注释,快捷键 ; ,右键Search for-User defined comment 可以查看注释列表,可以进行跳转。
(4)标签,在制定地址添加特定名称。快捷键 : 类似上面Search for-User defined labels
6.快速查找制定代码的四种方法
目标查找main()中的MessageBox() API调用
(1)方法一,无脑执行所有,就是一步一步的看,肯定有一步是调用这个的。额,这个的话没啥好说的,只能说大多数时候,不采取窍门,这么弄会疯。耗时。
(2)定位字符串,这个比较常用。右键 查找所有文本字符串。
双击直接跳到调用地址,其实直接找到了MessageBox()
此时正要把HelloWorld这个字符串地址压入栈,当参数呢。下面紧接着就call这个函数了。
(3)API检索法-1:在调用代码中设置断点
右键菜单-Search for - All intermodular calls 看所有API调用,注意MessageBox是在user32里面的。
双击直接跳转到调用的位置。
(4)API检索法-1:在API代码中设置断点
右键 Search for - Name in all calls
对于了调用的各个dll中的导出函数(对压缩器和保护器处理过的可能看不到)
找到MessageBoxW双击
留意地址,其实这个已经和之前的程序不再一个范围内了,这个是Windows为了节省开销做处理之后的结果,很多系统dll,大家共同加载一个。如果需要特别的修改什么的会自动触发copy-on-write机制。双击MessageBoxW之后,跳到这个函数内存,然后F2下一个断点。
7.修改Hello World!字符串(两种方法)
直接修改字符串缓冲区(buffer)/在其他内存区域生成字符串并传递给消息函数
(1)直接修改字符串缓冲区
Ctrl+F2重新调试程序。
然后直接右键超找所有字符串,找到HelloWorld字符串,双击。看到地址
在内存区域Ctrl+G跳到这个地址(VA)
选上一个范围,然后Ctrl+E 修改字符串
然后F9跑起来,看到输出内容变了。注意此时只是改了内存。PE文件本身还没有改,如果重新执行的话内存会被重新加载成之前的。所以要把当前修改的内容同步到PE文件里面去。
继续,在地址区域右键 Copy to executable file
继续右键,保存可执行文件。A.exe.然后双击就好了。
(2)在其他内存区域新建字符串并传递给消息函数。
先跳到之前字符串的位置,看下:
发现有好多空的地方。在这里面直接开始存一段
然后把MessageBox调用Push参数的时候的那个地址直接改成自己的这个新地址上面的那个图的话就是01102148
然后F9跑起来,结果是下面这样。
但是这个地方目前没有办法直接右键保存修改,因为保存之后也执行不了,涉及到地址偏移问题。这个之后说。
同时对于方案1的话容易出现的问题就是你修改的字符串如果比之前的长,而同时之前字符串数据后面是紧跟着存东西的这种,就会破坏掉后面的数据。所以一定要小心。对于第二种方式,也不是所有位置都随便写内容的。这个后期细说。但要注意这个问题。