首页
社区
课程
招聘
[求助]弱弱的问个SSDT HOOK的问题(附带完整源码)
发表于: 2009-10-3 14:48 4591

[求助]弱弱的问个SSDT HOOK的问题(附带完整源码)

2009-10-3 14:48
4591
最近试着用汇编写个驱动,遇到个问题想向大家请教:
我只是想简单地弄个SSDT HOOK,试着写个驱动,但是驱动加载约5秒就蓝屏。。。。
蓝屏的信息是:
IRQL_NOT_LESS_OR_EQUAL
STOP:0x0000000A
(0xFFC3F82A,0x00000002,0x00000000,0x804DEC7B)后面括号里的4个地址会变。

机子用WinXPSP3,装ESET NOD32,并没有冲突。
代码在下面,编译好的驱动放在附件里了,不知道哪里出错了,谢谢。

.386
.model flat,stdcall
option casemap:none

include ntddk.inc
include ntstatus.inc
include ntoskrnl.inc
includelib ntoskrnl.lib
include Strings.mac

.data?
OldZwQueryDirectoryFile dd ?
.code
DriverEntry proc pDriverObject:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRING

        LOCAL pDeviceObject:PVOID
        LOCAL Status:NTSTATUS

        mov eax,STATUS_DEVICE_CONFIGURATION_ERROR
        mov Status,eax
        pushad
        mov eax,pDriverObject
        assume eax:ptr DRIVER_OBJECT
        mov [eax].DriverUnload,offset DriverUnload
        assume eax:nothing
        mov edi,KeServiceDescriptorTable
        mov edi,[edi]
        mov eax,[edi+(091h*4)]
        mov OldZwQueryDirectoryFile,eax
        cli
        mov eax,CR0
        and eax,not 10000h
        mov CR0,eax
        mov [edi+(091h*4)],dword ptr offset NewZwQueryDirectoryFile
        mov eax,CR0
        or eax,10000h
        mov CR0,eax
        sti
        mov Status,STATUS_SUCCESS
        popad
        mov eax,Status
        ret

DriverEntry endp

DriverUnload proc pDRIVER_OBJECT:PDRIVER_OBJECT

        pushad
        mov edi,KeServiceDescriptorTable
        mov edi,[edi]
        cli
        mov eax,CR0
        and eax,not 10000h
        mov CR0,eax
        mov eax,dword ptr OldZwQueryDirectoryFile
        mov [edi+(091h*4)],eax
        mov eax,CR0
        or eax,10000h
        mov CR0,eax
        sti
        popad
        ret

DriverUnload endp

NewZwQueryDirectoryFile proc

        jmp dword ptr OldZwQueryDirectoryFile
        ret

NewZwQueryDirectoryFile endp

end DriverEntry

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
就是一加载就BSOD,不懂代码哪里出错了。
2009-10-4 11:56
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
你还是先学学如何调试驱动和分析dump吧,写驱动经常会碰到蓝屏,自己学学怎么处理怎么分析,不能每次蓝了都去问别人吧?
2009-10-4 12:23
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
帮你调试了一下,分析如下:
f8d7b299 bf20b3d7f8      mov     edi,0F8D7B320h //注意这里,并不是KeServiceDescriptorTable,而是导入表中指向KeServiceDescriptorTable的指针
f8d7b29e 8b3f            mov     edi,dword ptr [edi]
f8d7b2a0 8b8744020000    mov     eax,dword ptr [edi+244h]
f8d7b2a6 a340b3d7f8      mov     dword ptr ds:[F8D7B340h],eax
f8d7b2ab fa              cli
f8d7b2ac 0f20c0          mov     eax,cr0
f8d7b2af 25fffffeff      and     eax,0FFFEFFFFh
f8d7b2b4 0f22c0          mov     cr0,eax
f8d7b2b7 c787440200000fb3d7f8 [COLOR="Red"]mov dword ptr [edi+244h],0F8D7B30Fh [/COLOR]ds:0023:805533c4=805533c0

执行到f8d7b2b7 ,此时edi应该指向KiServiceTable才对
kd> r edi //看看edi到底指向什么了?
edi=80553180
//此时edi+244h=805533c4,该指针指向的内容为805533c0
kd> u 805533c0 
nt!KiTimerTableListHead+0x1c0:  //看到了吧,实际指向了这儿,你改错地方了,所以蓝屏
805533c0 c03355          sal     byte ptr [ebx],55h
805533c3 80c033          add     al,33h
805533c6 55              push    ebp
805533c7 80f038          xor     al,38h
805533ca 0d82f0380d      or      eax,0D38F082h
805533cf 82d033          adc     al,33h
805533d2 55              push    ebp
805533d3 80d033          adc     al,33h
kd> u edi //看看现在edi到底指向哪儿了?
nt!KeServiceDescriptorTable:
80553180 3020            xor     byte ptr [eax],ah
80553182 50              push    eax
80553183 800000          add     byte ptr [eax],0
80553186 0000            add     byte ptr [eax],al

此时[edi]才是你真正此时想要的KiServiceTable
所以,你的思路没有错,但是编译器给你开了个玩笑,你代码中的KeServiceDescriptorTable只是个引子,而不是你想要的内容~~
应该改成这个样子:
mov edi,KeServiceDescriptorTable
mov edi,[edi] //执行这句后,edi才真正指向KeServiceDescriptorTable
mov edi,[edi] //edi指向KiServiceTable
mov eax,[edi+(091h*4)] //保存原始值

所以,你还是你学会调试驱动吧~~
2009-10-4 12:54
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢achillis的回答!
2009-10-4 13:07
0
游客
登录 | 注册 方可回帖
返回
//