ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
阅读:3493回复:39

关于任意勾挂内核函数的的问题

楼主#
更多 发布于:2002-06-20 10:05
    我的思路是找到该函数的内存地址,反向查找页表所在的位置,修改页表的内容,然后将函数的前几个字节保存起来,并且通过一条jump指令让他跳到我的函数的地址。事后再恢复原来的内容。有愿意讨论的,请在此发表贴子或者给我发信,我的信箱在我的资料里有。

最新喜欢:

zackaryzackar...
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-20 10:11
有一定道理,有些像DOS时代的挂接。
希望你有经验了告诉我们。
谢谢 :(
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-20 10:18
http://www.driverdevelop.com/forum/viewthread.php?tid=14170
http://www.driverdevelop.com/forum/viewthread.php?tid=13170
eqinzm
驱动牛犊
驱动牛犊
  • 注册日期2001-10-18
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-06-20 10:18
大部分内核函数都可以通过修改KeServiceDescriptorTable
这个表来实现
而改jmp这种做法在翻译软件中相当流行
Hi
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-20 10:21
大部分内核函数都可以通过修改KeServiceDescriptorTable
--------------------------------------------------------------------------
这是对系统服务而言,并不是对内核函数(Ke**、Mm**...)
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-20 10:48
大部分内核函数都可以通过修改KeServiceDescriptorTable
这个表来实现
而改jmp这种做法在翻译软件中相当流行

大兄弟,那只有2000才有这东西啊 :(
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
eqinzm
驱动牛犊
驱动牛犊
  • 注册日期2001-10-18
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-06-20 11:18
2k下面很多函数都是系统服务调用的
Hi
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-20 11:27
是啊,不过很多时候是需要钩挂内核函数的。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
8楼#
发布于:2002-06-20 12:25
   我的思路是找到该函数的内存地址,反向查找页表所在的位置,修改页表的内容,然后将函数的前几个字节保存起来,并且通过一条jump指令让他跳到我的函数的地址。事后再恢复原来的内容。有愿意讨论的,请在此发表贴子或者给我发信,我的信箱在我的资料里有。


多线程的情况怎么办?
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-06-20 13:48
多线程的情况怎么办?
-----------------------------------------------------------------------
自己的例程可重入就行
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
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 )

问题看起来并不难,可是由于内核函数所在的物理页是不能写的,所以才要修改页表项。但是我发现它的页表项有是杂乱无章,是我做的不对还是怎么回事,还请高人指点。
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-06-20 14:10
由于内核函数所在的物理页是不能写的
------------------------------------------------------------------------
装了softice不会,因为它会改变2000内存保护策略。可以直接写。

页表项有时杂乱无章
-----------------------------------------------------------------------
?什么时?怎样杂?
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-06-20 14:37
不好做,我一早就考虑过这种方法,可是要考虑该函数的编译是按照PASCAL还是按照C的风格来编译,因为他们的堆栈处理不一样,还有就是对于变参数的函数也没有办法
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-06-20 16:15
要考虑该函数的编译是按照PASCAL还是按照C的风格来编译
--------------------------------------------------------------------------
呵呵,仅仅对内核函数的话自然是__stdcall风格,没有变参的。是做过的呀。
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2002-06-20 17:10
there is exception.

ntoskrnl.DbgPrint is cdecl style.
ScsiPortNotification is also...

[编辑 -  6/20/02 by  zdhe]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-06-20 18:26
yeah
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
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。
我觉得页表里的各项的数据应该是页对齐的,所以我觉得我得到数据是错误的。:(

pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-06-20 19:25
但是问题的关键是如果不装softice怎样处理让它可写呢
--------------------------------------------------------------------------
对内核程序而言,在x86上唯一限制它不能随便写存在页的因素是CR0的WP位,你在程序中将其清除即可。搞定再恢复。
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-06-20 20:05
pjf,谢了!!!
对,我看得不仔细!!!我就是粗心,谢谢,给分,不过惭愧的是我总共才有四分!:(
有机会请你吃饭!我的信箱是shxy2000cn@yahoo.com.cn.
另外,我觉得我得到的页表内容是不对的,您说问题可能处在什么地方?
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-06-20 20:33
呵呵,你找到的页表项的线性地址是多少?
上一页
游客

返回顶部