首页
社区
课程
招聘
[求助]驱动的内存访问异常能否捕获?
发表于: 2009-5-30 11:22 8547

[求助]驱动的内存访问异常能否捕获?

2009-5-30 11:22
8547
驱动的内存访问异常能否捕获?
我试过*(long*)NULL = 0,这个可以捕获;
但是*(long*)0xffffffd0 = 0直接蓝屏,提示访问了NONPAGED内存。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是不是把显示蓝屏那个触发函数给hook了应该就可以了吧,本人不懂驱动 仅供参考...
2009-5-30 13:03
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
呃,蓝屏触发代码我也不知道在哪?这个没有办法吗?
2009-5-30 17:02
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
4
内核态下,异常捕获通常只能捕获RING3内存的异常(<*MmUserProbeAddress),无法捕捉RING0内存的一场

RING0内存异常后,即使有异常捕获,也会立即蓝屏

但例如ICESWORD等内存爆搜工具或SOFTICE等调试器,HOOK了INT 0XE缺页中断,或者HOOK了KeBugCheck来检查内存访问异常的蓝屏,也可以捕获到RING0内存的异常访问
2009-5-30 19:57
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
原先*(long*)4 = 0也直接蓝屏,原以为驱动里面不能捕获,承蒙LS高人指点,跟踪了一下,发现是异常处理库的一个BUG造成的。这个库是从一个nasm编写的lib库那里弄来的,这个lib库有些BUG,虽然已经修改了一部分,不过还存在问题,修改了以后,*(long*)4 = 0已经可以正常捕获。
这个库的异常处理代码的入口是__CxxFrameHandler,在这里加断点,*(long*)4 = 0可以断下,但是*(long*)0xffffffd0就断不下来。不过根据LS说的,在KebugCheckEx里面加了断点,可以断下,不过我不知道该怎么回去,LS可否再多指点一下……
2009-5-31 10:56
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
6
应该是....内核内存的异常将中断到INT 2E.....INT 2E判断是否有KERNEL DEBUGGER...没有的话就BSOD...个人猜测..
2009-5-31 11:19
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
有KERNEL DEBUGGER也会BSOD。。。
2009-5-31 11:23
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
我试着把KeBugCheckEx函数Hook了一下,Hook函数里面第一条语句是给0地址赋值。
我用SOFTICE跟踪了一下,*(long*)0xffffffd0 = 0触发了KeBugCheckEx处的断点,然后会调用*(long*)0 = 0,这个触发了__CxxFrameHandler,继续跟踪了下去,一切正常,也回到了原来的地方,然后取消了Hook,并且成功离开DriverEntry,但是Ctrl+D放弃调试后就花屏了,蓝屏出错提示一开始闪了一下就花了,试了三次都是这样……
既然异常已经成功捕获,那么这个蓝屏的可能性还有什么呢?
2009-5-31 15:58
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
9
你捕获的只是访问0地址的异常,访问ffffffd0的异常并没有被resolve,只是在int 0xe call kebugcheckex 时被你拦截了。参考ICESWORD或SOFTICE的处理~
2009-5-31 16:33
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
所谓异常有没有被处理,实际上只是出异常后,跳到异常处理代码那里检查一下吧?如果安装了异常处理例程,就调用之,最后跳回去;如果没有安装,就调用KeBugCheck蓝屏。不知道我是否理解错了?
既然我已经借用访问0地址的异常,跳回了原代码处(已经出了try…catch),并且ebp,esp均正确(ebx、esi、edi的值不对,不过下面就是一堆pop+ret了所以暂时没影响),那么CPU还会知道曾经存在过访问ffffffd0的异常么?
2009-5-31 16:50
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
再请教一下,我不知道上哪找ICESWORD或SOFTICE处理的方法,不过我想如果知道int 0xe的中断入口的话,或许处理起来更简单,不过这个地址该如何获得呢?
2009-5-31 16:53
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
12
wrk中KiTrap0e
2009-5-31 17:04
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
虽然要感谢LS指点,不过LS也真是惜字如金啊!
KiTrap0E在IDT中断表里面,不过我不知道IDT的基地址该怎么找……
2009-5-31 17:26
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
14
提供点信息...
当发生故障时,CPU会在栈中压入一个"错误码"..可以用错误码来判断....U/S表示发生故障时CPU的RING...U/S == 1--->>>RING3/ W/R表示对该地址的操作..W/R = 1-->>WRITE 否则是READ....最重要的P位..1表示保护故障,0表示缺页,我们可以通过P位来判断..
你看是保护鼓掌还是缺页自己判断下......返回是修改EIP..跳过那个XX地址就可以了...我没试过..你试下..
2009-5-31 17:40
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
15
gidt~~
2009-5-31 17:42
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
我用sidt指令得到了中断描述表,跟踪调试了一下,发现访问0地址和0xffffffd0地址的区别,仅在于一开始进入时CR2这个寄存器,这个寄存器保存的是非法访问地址。继续跟踪下去,下面会有一个地方将此地址与MmSystemRangeStart比较,后者的值是0x80000000,如果小于(JB)的话,跳转到异常处理的地方,否则执行一大段不知道干什么用的代码,最后调KeBugCheckEx蓝屏。
我试着在0xffffffd0非法访问,并且在中断入口断下后,强行修改CR2的值为0,结果异常正常捕获,避免了蓝屏。那么方法应该呼之欲出了,只要修改中断描述表的入口,每次都强行修改CR2为0,在跳回原代码处,就可以解决问题。但是只要我对描述表做写入动作,就直接蓝屏,是否是哪里有内存保护呢?SOFTICE也改过这个地址,应该是可以实现的吧?
2009-5-31 22:52
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
sidt得到的是中断描述表的地址,如果你把这个地址改了,影响其他中断号了,导致其他正常中断无法正常处理,蓝了.

MJ说了,你只要HOOK 0e号中断就行了.

请参考rootkit专题关于IDT
2009-6-1 07:32
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
我是修改表中0E对应的内容,不管怎样也不可能傻到去修改表的基址吧?
HOOK的方法大体分为两种,一种是inline Hook就是头部加jmp指令,不过这里并不合适,另一种就是类似IAT HOOK的,修改存放入口的内存地址的内容。我现在就是期望用后一种方法……
不过一个中断对应8个字节,我只知道后4个字节存放入口,前4个字节不知道干什么的。
2009-6-1 08:56
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
已经搞定了,原来那8个字节中,是7610四个字节构成中断入口地址,而不是原先想的7654构成中断入口地址。
2009-6-1 10:17
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
一个门是8字节,你看下IDT专题,,前2字节和尾2字节组成的入口地址..
2009-6-1 10:18
0
游客
登录 | 注册 方可回帖
返回
//