吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 3141|回复: 10

[转载技术] 第十章-断点

[复制链接]
Shark恒 发表于 2015-1-20 15:49 | 显示全部楼层 |阅读模式

                                第十章-断点
本章将介绍各种类型的断点。断点可以让你在程序代码执行到合适的时候暂停下来。这次我们的实验的对象还是CrueHead’a的CrackMe。
普通断点
这是一个很普通的断点,我们前面章节已经使用了。在SoftIce中我们可以使用BPX命令来设置断点。OD中可以使用BP命令或者F2快捷键来设置断点。也可以再按一次F2快捷键来取消断点。
我们来到CrueHead’a的CrackMe的入口点处。
image002.jpg
举个例子,拿401018这行来说吧,按F2键-这行就会以红色突出显示,在该地址处设置的断点就会加入了断点列表中。
image004.jpg
我们来看看断点列表刚刚设置的断点,此时该断点是激活状态。
image006.jpg
断点列表中Active栏显示的是Always。在该行上单击鼠标右键会弹出一些操作断点的菜单项。
image008.jpg
Remove:从列表中删除断点。
Disable:禁用断点但并不将断点从列表中删除。禁用时,断点并不会触发。
Edit condition:给断点设置触发条件,我们后面再来讨论。
Follow indisassembler:在反汇编窗口中显示断点。
Disable all orenable all:禁用/启用列表中的全部断点。这里没有启用的选项,因为列表中唯一的断点没有被禁用。
Copy to Clipboard:把选中断点的信息复制到剪贴板。我们来实验一下。
image010.jpg
我们选择Whole line拷贝整行,WholeTable可以拷贝整个列表的断点信息。
Breakpoints, item 0
Address=00401018
Module=CRACKME
Active=Always
Disassembly=OR EAX,EAX
拷贝下来的信息显示了断点的地址,对应的指令以及激活状态。
按下F9键-CrackMe运行起来了。然后正如猜想的一样中断了下来。
image012.jpg
在状态栏显示暂停状态。
image014.jpg
暂停的原因如下:
image016.jpg

我们来了解一下当设置一个断点以后,二进制代码会发生什么变化。
单击鼠标右键选择-Follow in Dump-Selection
image018.jpg
我们看看数据窗口中401018地址处的内容:
image020.jpg
我们初看一下数据窗口中的内容和反汇编代码中代码是一样的:
image022.jpg
数据窗口和反汇编代码中我们看到的都是0B C0,对应的是OREAX,EAX。似乎代码没有什么变化,但是真的没有变化吗?
我们保留401018处的断点,重新加载CrackMe。
image024.jpg
我们将OR EAX,EAX对应的机器代码读取出来然后写到别处。
image026.jpg
该指令将401018地址处的双字值保存到EAX中,我们看看OD的提示框中提示的信息。
image028.jpg
在数据窗口中和提示框中显示的都是相同的内容:0B C0。但是,我们按下F7键看看EAX显示的内容。
image030.jpg
读出来的401018处的内容并不是OD刚刚显示的0B C0 74 01(小端存储),按双字取出来是0174C00B,而现在显示的是0174C0CC,因此401018处字节值是CC。当我们设置断点后,OD会将对应指令处第一个字节指令替换成CC。但是为了不影响界面显示效果,OD会将CC显示为原字节。但是,我们可以在内存单元中读取出其真实的内容,并且可以在反调试中用此方法来检测断点。所以,我们设置的断点有时候莫名其妙的消失了不要感到奇怪,或许说这是调试器的本身的弱点吧。
除了F2设置断点以外,我们还可以通过命令栏来设置断点,如下:
BP 401018
image032.jpg
在NT(2000,XP和2003)系统中我们也可以很容易的给API函数设置断点-我们前面章节中已经介绍过了。要给MessageBoxA设置断点,请输入:
image034.jpg
并且你必须指定API函数的确切名称,而且大小写敏感。
image036.jpg
还有一个比BP更加强大的命令BPX可以给引用或者调用了指定API函数的指令都下断点。
下面是BPX给MessageBoxA设置的断点列表。正如你所看到的,OD找到了3处地方调用MessageBoxA,并设置了3个断点。
image038.jpg
还有一种设置断点的方法:在反汇编窗口中你想设置断点的那一行双击机器码即可。如果想删除的话,再双击一次即可。
image040.jpg

