阅读:3493回复:39
关于任意勾挂内核函数的的问题
我的思路是找到该函数的内存地址,反向查找页表所在的位置,修改页表的内容,然后将函数的前几个字节保存起来,并且通过一条jump指令让他跳到我的函数的地址。事后再恢复原来的内容。有愿意讨论的,请在此发表贴子或者给我发信,我的信箱在我的资料里有。
|
|
最新喜欢:zackar... |
沙发#
发布于:2002-06-20 10:11
有一定道理,有些像DOS时代的挂接。
希望你有经验了告诉我们。 谢谢 :( |
|
|
板凳#
发布于:2002-06-20 10:18
http://www.driverdevelop.com/forum/viewthread.php?tid=14170
http://www.driverdevelop.com/forum/viewthread.php?tid=13170 |
|
地板#
发布于:2002-06-20 10:18
大部分内核函数都可以通过修改KeServiceDescriptorTable
这个表来实现 而改jmp这种做法在翻译软件中相当流行 |
|
|
地下室#
发布于:2002-06-20 10:21
大部分内核函数都可以通过修改KeServiceDescriptorTable
-------------------------------------------------------------------------- 这是对系统服务而言,并不是对内核函数(Ke**、Mm**...) |
|
5楼#
发布于:2002-06-20 10:48
大部分内核函数都可以通过修改KeServiceDescriptorTable 大兄弟,那只有2000才有这东西啊 :( |
|
|
6楼#
发布于:2002-06-20 11:18
2k下面很多函数都是系统服务调用的
|
|
|
7楼#
发布于:2002-06-20 11:27
是啊,不过很多时候是需要钩挂内核函数的。
|
|
8楼#
发布于:2002-06-20 12:25
我的思路是找到该函数的内存地址,反向查找页表所在的位置,修改页表的内容,然后将函数的前几个字节保存起来,并且通过一条jump指令让他跳到我的函数的地址。事后再恢复原来的内容。有愿意讨论的,请在此发表贴子或者给我发信,我的信箱在我的资料里有。 多线程的情况怎么办? |
|
9楼#
发布于:2002-06-20 13:48
多线程的情况怎么办?
----------------------------------------------------------------------- 自己的例程可重入就行 |
|
10楼#
发布于:2002-06-20 13:49
这个和多线程没有多大关系,不知道你说的多线程指的是什么?
关于楼上的楼上。。。说的KeServiceDescriptorTable的那个问题我知道,并且也有源码。但是我主要是想直接修改函数的地址感觉比较爽。:) 我记得在lu0的网站上有一段hook IdleProcess的程序,但是好像不工作。如果lu0同意,我把他放到这儿大家看看。 我在网上搜的一段原理性描述的资料放在这儿,希望大家多发高论,尽快把这个问题解决掉。假如我们要勾挂ExAllocatPoolWithTag 函数。 ExAllocatPoolWithTag 开始的一段会编码如下: 80109b36 55 push ebp 80109b37 8b442408 mov eax,[esp+0x8] 80109b3b 8bec mov ebp,esp 80109b3d 83e001 and eax,0x1 80109b40 83ec20 sub esp,0x20 80109b43 8945f4 mov [ebp-0xc],eax 80109b46 53 push ebx 80109b47 56 push esi 80109b48 57 push edi 修改以后的样子如下,注意看它们之间的差别 80109b36 ff25149eb4fb jmp dword ptr [fbb49e14] (HookRoutine) 80109b3c 90 nop 80109b3d 83e001 and eax,0x1 80109b40 83ec20 sub esp,0x20 80109b43 8945f4 mov [ebp-0xc],eax 80109b46 53 push ebx 80109b47 56 push esi 80109b48 57 push edi 这是我们自己的勾挂例程 HookRoutine : fbb48150 9c pushfd fbb48151 60 pushad fbb48152 6a02 push HookNumber fbb48154 e893010000 call Trace!LogTheCall fbb48159 61 popad fbb4815a 9d popfd fbb4815b 55 push ebp fbb4815c 8bec mov ebp,esp fbb4815e 83ec10 sub esp,0x10 fbb48161 ff25e09eb4fb jmp dword ptr [fbb49ee0] (NT!ExAllocatPoolWithTag+8 ) 问题看起来并不难,可是由于内核函数所在的物理页是不能写的,所以才要修改页表项。但是我发现它的页表项有是杂乱无章,是我做的不对还是怎么回事,还请高人指点。 |
|
11楼#
发布于:2002-06-20 14:10
由于内核函数所在的物理页是不能写的
------------------------------------------------------------------------ 装了softice不会,因为它会改变2000内存保护策略。可以直接写。 页表项有时杂乱无章 ----------------------------------------------------------------------- ?什么时?怎样杂? |
|
12楼#
发布于:2002-06-20 14:37
不好做,我一早就考虑过这种方法,可是要考虑该函数的编译是按照PASCAL还是按照C的风格来编译,因为他们的堆栈处理不一样,还有就是对于变参数的函数也没有办法
|
|
13楼#
发布于:2002-06-20 16:15
要考虑该函数的编译是按照PASCAL还是按照C的风格来编译
-------------------------------------------------------------------------- 呵呵,仅仅对内核函数的话自然是__stdcall风格,没有变参的。是做过的呀。 |
|
14楼#
发布于:2002-06-20 17:10
there is exception.
ntoskrnl.DbgPrint is cdecl style. ScsiPortNotification is also... [编辑 - 6/20/02 by zdhe] |
|
15楼#
发布于:2002-06-20 18:26
yeah
|
|
16楼#
发布于:2002-06-20 19:16
装了softice之后的确是可以随便写了,但是问题的关键是如果不装softice怎样处理让它可写呢?pjf提到的那个贴子我也看了,但是问题还是在这个地方。:)
至于__stdcall还是__cdecl这个倒没关系,我们可以逐个看看这些函数,因为一旦确定下来之后,改动是很小的。 我钩的是ExAllocatePool函数的地址,线性地址是 80417ba0 反向查找的页表的线性地址是 80400000 页表里16-29的内容是 ... PageTableBaseAddr[16] = eba1f0e PageTableBaseAddr[17] = cd09b400 PageTableBaseAddr[18] = 4c01b821 PageTableBaseAddr[19] = 685421cd PageTableBaseAddr[20] = 70207369 PageTableBaseAddr[21] = 72676f72 PageTableBaseAddr[22] = 63206d61 PageTableBaseAddr[23] = 6f6e6e61 PageTableBaseAddr[24] = 65622074 PageTableBaseAddr[25] = 6e757220 PageTableBaseAddr[26] = 206e6920 PageTableBaseAddr[27] = 20534f44 PageTableBaseAddr[28] = 65646f6d PageTableBaseAddr[29] = a0d0d2e .... 在这里我们需要的是第23项 6f6e6e61。 我觉得页表里的各项的数据应该是页对齐的,所以我觉得我得到数据是错误的。:( |
|
17楼#
发布于:2002-06-20 19:25
但是问题的关键是如果不装softice怎样处理让它可写呢
-------------------------------------------------------------------------- 对内核程序而言,在x86上唯一限制它不能随便写存在页的因素是CR0的WP位,你在程序中将其清除即可。搞定再恢复。 |
|
18楼#
发布于:2002-06-20 20:05
pjf,谢了!!!
对,我看得不仔细!!!我就是粗心,谢谢,给分,不过惭愧的是我总共才有四分!:( 有机会请你吃饭!我的信箱是shxy2000cn@yahoo.com.cn. 另外,我觉得我得到的页表内容是不对的,您说问题可能处在什么地方? |
|
19楼#
发布于:2002-06-20 20:33
呵呵,你找到的页表项的线性地址是多少?
|
|
上一页
下一页