吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 5041|回复: 73

[汇编] 3.2 OD 中的断点及跟踪功能

  [复制链接]
大飞哥自习室 发表于 2022-3-25 10:37 | 显示全部楼层 |阅读模式


在调试器中有两个很重要的功能,分别是跟踪执行反汇编代码和设置断点。在第2章的内容中,笔者在介绍汇编指令的同时,已经向读者简单介绍过单步跟踪执行代码方法,本节首先介绍的是OD设置断点的方法,然后再介绍OD中关于跟踪的方法。
断点是调试者使用调试器调试程序时的重要功能,通过设置断点调试者可以使一个进程(进程中的所有线程)的执行暂停在设置断点的位置上,当程序被中断后调试者可以对程序中的反汇编代码、寄存器、栈、内存等线程的上下文环境进行观察和分析,并使用单步来执行线程,使得可以动态地了解代码的执行流程及各个关键寄存器或数据结构的变化。
通常调试器会提供软件断点、硬件断点和内存断点等几种基本的断点类型。OD调试器同样也具备这三种设置断点的方式。下面介绍OD中设置断点的各种方式。
3.2.1  OD中设置断点的方法
断点是调试器的重要功能,OD为调试者提供有多种设置断点的方法。本节主要介绍OD调试器常用的设置断点的方法。
1.软件断点
软件断点是OD中最常使用的断点。在前面介绍OD中的子窗口时介绍过“断点窗口”,“断点窗口”中管理的断点即是软件断点。
(1)普通操作
在反汇编窗口中选中要设置断点的反汇编指令行并按下F2键就可以设置一个软件断点,也可以双击反汇编窗口中的“十六进制数据列”来设置软件断点。设置了软件断点的反汇编指令行的“地址列”会变成红色高亮。在已经设置软件断点的反汇编地址处再次按F2键或者双击“十六进制数据列”,则软件断点被取消。由于在OD中设置断点使用F2快捷键,所以也经常称其为F2断点。
(2)命令操作
除了使用F2快捷键设置断点以外,也可以使用通过在命令插件中输入命令来管理软件断点。
使用bp命令可以设置一个软件断点,通过bc命令可以删除一个已经设置的软件断点。通过bp设置的软件断点同样可以在“断点窗口”中进行查看。通过命令设置软件断点的方便之处在于可以对API函数直接设置断点,有时为了避免检测,也会在API的其他偏移处设置断点。
使用命令设置软件断点如图3-13、图3-14和图3-15所示。

QQ截图20220325102930.jpg
2.硬件断点
硬件断点的原理和软件断点的原理不同,硬件断点依赖CPU中的调试寄存器。调试寄存器一共有八个,其中有4个用于设置断点,因此硬件断点的数量只有4个。
硬件断点可以使用右键菜单也可以使用命令来进行设置。
(1)菜单操作
在CPU窗口的反汇编窗口或数据窗口单击鼠标右键,在弹出的菜单中找到“断点”菜单项,可以看到相应的设置硬件断点的子菜单项,如图3-16和图3-17所示。

QQ截图20220325103013.jpg
从图3-16和图3-17可以看出,在反汇编窗口中设置硬件断点,只能设置“硬件执行”断点。在数据窗口中可以设置“硬件访问”“硬件写入”和“硬件执行”3种类型的硬件断点,并且在“硬件访问”和“硬件写入”类型的断点可以分别设置长度为“字节”“字”和“双字”的硬件断点。
22.jpg
(2)命令操作
硬件断点也像软件断点那样可以通过命令插件来设置,与硬件断点相关的命令包含HE、HW、HR和HD。其中,HE表示硬件执行断点,HW和HR表示硬件写断点和硬件读断点,HD表示删除断点。
对于断点的管理可以通过菜单项的“调试”→“硬件断点”来进行查看,如图3-18所示。
从图3-18中可以看出,写入和访问断点都有大小,而执行断点则没有大小这个概念。
3.内存断点
一般的调试器都具有软件断点、硬件断点和内存断点。前面介绍了软件断点和硬件断点,现在来介绍内存断点。

