能力值:
( LV12,RANK:300 )
|
-
-
2 楼
使用不断恢复和重新修改开头5字节的方法进行inline hook的切换,实在是太挫了……
首先看看你恢复完开头5字节的操作,如果是用cli后改cr0来去除写保护,那么修改完之后,有没有先sti然后再调用IofCallDriver,如果没有sti就接着调用了,那很可能就是产生这个错误的原因。
但是无论如何,你这种Inline hook方式都是不好的,因为需要不断地重新HOOK,更容易出问题。
一般inline hook的方法是申请块未分页内存(或者就在自己驱动内留出相应空间),先把开头5字节写到那里,下面跟一个跳回原函数5字节后继续执行的jmp。之后在自定义函数中调用这块代码,自然进入原函数中。网络上的示例代码基本上都是这么写的。
建议楼主好好看看inline hook到底要怎么做的,你这个方法,即使改到不会每次都蓝屏,稳定性和效率还是很不好的。这跟是不是WIN7没啥关系,主要是楼主的基础还是不牢。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
,
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
谢谢你的建议,呵呵,是有点土
不过因为我想在调用完IofCallDriver之后,在做些操作,如果按照你建议的直接jmp到源函数操作,那样如何跳回到我的程序中了~~
再次谢谢
|
能力值:
( LV12,RANK:300 )
|
-
-
5 楼
晕倒,所以说你基础不牢,我不是说过“之后在自定义函数中调用这块代码”吗,也就是把输入参数再push一次,然后call进这段代码,这段代码内部jmp到原函数,原函数ret之后,还不是一样回到你的自定义函数?!我看你连这个流程都没有搞清楚。
简单来说就是这样的流程:
call @1;这个call进入
......
@1:
......;执行原先前面几个字节代码
jmp @2
@2:
......;执行原来的代码
ret xx;函数最后的ret,这一句就跳到call @1的下一句了
所以根本不存在跳不回自定义函数的问题。这inline hook人家网上代码都大把了,楼主为什么不去仔细看一看呢。
|
能力值:
( 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包?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
这段代码和上面那段代码类似
IofCallDriver(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp);
我现在是想得到IofCallDriver执行完成之后的Irp参数
Inline hook怎么样才能检查到调用完该API之后的输出?
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
按照小聪之前讲的那个流程
在你自己的函数里模拟了原本 call 的 jmp 动作
iofcalldriver 跑完后还是回到你的函数里
而 iofcalldriver 用到的 IRP 也是你的函数手工压进栈去的。。。
所以你说怎么用乜
|
能力值:
( LV12,RANK:300 )
|
-
-
10 楼
你既然跟踪到这里了,应该看出IofCallDriver是fastcall调用规范的,我看不出来你上面的声明有没有声明这个类型。
|
|
|