异常处理初探
使用工具
- OllyDbg 1.10原版,简称
OD
; OD
汉化
和插件
均来自互联网;- CrackMe来自互联网,仅供学习使用;
- 文中特殊数字均是
HEX
,为了书写方便采用DEC
;
分析思路
内存访问异常总结下来就一句话:在没有权限的地方做了没权限的事儿;
将任意
CrackMe
倒入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 后,这里产生了一个异常,这个异常就叫作除零异常;