异常处理初探

使用工具

  • OllyDbg 1.10原版,简称OD
  • OD 汉化插件均来自互联网;
  • CrackMe来自互联网,仅供学习使用;
  • 文中特殊数字均是HEX,为了书写方便采用DEC

分析思路

  1. 内存访问异常总结下来就一句话:在没有权限的地方做了没权限的事儿;

  2. 将任意CrackMe倒入OD:

    倒入OD

    • 当前处于代码段,只有只读权限,如果要写入内容会怎么样?

      修改第一行代码,把EAX的内容写入指定地址;

      修改代码

      然后执行代码:

      访问违规

      可以看到,根本无法执行代码;

    • 那每个代码段的权限如何查看呢?

      1. 方法一:

        打开内存窗口,找到PE 头文件

        内存窗口

        然后双击PE 头文件所在行,打开数据窗口,找到 PE 头偏移量Offset to PE signature

        偏移量

        既然偏移量是 100, 那地址就是00400100,往下翻找到这个地址:

        找到地址

        在这里,发现了代码段和数据段的地址信息,偏移量分别是 1000 和 2000,那地址就分别是0040100000402000喽,如何确定呢?重载程序就知道了;

        起始位置

        至于它们的权限,继续往下翻:

        权限

        在这里可以清楚的看到,CODE 段只有只读权限,而 DATA 段有读写权限;

      2. 方法二:

        数据窗口按下Ctrl + G,转到00400000

        转到表达式

        然后在数据窗口右键指定 > PE 头文件,就可以定位到PE 头文件了:

        定位

        其他操作和方法一一致;

    • 测试一下修改代码段权限,写入内容:

      数据窗口选择代码段权限行,右键选择修改整数

      修改整数

      然后修改权限:

      修改成功

      修改后可以看到,CODE 段有写的权限了,然后将修改保存到新的可执行文件;

      接着,将保存的新文件倒入OD并修改第一行代码:

      打开新文件

      运行程序:

      运行程序

      可以看到,EAX的内容成功写入到以指定地址为开始的位置;

  3. 最后,来说说一个小的知识点除零异常

    刚上学开始学习加减乘除的时候,老师就告诉我们 0 不能作为除数,而在程序设计中,当遇上正整数除以零程序会中止:

    调试语句

    在这里,由于EAX自身为 0,为了区分被除数和除数,让EAX加上一个随机的立即数以区分,这里以 123 为例,接着通过xor让准备作为除数的ECX置 0,最后用EAX除以ECX,接下来,看一下运算的结果:

    除零异常

    可以看到,执行DIV ECX后,也就是除以 0 后,这里产生了一个异常,这个异常就叫作除零异常;