内存断点
内存访问断点有时候也称之为BPM,但是不要与SoftIce中的BPM弄混淆了,这二者是完全不同的。
这种类型的断点修改内存页的访问属性。当前我们设置了内存断点。任何代码访问(读,写或者执行代码)了该处代码的话,都会触发异常。我们来看一个例子:
image042.jpg
现在我们在CrackMe的入口点处,我们尝试设置一个内存断点。单击鼠标右键选择-Goto-Expression输入4020CA,转到这个地址。
image044.jpg
我们在4020CA处设置4个字节的内存断点。当前有指令尝试读取这几个字节的时候,就会中断下来。
image046.jpg
我们这4字节上单击鼠标右键选择-Breakpoint-Memory,onaccess,这里不一定要设置的4个字节,你也可以设置长一点,也可以设置短一点。
image048.jpg
内存访问断点有两个缺点:1.它们不会出现[B]断点列表中和其他的地址。所以,你必须记得设置在什么地址处。2.不能同时设置多个内存断点。如果你设置了一个那么你之前设置的就会被自动删除。
当运行到401007地址处的时候,该地址处指令试图写入内容到4020CA内存单元中。
image050.jpg
下面状态栏清楚了描述了暂停的原因:
image052.jpg
当指令尝试将EAX的值写入4020CA内存单元的时候,OD会断下来。记住,当我们对指定内存单元没有写权限,尝试写入的时候会触发异常,OD会拦截到这个异常,并中断下来,我们看到断下来的时候,OD已经将内存页的访问属性设置正常了。
如果此时我们按F7键,EAX的值会被写入到4020CA内存单元中,此处的异常不会再次发生。
image054.jpg
400000h的值成功写入。我们运行起来,由于内存访问断点仍然存在,如果程序尝试访问4020CA内存单元的话,会再次触发异常。
image056.jpg
正如你看到的,该指令尝试读取4020CA内存单元的内容,证明内存访问断点又触发了。
image058.jpg
再次按F7键运行一步,将4020CA内存单元内容读取出来并保存到EAX中。
image060.jpg
再次F9键运行起来,还会不会出发内存断点呢?对,依然会。
image062.jpg
OD会再次中断在尝试读取4020CA内存单元的指令处,这是一个push指令,该指令会尝试将4020CA内存单元的内容压入堆栈。
image064.jpg
要删除内存断点的话,可以数据窗口中单击鼠标右键选择-Breakpoint-Remove memory breakpoint。你还可以设置一个新的内存断点,旧的内存断点会自动被删除。
image066.jpg
“Memory,on access”是内存访问断点(读或者写),“Memory,on write”是内存写断点。
OD也可以对区段设置内存断点,我们选择菜单项View-Memory,也可以按工具栏中的[M]按钮打开内存窗口。
image068.jpg
这个列表包含了CrackMe加载的一些区段以及其加载的一些DLL的区段,如图我们选中了以401000开头的区段。
image070.jpg
在选中部分上单击鼠标右键选择-Set Memory breakpoint on access。
image072.jpg
下面还有Set memory breakpoint on write的选项,但是这里我们选择Set memory breakpoint on access并且运行起来。
image074.jpg
中断在了下一行指令上。
image076.jpg
因为试图执行401002处的代码,而当前代码段设置了内存访问断点,尝试执行当前代码段的任何一条指令都会触发内存访问断点。
image078.jpg
我们对kernel32的代码段设置内存访问断点,列表的下面可以找到。
image080.jpg
我们选择-Set memory breakpoint on access,当试图读取/写入/执行Kernel32代码段的时候就会中断下来,我们运行起来。
image082.jpg
从堆栈的顶部来看,调用API函数的时候中断下来了。
image084.jpg
当前执行kernel32.dll中的第一个API函数的时候中断下来了,从堆栈中我们可以看到返回地址:
image086.jpg
在返回地址上单击鼠标右键选择-Follow in Disassembler。
image088.jpg
返回地址是401007,是调用GetModuleHandleA后面的一行。
image090.jpg
正下方是调用FindWindowA,调用这个函数的时候不会触发内存访问断点,应该这个函数是属于另一个DLL-user32.dll的。如果你再次运行的话,会中断在下一条指令处,因为下一条指令也属于kernel32的代码段,
所以执行GetModuleHandleA的每一条指令的时候内存访问断点都会触发,所以这个时候我们可以选择-Removememory breakpoint删除内存断点。
如果你想要返回到主程序模块中,可以选择主菜单项-Debug-Executetill user code。有的时候,这个方法不起作用。我们可以在函数返回指令处设置断点,然后运行起来,等中断下来以后,再F7或者F8单步到主程序的代码中。
image092.jpg
这里Execute till user code起作用了,我们回到了主程序模块的代码中。后面我们会介绍哪些情况下这种方式不奏效。
image094.jpg
现在,你可以再次对kernel32.dll的代码段设置内存访问断点了,让程序调用Kernel32.dll中的API函数的时候再次中断下来。
此外,如果程序会检测函数首字节是否为0xCC的话,这个时候我们使用bpMessageBoxA命令下断点就无效了,这个时候我们可以尝试一下内存访问断点。我们来看个例子:
image096.jpg
MessageBoxA在我的机器上的对应的地址是77D504EA。通过单击鼠标右键选择-Goto-Expression输入该函数的名称:
image098.jpg