在很多情况下,需要知道某块内存中的数据是被什么情况下访问或写入的,因此内存断点就会非常的有用。内存断点通过在反汇编窗口或数据窗口单击鼠标右键弹出的菜单项中的“断点”子菜单下有“内存访问”和“内存写入”两种方式。在设置了内存断点后,在“断点”子菜单下会出现“删除内存断点”的子菜单项。关于内存断点设置与删除的菜单项如图3-19所示。
44.jpg
4.一次性内存访问断点
一次性内存访问断点与内存断点类似,该断点需要在内存窗口(Alt+M可以切换到内存窗口)。在内存窗口中,选中某块内存然后单击鼠标右键,在弹出的菜单中选择“在访问上设置断点”或者按下快捷键F2,即可设置一次性内存访问断点。
一次性内存访问断点类似于内存断点,区别在于,一次性内存访问断点在中断后会被自动删除,只能使用一次。
5.条件断点
很多时候在某一个地址处设置断点,断点会很频繁地被断下,而断下后往往不是调试者需要调试的内容。在某一个地址设置的断点被频繁地断下后,调试者就要不停地按F9键让程序继续执行,直到遇到真正需要调试的断点为止。这样的断点会给调试者带来很多不方便。因此,OD为调试者提供了“条件断点”和“条件记录断点”,当调试者设置“条件断点”和“条件记录断点”后,调试器遇到被设置断点的地址时,首先会计算断点的条件是否满足,如果满足调试者设置的断点条件,OD才会暂停被调试的程序使其中断。
(1)条件断点
设置条件断点可以在需要设定条件断点的位置按下“Shift+F2”组合键,在弹出的输入条件对话框中输入条件。也可以在命令插件中直接输入条件,两者的方式是类似的。
在比较的条件中常见的表达式运算符有:加减法(+、?)、逻辑运算与或非(&&、||、!)、关系运算大于小于等于(>、>=、<、<=、==和!=)等各种运算符。
下面给出一些简单的条件断点中的条件示例:
①EAX == 12345678,表示EAX寄存器等于12345678。

②[EAX] == 12345678,表示EAX寄存器中保存的值是一个内存地址,内存地址中的值等于12345678。
③[[EAX]] == 12345678,表示EAX寄存器中保存的值是一个内存地址,内存地址中保存的值是另外一个内存地址,第二个内存地址中的值等于12345678。
④ESI==00403000 && EDI==00403010,表示ESI寄存器的值为00403000且EDI寄存器的值为00403010。
⑤[403000] != 10,表示内存地址403000的值不等于10。
⑥STRING [403010] == “test”,表示以地址403010为起始地址,以NULL作为结尾的ASCII字符串。
⑦[STRING [403010]] == “test”,表示以地址403010为起始地址的,如果匹配到开头为“test”的字符串。
在LoadLibraryA函数中设置断点,在加载kernel32.dll时断下。LoadLibrary函数原型如下:
LPCTSTR lpFileName        //调用DLL的名称
在LoadLibraryA函数下断时,在栈内可以观察到LoadLibrary函数的参数,如图3-20所示。将栈的地址设置为“相对于ESP”的显示方式,设置方式是在栈窗口单击鼠标右键,在弹出的菜单中选择“地址”→“相对于ESP”进行设置。

555.jpg

333.jpg
使用条件断点设置断点后,被设置断点的地址处的高亮显示与软件断点的高亮显示方式不同。当设置好条件断点后,只有当条件满足后才会中断。也就是只有在LoadLibraryA函数的参数是kernel32.dll时,OD才会中断显示,其他的则不会进行中断,这样可以极大地方便调试者的调试工作。
(2)条件记录断点
设置条件记录断点与设置条件断点类似,在需要设置条件记录断点的地址上按下“Shift+F4”组合键,会弹出设置条件记录断点的对话框,如图3-23和图3-24所示。

666.jpg

图3-23中也是对LoadLibraryA函数设置条件断点,断点的条件同样是在加载“kernel32.dll”时才中断。观察图3-23中的各个设置。
①条件:输入要设置的条件表达式,图中设置的是“[STRING[ESP+4]]”。
②说明和表达式:这不是必填项,但是为了在调试的记录窗口(Alt+L可以切换至记录窗口,图3-24就是在记录窗口记录的条件断点信息)中可以方便地查看信息,建议填写。在图3-24中,第一行的“7651DD65”是被中断的地址,在这里是LoadLibraryA函数的地址,“COND:记录加载KERNEL32.DLL=004B84A6”给出两个信息,第一个信息“记录加载KERNEL32.DL”是调试者在条件记录断点中填写的“说明”,第二个信息“004B84A6”是调试者在条件记录断点中填写的“表达式”的值。在图3-23中的“表达式”中,笔者填写了“[esp+ 4]”,当中断时“[esp + 4]”的值是“004B84A6”,这里可以从栈窗口中进行观察。

