ollydbg设置断点经验总结
第一 寻常断点
Ollydbg中一般下中断的方法,就是在程序的地址处用鼠标选择这一行。然后按F2键,这时被选择的那一行的地址会变成别的颜色,就表示这个地址处下了中断。然后运行程序时只有到这个地址处就会被Ollydbg中断。
这个方法用的比较多,所以把他称作寻常断点。
如果有命令行插件,就可以在命令窗口中输入BPX xxxxxxxx 下断点。
优点:只要自己怀疑是重要的代码处都可以下这种下断点,不受条件的限制,所以方便实用。
缺点:如果不知道代码功能下断点具有盲目性。
第二 API断点
Ollydbg中一般下API中断的方法,有二种。
1. 在代码窗口中点鼠标右键,出现功能菜单。在[搜索]选择项下有〔当前模块的名称〕和〔全部模块的名称〕俩项,选择其中的一项就打开了程序调用API的窗口,在这个窗口中选择你要跟踪的API函数名。双击这个函数就能到程序的调用地址处。然后用F2下中断。也可以在API窗口中选择需要跟踪的函数点鼠标右键出现功能菜单,选择〔在每个参考设置断点〕。同样下了断点。
快捷方式:Ctrl+N
2. 在命令行窗口中输入BPX API函数名或者BP API函数名 后回车。这时出现了所有调用这个函数的地址的窗口,在这个窗口中可以看到调用这个API函数的地址已改变了颜色。说明下好了断点。
说明一下:BPX一般中断在程序调用API的地址处。BP会中断在API的写入地址处。二这有所不同,根据需要选择。
优点:这种方法下的断点是针对每一个API函数的,所以具有明确的目的。
缺点:关键的API函数不容易找到。所以有时下的断点没有作用。
补充:
https://stackoverflow.com/questions/43941080/stop-ollydbg-execution-breakpoint-when-entering-a-specific-module
当你的执行中断时试试这个(当 DLL 加载时停止 EXE 执行),
- Alt-E(这将显示所有已加载 dll 的列表)。
- 右键单击 dll(您想闯入),然后单击“查看名称”。
- 新窗口将打开,其中包含此 dll 导入和导出的函数名称,对“类型”列进行排序,在所有“导出”类型名称上按 F2(断点)。
现在,每次调用任何导出的函数时,您的执行都会中断。 希望这能解决您的问题。
如果您经常需要,可以使用 OllyDbg 脚本自动执行此操作。
第三 内存断点(跟踪关键数据的断点) ==》脱壳里就常用到。
Ollydbg中的内存断点相当于TRW中的bpm 断点。
下断点的方法是:在程序运行中断时选择界面中的转存窗口,用光标选择内存中的一段关键数据(颜色会改变),然后右击鼠标出现功能菜单。选择〔断点〕项,其中有二个选择〔内存访问〕和〔内存写入〕。
〔内存访问〕断点是程序运行时要调用被选择的内存数据时就会被Ollydbg中断,根据这个特点在破解跟踪时只要在关键数据内存中下中断就可以知道程序在什么地方和什么时候用到了跟踪的数据。对于一些复杂算法和流程变态的算法跟踪有很大的帮助。从破解上讲,一个注册码的生成一定是由一些关键数据或者原始数据计算来的。所以在内存中一定要用到这些关键数据。那么〔内存访问〕断点就是最好的中断方法。
〔内存写入〕断点是程序运行时向被选择的内存地址写入数据时就会被Ollydbg中断。根据这个特点在破解时可以跟踪一个关键数据是什么时候生成的,生成的代码段在那个地方。所以一个关键的数据如果不知道他的由来就可以用〔内存访问〕断点查找计算的核心。
内存中断的下断点还有另外的一种方法:程序运行时如果知道关键的数据,比如我们输入的试验码、程序生成的序列号等。这时在内存中一定存在这些数据。用Alt+M打开内存窗口,在这个窗口中搜索知道的关键数据。用光标选择这些数据同样下内存中断,这种方法更容易找的关键的数据。
优点:断点是直接面向关键数据的,所以比较容易到核心部分。
缺点:内存断点重新运行后会消失,干扰比较多。
第四 硬件断点(跟踪关键标志的断点)
硬件断点是Olldbg所特有的断点,他不会因为重新运行就销毁,只要不删除。跟踪这个程序时就有效。但他在98系统下会不起作用。
硬件断点是根据关键标志回逆到关键代码的好方法。下中断的方法和内存断点的方法相同,有三个方式〔硬件访问〕、〔硬件写入〕、〔硬件执行〕。一般用前2个。他也同样有内存断点的特性,所以可以用内存断点的地方也可以用硬件断点。这里介绍利用他来跟踪注册标志的使用方法,一般软件的注册都用到了标志比较。即在内存地址中有一个标志,在判断是不是注册时比较标志的值。不同的值表示不同的注册状态。这个标志的地址一般比较固定。根据这个特点可以下硬件断点来跟踪标志位是什么地方被标志的。
方法:在转存窗口中选择到标志存放的内存地址处,然后选择标志值。下〔硬件写入〕中断(根据标志的字节下不同的长度)。重新运行程序你会发现Ollydbg会不断的中断在这个标志的内存地址处。在功能菜单的〔调试〕选项下选择〔硬件断点〕就打开了硬件断点的窗口,在这个窗口中选择〔跟踪〕,这时转存窗口就会来到被下中断的内存地址处。运行程序跟踪内存地址中的值就会知道被赋标志的代码,跟踪到计算的核心。〔硬件访问〕的使用可以知道程序在运行时多少地方用到了这个注册标志。对于破解复杂效验的程序十分的有效。
直接在命令栏里下bh ****硬件断点
实验目的
通过本实验熟悉通过Ollydbg查找参考字符串和API调用。
实验环境
一台Windows 7系统电脑;实验工具Ollydbg 1.10汉化版、2.01原版。
实验内容和步骤
实验步骤
1.使用OD查找参考字符串
用OD打开CLINE95.EXE测试程序。
观察OD左下角信息提示窗口中的提示信息与OD右下角状态窗口中的信息,单击Shift+F9忽略程序异常,直到提示信息为“程序入口点”,说明OD已经进入需要调试的程序CLINE95.EXE的代码了。
此时单击F9运行CLINE95.EXE程序,可以看到主界面如下:
可以看到CLINE95.EXE程序的主界面有很多英文字符串(例如Command Line95、Version 1.0、Joshua Seales等等),本书目标就是学会使用OD来查找这些字符串,并利用这些字符串来帮助理解整个程序的程序逻辑。最终掌握了整个程序的逻辑之后,就可以利用OD来更改程序的逻辑,以达到想要的目的(功能破解、注册破解、打补丁、加入恶意代码等等)。
回到OD的CPU窗口,现在使用OD来查看CLINE95.EXE这个程序中的参考字符串。在OD的CPU窗口,右键单击选择[查找]–[所有参考文本字串]。在弹出来的参考窗口中可以清楚的看到CLINE95.EXE这个程序的所有参考字符串。
通过双击参考窗口中的字符串(或者在指定的字符串处按回车键),即可以在CPU窗口中的反汇编处跟踪到相应字符串。这样的话整个程序的逻辑,就有了大致的了解。
例如选择跟踪字符串“CLine95 WinName”,可以通过右键单击CPU窗口中反汇编代码指定字符串的那一行代码,选择[数据窗口中跟随]–[立即数]。
回到CLINE95.EXE的主界面中,单击按钮REGISTER进行注册。在弹出来的注册窗口中,随便写上注册名:123,注册号:123,来看看程序会有怎样的判定!
CLINE95.EXE弹出了错误消息框!提示注册码无效!下面来试试查找一下错误消息(“Sorry, that is an invalid registration code”)的字符串,在参考窗口中右键单击[查找文本],输入“sorry”(这里只进行模糊搜索,输入sorry即可,并且忽略大小写来进行搜索,若要精确搜索,则要输入更精确的字符串)。
在参考窗口中查找到“Sorry, that is an invalid registration code”字符串后,可以双击字符串在CPU反汇编窗口中进行跟踪。在这里,看到了引用“Sorry, that is an invalid registration code”字符串的程序代码(其实这是一个典型的消息框API函数)。
2.使用OD查找Windows API
Windows API成千上万,不必通晓每一个,只要知道在逆向工程中用的比较多的。通常有文件访问、进程/线程有关、GUI图形用户界面、对话框、异常处理机制有关。
用OD重新载入CLINE95.EXE程序,快捷键Shift+F9至运行状态。在CPU窗口中右键单击[查找]-[当前模块中的名称],就可以看到当前正在调试的程序所调用的API。
如果在CPU窗口中右键单击[查找]-[所有模块中的名称],就可以看到加载进内存的所有模块所调用的API。在弹出来的[所有名称]窗口中,可以输入API函数名来查找特定API函数。
为了缩小搜索范围,在当前模块中搜索API。在CPU窗口中右键单击[查找]-[当前模块中的名称]。例如搜索MessageBoxA,就在[模块名称]的窗口中输入messageboxa(注意此时窗口标题的字符串变化),定位到MessageBoxA后,可以右键单击该API-[查找输入函数参考]来显示CLINE95.EXE中所有调用该API的代码片段地址。