首页
社区
课程
招聘
[求助]hook NtOpenProcess出现的诡异问题
发表于: 2008-4-18 04:36 6121

[求助]hook NtOpenProcess出现的诡异问题

2008-4-18 04:36
6121
我hook 掉这个内核函数。。然后每次加载驱动就BSOD 晕  怎么回事啊。代码好象没什么问题。

这里是驱动部分的改NtOpenProcess前5个字节的代码
HookCode  db  0e9h
HookAddress dd  ?

_Hook proc
.if lpNtOpenProcess
cli
mov eax,cr0
and eax,0FFFEFFFFH
mov cr0,eax

mov esi,lpNtOpenProcess          ;这个变量存放的NtOpenProcess地址
lea edi,RawNtOpenProcess         ;保存前5个字节的变量 一会在hookproc里面用来恢复
mov ecx,5
rep movsb

mov eax,lpNtOpenProcess
add eax,5
mov edx,offset My_NtOpenProcess  ;这个是准备跳到的地址 改NtOpenProcess跳进 My_NtOpenProcess里面来
sub edx,eax
mov HookAddress,edx

lea esi,HookCode
mov edi,lpNtOpenProcess
mov ecx,5
rep movsb

mov eax,cr0
or eax,00010000H
mov cr0,eax
sti
.endif
ret
_Hook endp

这里是让 NtOpenProcess准备掉进来的代码
My_NtOpenProcess:
pushad
cli
mov eax,cr0
and eax,0FFFEFFFFH
mov cr0,eax

mov esi,offset RawNtOpenProcess
mov edi,lpNtOpenProcess
mov ecx,5
@@:
mov al,BYTE ptr [esi]
mov BYTE ptr [edi],al
inc esi
inc edi
loop @B

mov eax,cr0
or eax,00010000H
mov cr0,eax
sti
popad
jmp lpNtOpenProcess
简单的把前5个字节恢复 然后jmp回去 这样也出错?SHIT

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

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 18
活跃值: (2079)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
还有  我的这两个子程序全在我的驱动里面。。驱动是用汇编写的 kmd驱动。。
我用同样的方法改掉其他函数 比如一个不常用的函数memchr这个函数 不会死
应为这个函数没人用 但是NtOpenProcess这个函数估计一直有程序在用。
所以我hook马上被调用 但是都是蓝屏。会不会是IRQL  中断优先级的问题???
2008-4-18 05:29
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
3
你这样的inline hook方式,的确比较容易挂,特别是对于这样常被调用的函数来说。由于函数调用时,必须先把前5个字节写回,再回头去调用原函数,如果在写回的过程中,第二次调用又到了,就会BSOD。

一般的inline hook,不应该用这种“回头调用”的方法,应该让函数顺畅地执行:
把NtOpenProcess前5个字节代码copy到自身驱动中预留的位置(必须在可执行的代码段中)

如在驱动中预留10个字节

frontcode:
nop
nop
nop
……;留10个字节

在_Hook中把5字节代码copy到frontcode所在的位置
并在后面加上jmp lpNtOpenProcess+5

在My_NtOpenProcess中执行完你所需要的操作之后,jmp frontcode

这样frontcode部分执行完前5个字节后,直接跳到原NtOpenProcess函数的5个字节后运行。

这样就不需要反复地重写NtOpenProcess的前5个字节,即不需要反复地unhook再hook

基本上inline hook都是这么做的,包括IceSword(它恰好对NtOpenProcess进行了inline hook,不过他跳到原函数是采用把参数再push一遍,然后call,而不是直接jmp,这样在My_NtOpenProcess中更容易做处理)。你可以搜索一下论坛的inline hook的例子。
2008-4-18 18:47
0
雪    币: 437
活跃值: (273)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
4
http://www.sysersoft.com/download.php  下个DEBUG  安装 ctrl+f12 NtOpenProcess 前后下断 再ctrl+f12 退出  菜单加载驱动 断下后应该很快能解决问题  提供一个思路= =
2008-4-18 19:46
0
雪    币: 18
活跃值: (2079)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
我知道这样会挂 我本来也是用的 模拟前面5个字节的指令然后jmp回去。。
但是也是出同样的问题。
我这样只是测试。。哎。。一直出问题。不知道是不是IRQL的问题。
我想应该不会是了 我的驱动本来用的不分页的内存。然后ntoskrnl.exe访问就不会出现缺页异常了。 应该可以的啊,。
2008-4-18 21:09
0
雪    币: 18
活跃值: (2079)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
死机后的尸体
2008-4-18 21:15
0
雪    币: 18
活跃值: (2079)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
这个蓝屏是因为加载驱动的时候访问了不存在的页。
如果不加hook代码 就不会出现这个问题。
2008-4-19 01:23
0
雪    币: 18
活跃值: (2079)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
求一份HOOK内核函数的代码 可以编译的。C的都可以。
把我搞郁闷了 。。
2008-4-19 01:56
0
雪    币: 235
活跃值: (23)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
http://bbs1.pediy.com/showthread.php?p=285856这个不就是么
2008-4-19 07:49
0
雪    币: 18
活跃值: (2079)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
发现了个问题。其实我的hook代码没问题。可能是驱动模式问题。
我用汇编写的KMD驱动。。晕。。不能这样。。
但是用DDK编译的C版本的驱动就可以这样HOOK。
为什么????谁帮我把DDK编译link的时候的参数贴出来下。。谢谢。
2008-4-20 18:02
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
你先检测下被HOOK函数前5字节是不是完整的OPCODE。如果不是就要HOOK 完整的OPCODE。
2008-4-21 19:41
0
游客
登录 | 注册 方可回帖
返回
//