异常处理初探
使用工具
- OllyDbg 1.10原版,简称
OD; OD汉化和插件均来自互联网;- CrackMe来自互联网,仅供学习使用;
- 文中特殊数字均是
HEX,为了书写方便采用DEC;
分析思路
内存访问异常总结下来就一句话:在没有权限的地方做了没权限的事儿;
将任意
CrackMe倒入OD:![倒入OD]()
当前处于代码段,只有只读权限,如果要写入内容会怎么样?
修改第一行代码,把
EAX的内容写入指定地址;![修改代码]()
然后执行代码:
![访问违规]()
可以看到,根本无法执行代码;
那每个代码段的权限如何查看呢?
方法一:
打开
内存窗口,找到PE 头文件:![内存窗口]()
然后双击
PE 头文件所在行,打开数据窗口,找到 PE 头偏移量Offset to PE signature:![偏移量]()
既然偏移量是 100, 那地址就是
00400100,往下翻找到这个地址:![找到地址]()
在这里,发现了代码段和数据段的地址信息,偏移量分别是 1000 和 2000,那地址就分别是
00401000和00402000喽,如何确定呢?重载程序就知道了;![起始位置]()
至于它们的权限,继续往下翻:
![权限]()
在这里可以清楚的看到,CODE 段只有只读权限,而 DATA 段有读写权限;
方法二:
在
数据窗口按下Ctrl + G,转到00400000:![转到表达式]()
然后在
数据窗口右键指定 > PE 头文件,就可以定位到PE 头文件了:![定位]()
其他操作和方法一一致;
测试一下修改代码段权限,写入内容:
在
数据窗口选择代码段权限行,右键选择修改整数:![修改整数]()
然后修改权限:
![修改成功]()
修改后可以看到,CODE 段有写的权限了,然后将修改保存到新的可执行文件;
接着,将保存的新文件倒入
OD并修改第一行代码:![打开新文件]()
运行程序:
![运行程序]()
可以看到,
EAX的内容成功写入到以指定地址为开始的位置;
最后,来说说一个小的知识点
除零异常;刚上学开始学习加减乘除的时候,老师就告诉我们 0 不能作为除数,而在程序设计中,当遇上正整数除以零程序会中止:
![调试语句]()
在这里,由于
EAX自身为 0,为了区分被除数和除数,让EAX加上一个随机的立即数以区分,这里以 123 为例,接着通过xor让准备作为除数的ECX置 0,最后用EAX除以ECX,接下来,看一下运算的结果:![除零异常]()
可以看到,执行
DIV ECX后,也就是除以 0 后,这里产生了一个异常,这个异常就叫作除零异常;















