使用OllyDbg从零开始Cracking第二十五章-异常处理学案.doc

使用OllyDbg从零开始Cracking第二十五章-异常处理学案.doc

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第25章-异常处理 本章,我们将介绍异常处理,这一块通常是初学者的绊脚石,但是如果研究深入一点的话,你会发现它并不难。 那么异常是如何产生的呢?当处理器执行了一个错误的操作的时候,程序中就会产生异常。好了,我们来看几个异常例子吧,我们用OD打开cruehead’a 的CrackMe。 可以看到断在了入口点处,我们在第一行输入会引发异常的指令,这里我们采用Mr Silver写的异常例子中指令。 内存访问异常:当线程中尝试访问没有访问权限的内存的时候会发生该类异常。例如:一个线程尝试向只具有读权限的内存写入数据的时候就会产生内存访问异常。 我们在OD中输入如下指令: 这里我们可以看到401057开始的内存单元只具有读取和执行权限,并不具有写入权限。因此如果尝试向该内存单元写入数据的话就会产生异常,我们按F8键。 程序会根据PE头中的相关信息设置区段的初始权限,当然也可以使用诸如VirutalProtect这类API函数在运行时修改权限。 那么在OllyDbg中我们如何查看各个区段的初始权限呢,还有就是如何修改这些权限呢? 我们可以通过单击工具栏中的M按钮来查看各个区段的情况。 我们可以看到主模块的所在的区段开始于400000,首先是PE头,占1000个字节,PE头中保存了各个区段的名称,长度以及程序运行所必须的一些信息。 我们在数据窗口中定位到PE头。 由于PE头开始于400000,所以我们输入400000。 其实OllyDbg中有一个可以解析PE头的各个字段的选项,我们可以在数据窗口中单击鼠标右键。 我们可以看到显示出了DOS头的各个字段信息。 如果我们继续往下看,我们首先会看到Offset to PE signature,这是告诉我们PE头的偏移量,我们可以看到偏移量为100。那么起始地址400000加上100就是400100,我们定位到400100处。 这里你所看到的,这里是关于程序的重要信息。 下面让我们来看看部分字节详细的解释。 也就是说基地址400000加上1000就是程序的入口点。如果你想修改入口点的话,例如把入口点修改为2000,我们可以在入口点这一行上单击鼠标右键。 这里我们可以输入任意数值,例如:如果你想让程序从402000处开始执行,我们可以输入2000。这个2000是相对于映像基址400000的偏移量。 修改完毕以后,我们可以单击鼠标右键选择-Copy to executable file,然后在弹出的窗口中单击鼠标右键选择-Save file,这样就可以保存到文件了,我们并不修改入口点,只要知道可以这么做就行了。 好了,我们继续往下看。 下面各个区段的信息,首先我们看到的这个区段起始虚拟地址为1000,注意这里是偏移量,实际上内存地址为401000,并且Characteristics(特征)为CODE,EXECUTE,READ(代码段,可执行,可读)。 如果我们想让该区段具有可写权限的话,我们可以将Characteristics这个字段改为E0000020,这样该区段就具有了所有权限,嘿嘿,我们来验证一下。 好了,我们现在来将修改保存到文件。 我们将名称修改为CRACKME 3,标识这个文件是修改版。 好了,我们现在用OllyDbg打开这个CRACKME3.EXE。 现在我们将数据窗口显示模式切换为正常模式。 我们按F8键单步,会发生并没有产生异常,EAX的值被成功写入了401057内存单元中了。 下面介绍另外一种异常: 除0异常:试图除以0时会产生该异常。 例如,我们在OllyDbg中输入如下指令: (PS:原作者这个地方讲错了,他是直接DIV ECX,ECX这个时候并不为零,EAX为零,EDX指向了7C92E514,所以按照作者的做法,只会产生整数溢出异常,并不会产生除0异常。) 寄存器的如下: 好了,我们F8单步一次。 寄存器的情况如下: 这里时候除数ECX为0了。我们继续F8单步。 我们可以看到提示Integer division by zero(整数除0)异常。 无效指令,尝试执行特权指令异常: 当CPU试图执行越权指令的话就会产生该异常。 由于OllyDbg不允许我们输入CPU不可识别的指令,所以我们无法验证。但是程序员可以自己设计一些处理器并不支持的指令,当执行到指令时显示相应的错误即可。 最为典型就是INT 3指令,INT 3指令会产生一个异常,并且该异常会被调试器捕获到,比如,我们可以设置BPX断点来让程序中断下来,然后就可以对该程序进行相应的控制了。 另外,有一些程序会直接写入INT 3指令,所以说INT 3产生的异

您可能关注的文档

文档评论(0)

yy558933 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档