第一条指令被高亮显示:


image100.jpg
这里我们单击鼠标右键选择-Breakpoint-Memory,on access或者memory,on write,这里我选择Memory,onaccess然后运行起来。
image102.jpg
选择help-Register,然后输入任意用户名和序列号:
image104.jpg
单击OK。
image106.jpg
在同一个API函数中,如果通过bp命令设置断点会被程序检测而导致断点失效的话,也许设置内存访问断点可以绕过这个检测。设置内存访问断点这个方法也可以通过检测内存页的属性并恢复内存页的属性来进行保护,但是这在反调试技巧中并不常见。
下一章,我们将介绍硬件断点和消息断点,条件断点我们会在后面介绍。

本系列文章汉化版转载看雪论坛

感谢原作者:RicardoNarvaja(西班牙人)
原作者个人主页:http://www.ricardonarvaja.info/

感谢热心翻译的朋友:
1~3章译者:BGCoder
4~58章译者:安于此生

全集配套程序下载地址:
链接: http://pan.baidu.com/s/1eQzTWfo 密码: vytv



评分

参与人数 15HB +17 THX +5 收起 理由
花盗睡鼠 + 2 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
24567 + 1
太阳神 + 2 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
sjtkxy + 1 + 1
Jawon + 2
一路走来不容易 + 1
Soul1999 + 1
yexing + 1
消逝的过去 + 2
l278785481 + 1
crosssss + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
成丰羽 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
hackysh + 1
hnymsh + 1
lies + 1

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
hackysh 发表于 2022-2-8 15:50 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
别管我了行 发表于 2022-3-1 03:25 | 显示全部楼层

提示: 作者被禁止或删除 内容自动屏蔽
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
zg2600 发表于 2022-8-5 14:42 | 显示全部楼层

[吾爱汇编论坛52HB.COM]-感谢分享,虽说用的不多,有备无患,nice,谢谢,给力非常感谢破解思路
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
yexing 发表于 2022-10-21 09:26 | 显示全部楼层

很强大啊,楼主厉害
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2022-11-15 22:59 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2022-11-17 22:13 | 显示全部楼层

楼主辛苦了,谢谢分享!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2023-4-3 09:49 | 显示全部楼层

楼主威武!!!!!!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
sjtkxy 发表于 2023-4-7 04:59 | 显示全部楼层

提示: 作者被禁止或删除 内容自动屏蔽
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
一生逍遥 发表于 2023-4-19 11:33 | 显示全部楼层

谢谢分享新手
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!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

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