③解码表达式的值:该下拉组合框中有很多选项,其中这些选项会影响记录窗口(Alt+L可以切换至记录窗口)的信息。在图3-23中,
777.jpg
图3-25的第一行信息中,在“COND”最后给出了“004B84A6”解析后是字符串“KERNEL32.DLL”,这里的内存数据完全由调试者自己解析。当然,如果解析的内容并非是字符串信息,则显示的可能是其他的信息,读者可以自行尝试。
④暂停程序:当OD拦截到条件断点时是否要中断在设断处,如果设置为“按条件”,那么当执行到调试者所设置的断点地址处时,OD就会暂停程序并中断在断点处。在“暂停程序”中的“条件满足次数(十进制)”处可以设置在第几次满足条件时程序才进行中断。
⑤记录表达数值:如果将该项设置为“从不”,那么断点被中断后,在记录窗口中无法查看到图3-24中的第一行信息。
⑥记录函数参数:如果将该项设置为“从不”,那么断点被中断后,在记录窗口中无法查看到图3-24中的第二行和第三行信息。
⑦如果程序暂停,传递以下命令到插件:当条件断点被满足并中断后所要执行的命令,比如当第一次中断LoadLibraryA函数加载kernel32.dll后就需要删除该断点,则可以在该处输入命令“.bc LoadLibraryA”。注意,在输入命令时前面会有一个“.”。
6.消息断点
消息断点用于调试带有窗口的应用程序,命令行的程序不适用。在Windows下,窗口程序是基于消息的,因此消息断点用好,在调试带有窗口的程序时还是会带来一些方便的。
消息断点也类似于条件断点,它针对特定的窗口消息设置相应的断点。消息断点在“Window窗口”中进行设置(单击工具栏上的“W”按钮即可切换到Window窗口)。当切换到Window窗口后,首先单击右键弹出菜单中的“刷新”按钮,这样便于能正常显示出所有的“窗口”。选中要设置断点的窗口记录,然后在右键弹出的菜单当中,选择“在ClassProc上设置消息断点”,如图3-26所示。当选择“在ClassProc上设置消息断点”后会出现如图3-27所示的设置断点的对话框。
8888.jpg

在图3-27的“消息”框中选择合适的消息进行下断,即可设置相应的消息断点。设置消息断点后,如果希望修改消息断点可以在当初选择的窗口记录上再次单击“在ClassProc上设置消息断点”来修改下断的消息。同样也可以在断点窗口(Alt + L可以切换到断点窗口)来修改消息断点,当在断点窗口修改消息断点时会发发现,修改的窗口与消息记录断点的窗口相同。
3.2.2  OD中跟踪代码的介绍
前面介绍了OD的窗口与设置断点的方法,接下来再简单介绍一下OD的代码跟踪。在这里,笔者简单地介绍一些调试中用到的快捷键,让读者可以在使用OD调试时进行使用。

1.单步
在调试时,可以使用F7和F8两个快捷键让程序进行单步调试。F8键是单步步过,在按F8键后代码会依次进行执行,但是遇到CALL指令时,并不进入CALL指令调用的地址处,遇到REP指令时不进行重复。F7键是单步步入,在按F7键后代码同样会依次进行执行,遇到CALL指令时,则进入CALL指令调用的地址处,遇到REP指令时会按照REP重复的次数再不断的重复。
2.查看/运行到指定的位置
在调试中,经常有一种情况,就是在调试的时候会把关键的需要分析的反汇编代码的地址记录下来,如果这次没有分析完或分析的过程中程序执行了,那么下次就可以在这个地址接着调试。比如,记录好一个地址,下次需要去改地址继续调试的话,那么通过快捷键“Ctrl+G”,然后输入要去的地址就可以进入到指定的地址。然后再按下快捷键F4,就可以运行到选中所在之处了。
“Ctrl +G”是跳转到指定的地址,“F4”是运行到选中的地址。两者的区别是,前者是为了快速地查看或者到达某个地址处,这是一个静态的方式;后者是运行到指定的地址处,这是一个动态的方式。
3.查看CALL/JMP指令目的地址的反汇编代码
在很多时候,遇到CALL指令或者JMP指令时,调试者只想简单地查看一下CALL指令目标地址或JMP指令目标地址的反汇编代码,而不一定会去真正地调试它们,那么在遇到CALL指令或JMP指令时按下“回车”键,就可以到CALL指令或JMP指令的目标地址进行查看。在这种情况下也属于是静态查看的,因为CPU并没有真正运行到此地址处。
4.返回调用处
当设置断点进入某个函数后,也就是进入某个CALL指令后,按下Alt+F9组合键可以返回到函数的调用处。


评分

参与人数 18HB +24 THX +9 收起 理由
消逝的过去 + 1
是栗子呐 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
后学真 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
风里去 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
我是大表哥 + 1
程序员大明 + 2 + 1
taykey + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
凌夏随缘 + 1
agan8888 + 1
wangxp + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
阳光大地 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
cc2602720520 + 1
轻歌 + 1
一蓑烟雨 + 1 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
逆君 + 6 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
zxjzzh + 2 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
yuan2020 + 1 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
莣孒嬡沵芣蓜 + 4 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
eTPtJuZd85 发表于 2022-3-25 10:37 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
nUFzSs 发表于 2022-3-25 10:42 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
CBJ6245 发表于 2022-3-25 10:46 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Ezy2 发表于 2022-3-25 10:56 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
wAYxfpIgc 发表于 2022-3-25 11:04 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
fFEH0 发表于 2022-3-25 11:11 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
mfleB 发表于 2022-3-25 11:55 | 显示全部楼层

感谢楼主
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
NZbn70245 发表于 2022-3-25 12:13 | 显示全部楼层

每天都能学到新知识,赞!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
PbE35648 发表于 2022-3-25 12:14 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表