首页
社区
课程
招聘
[求助]在win7写驱动报IRQL_NOT_LESS_OR_EQUAL蓝屏错误
发表于: 2009-6-17 08:44 9745

[求助]在win7写驱动报IRQL_NOT_LESS_OR_EQUAL蓝屏错误

2009-6-17 08:44
9745
程序是Inline HOOK IofCallDriver
每次进到自定义的函数的时候,首先恢复开头的5个字节,然后调用IofCallDriver(进入真正的IofCallDriver函数),执行完后,重新将开始的5字节修改为自己程序入口地址
windbg调试显示,蓝屏在调用IofCallDriver这个操作。
望各位大牛指点,郁闷中~~~

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
使用不断恢复和重新修改开头5字节的方法进行inline hook的切换,实在是太挫了……
首先看看你恢复完开头5字节的操作,如果是用cli后改cr0来去除写保护,那么修改完之后,有没有先sti然后再调用IofCallDriver,如果没有sti就接着调用了,那很可能就是产生这个错误的原因。
但是无论如何,你这种Inline hook方式都是不好的,因为需要不断地重新HOOK,更容易出问题。
一般inline hook的方法是申请块未分页内存(或者就在自己驱动内留出相应空间),先把开头5字节写到那里,下面跟一个跳回原函数5字节后继续执行的jmp。之后在自定义函数中调用这块代码,自然进入原函数中。网络上的示例代码基本上都是这么写的。
建议楼主好好看看inline hook到底要怎么做的,你这个方法,即使改到不会每次都蓝屏,稳定性和效率还是很不好的。这跟是不是WIN7没啥关系,主要是楼主的基础还是不牢。
2009-6-18 02:54
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3


,
2009-6-18 09:40
0
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢你的建议,呵呵,是有点土
不过因为我想在调用完IofCallDriver之后,在做些操作,如果按照你建议的直接jmp到源函数操作,那样如何跳回到我的程序中了~~

再次谢谢
2009-6-18 14:24
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
5
晕倒,所以说你基础不牢,我不是说过“之后在自定义函数中调用这块代码”吗,也就是把输入参数再push一次,然后call进这段代码,这段代码内部jmp到原函数,原函数ret之后,还不是一样回到你的自定义函数?!我看你连这个流程都没有搞清楚。

简单来说就是这样的流程:

call @1;这个call进入
......
@1:
......;执行原先前面几个字节代码
jmp @2

@2:
......;执行原来的代码
ret xx;函数最后的ret,这一句就跳到call @1的下一句了

所以根本不存在跳不回自定义函数的问题。这inline hook人家网上代码都大把了,楼主为什么不去仔细看一看呢。
2009-6-18 15:50
0
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
call @1返回后,就直接执行下一句了
这个调用过程是其它程序发起的,那我怎么查看它调用完成之后的IRP数据包了?

恕小弟愚钝
用shdaianita Inline hook框架
http://bbs.pediy.com/showthread.php?t=77467
在fake_KiInsertQueueApc和Proxy_KiInsertQueueApc中添加检测程序都没法执行

跟踪IofCallDriver调用
.......
8081d59d 52              push    edx
8081d59e 51              push    ecx
8081d59f ff548638     call    dword ptr [esi+eax*4+38h]
8081d5a3 5e              pop     esi
8081d5a4 5d              pop     ebp
8081d5a5 c3              ret

call dword ptr [esi+eax*4+38h]才是真正的IofCallDriver调用,完成后,就返回了

怎样才能截获到调用IofCallDriver之后的Irp包?
2009-7-8 12:29
0
雪    币: 202
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
参考此贴最后面回复的代码:

http://www.debugman.com/read.php?tid=3046&keyword=
2009-7-8 13:25
0
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这段代码和上面那段代码类似

IofCallDriver(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp);

我现在是想得到IofCallDriver执行完成之后的Irp参数

Inline hook怎么样才能检查到调用完该API之后的输出?
2009-7-8 14:29
0
雪    币: 249
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
按照小聪之前讲的那个流程

在你自己的函数里模拟了原本 call 的 jmp 动作

iofcalldriver 跑完后还是回到你的函数里

而 iofcalldriver 用到的 IRP 也是你的函数手工压进栈去的。。。

所以你说怎么用乜
2009-7-8 15:02
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
10
你既然跟踪到这里了,应该看出IofCallDriver是fastcall调用规范的,我看不出来你上面的声明有没有声明这个类型。
2009-7-8 17:59
0
游客
登录 | 注册 方可回帖
返回
//