阅读:2813回复:10
驱动中怎样分配可执行内存?
我hook ntfs的dispatch的时候,发现可以在winobj中看到我的驱动hook了哪个dispatch。我想如果在内核中分配一块可执行的内存,把我的代码复制过去再hook,winobj应该是不知道是哪个驱动hook的了。
但是ExAllocatePool***这些函数,我看来ddk,貌似都没有分配可执行内存的参数呢? 恳请哪位知道的大哥指点一下。。。 |
|
沙发#
发布于:2007-06-03 14:07
自己顶一下了。
会还是不会的牛人都顶一顶噻。。。 |
|
板凳#
发布于:2007-06-03 16:58
内核中就用ExAllocatePoolxx分配就可以了
|
|
|
地板#
发布于:2007-06-03 17:51
直接分配一块NonPagePool复制了代码就可以跑啦!
|
|
|
地下室#
发布于:2007-06-04 12:16
直接复制不可以,需要改变内存属性.自己改页表里的NX属性吧,哈哈.
|
|
|
5楼#
发布于:2007-06-04 13:20
内存属性应该是不用改的
例如某流氓的代码: .text:00011150 .text:00011150 sub_11150 proc near ; CODE XREF: .text:loc_112C9p .text:00011150 .text:00011150 Handle = dword ptr -4 .text:00011150 .text:00011150 000 51 push ecx .text:00011151 004 68 00 1D 01 00 push offset Timer ; Timer .text:00011156 008 FF 15 E4 02 01 00 call ds:KeInitializeTimer .text:0001115C 004 68 44 64 6B 20 push 206B6444h ; Tag .text:00011161 008 6A 20 push 20h ; NumberOfBytes .text:00011163 00C 6A 00 push 0 ; PoolType .text:00011165 010 FF 15 E0 02 01 00 call ds:ExAllocatePoolWithTag .text:0001116B 004 85 C0 test eax, eax .text:0001116D 004 75 04 jnz short loc_11173 .text:0001116D .text:0001116F 004 32 C0 xor al, al .text:00011171 004 59 pop ecx .text:00011172 000 C3 retn .text:00011172 .text:00011173 ; --------------------------------------------------------------------------- .text:00011173 .text:00011173 loc_11173: ; CODE XREF: sub_11150+1Dj .text:00011173 004 33 C9 xor ecx, ecx .text:00011175 004 56 push esi .text:00011176 008 57 push edi .text:00011177 00C 8B D0 mov edx, eax .text:00011179 00C 89 0A mov [edx], ecx .text:0001117B 00C 89 4A 04 mov [edx+4], ecx .text:0001117E 00C 89 4A 08 mov [edx+8], ecx .text:00011181 00C 68 00 05 01 00 push offset sub_10500 ; StartContext .text:00011186 010 89 4A 0C mov [edx+0Ch], ecx .text:00011189 010 50 push eax ; StartRoutine .text:0001118A 014 89 4A 10 mov [edx+10h], ecx .text:0001118D 014 6A 00 push 0 ; ClientId .text:0001118F 018 89 4A 14 mov [edx+14h], ecx .text:00011192 018 6A 00 push 0 ; ProcessHandle .text:00011194 01C 89 4A 18 mov [edx+18h], ecx .text:00011197 01C 6A 00 push 0 ; ObjectAttributes .text:00011199 020 8B F8 mov edi, eax .text:0001119B 020 89 4A 1C mov [edx+1Ch], ecx .text:0001119E 020 6A 00 push 0 ; DesiredAccess .text:000111A0 024 8D 44 24 20 lea eax, [esp+24h+Handle] .text:000111A4 024 B9 08 00 00 00 mov ecx, 8 .text:000111A9 024 BE 30 11 01 00 mov esi, offset loc_11130 .text:000111AE 024 50 push eax ; ThreadHandle .text:000111AF 028 F3 A5 rep movsd .text:000111B1 028 FF 15 D0 02 01 00 call ds:PsCreateSystemThread .text:000111B7 00C 8B 4C 24 08 mov ecx, [esp+0Ch+Handle] .text:000111BB 00C 51 push ecx ; Handle .text:000111BC 010 FF 15 8C 02 01 00 call ds:ZwClose .text:000111C2 00C 5F pop edi .text:000111C3 008 B0 01 mov al, 1 .text:000111C5 008 5E pop esi .text:000111C6 004 59 pop ecx .text:000111C7 000 C3 retn .text:000111C7 .text:000111C7 sub_11150 endp .text:000111C7 |
|
|
6楼#
发布于:2007-06-04 13:29
直接应该可以,至少我的机器行
|
|
7楼#
发布于:2007-06-05 08:05
直接可以?我试试哈。
那天看到一篇文章说内核也有DEP,如下。我还以为不能执行呢。 我先实验一下了来哈。 /* • 内核模式 DEP 对于用户模式和内核模式,DEP 的工作原理相同。在内核模式下,不能分别为每个驱动程序启用或禁用内存区域 DEP。默认情况下,在 32 位 Windows 版本上,DEP 仅适用于堆栈。在 64 位 Windows 版本上,DEP 适用于堆栈、页面缓冲池和会话池。内核模式下的访问冲突将导致出现 Bugcheck 0x000000FC: ATTEMPTED_EXECUTE_OF_NONEXECUTE_MEMORY。 兼容性问题 */ |
|
8楼#
发布于:2007-06-05 10:44
记得有资料说过,Vista上PagedPool是不可执行的,NonPagedPool可以执行。
|
|
|
9楼#
发布于:2007-06-05 11:03
NonPagedPool...这上面的代码有要求吧~不小心就蓝屏了~
好几次都是IRQL问题~ |
|
|
10楼#
发布于:2007-06-06 09:10
恩,实验了一下。果然能执行。
谢谢各位指点哈。 不过killvxk说的IRQL应该是个问题。 |
|