首页
社区
课程
招聘
[求助][求助]hook ntdll.KiFastSystemCall的问题
发表于: 2009-9-30 13:29 16073

[求助][求助]hook ntdll.KiFastSystemCall的问题

2009-9-30 13:29
16073
ntdll中调用ntdll.KiFastSystemCall的代码如下
7C92D92E >/$  B8 AD000000                 mov     eax, 0AD
7C92D933  |.  BA 0003FE7F                 mov     edx, 7FFE0300
7C92D938  |.  FF12                        call    dword ptr [edx]  // call ntdll.KiFastSystemCall
7C92D93A  \.  C2 1000                     retn    10

ntdll.KiFastSystemCall的代码如下
7C92E510 >/$  8BD4                        mov     edx, esp  // ntdll.KiFastSystemCall
7C92E512  |.  0F34                        sysenter
7C92E514 >\$  C3                          retn  // ntdll.KiFastSystemCallRet


我想到有2种hook方式,但是都有问题
1.修改7FFE0300中的地址,指向我实现的hook函数
通过写程序测试,7FFE0300的内存是无法修改的
2.在7C92E510 >/$  8BD4                        mov     edx, esp处jmp到我的hook函数
jmp到的hook函数的代码需要占用5字节,覆盖了7C92E514 >\$  C3                          retn,我的hook函数中调用sysenter后返回到了7C92E514,这个地址已经被jmp指令覆盖,因此出错了

想请教的问题是
1.有没有办法修改7FFE0300处的内容
2.有没有办法修改调用sysenter后返回的地址

或者各位大牛有什么好的hook ntdll.KiFastSystemCall的方法,希望能得到各位的帮忙,谢谢..

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

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
ring3下搞这个位置实在没意义啊~
2009-9-30 16:11
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
代码总共没几行,有心人完全自己实现都可以
2009-9-30 16:12
0
雪    币: 287
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
我想说的是
菜鸟很多时候是在做无意义的事情
感谢achillis的回复 除了能压制一下我学习的热情外 实在没有别的任何用处..
2009-9-30 17:47
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
7C92EB8B >  8BD4                   mov edx,esp
7C92EB8D    0F34                   sysenter
7C92EB8F    90                     nop
7C92EB90    90                     nop
7C92EB91    90                     nop
7C92EB92    90                     nop
7C92EB93    90                     nop
7C92EB94 >  C3                     retn

我的怎么有NOP呢?我是XP sp2
2009-9-30 19:58
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
我无意压制你的热情,那就说点有用的吧~
从你给的地址来看,7C92E510是KiFastSystemCall,7C92E514是KiFastSystemCallRet
这两个地址是固定的,都写在SharedUserData里面,也就是7FFE0000这块内存里,无法修改
但是这两个地方的指令都是可以改的啊,思想灵活一点~~
jmp有5个字节,太长,但是可以用短跳啊(2个字节),跳到一个比较近的地方(还是在ntdll里面,离KiFastSystemCall不远,找一个是NOP的地方),然后再跳一次到你的hook函数,二级跳,明白?
返回时,系统会固定地返回到7C92E514这个地址(也就是KiFastSystemCallRet),这地方本来是个retn指令,但是你可以改成jmp什么的,随便你~~
我以我的系统为例,给你作个简单例子:
(在我的系统上,7C92EB8B是KiFastSystemCall,7C92EB94是KiFastSystemCallRen)
7C92EB8B > /EB 13                  jmp short ntdll.7C92EBA0 //先来个短跳
7C92EB8D   |0F34                   sysenter
7C92EB8F   |90                     nop
7C92EB90   |90                     nop
7C92EB91   |90                     nop
7C92EB92   |90                     nop
7C92EB93   |90                     nop
7C92EB94 >-|E9 DF6AAD83            jmp GetSyste.00405678 //sysenter会返回到这里,把retn改为jmp
7C92EB99   |90                     nop
7C92EB9A   |90                     nop
7C92EB9B   |90                     nop
7C92EB9C   |8D6424 00              lea esp,dword ptr ss:[esp]
7C92EBA0   \E8 8F26AD83            call GetSyste.00401234 //这里可以是jmp可以是call,控制权拿到,剩下的随你便,注意栈
7C92EBA5 >^ EB E6                  jmp short ntdll.7C92EB8D //再跳回去执行sysenter,其实可以自己实现,就一句指令嘛
7C92EBA7    90                     nop
7C92EBA8    90                     nop

没什么太难的,特别需要注意的是栈的平衡~~

ps: 平时都用手机上的,今天难得用一次电脑
2009-9-30 20:27
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
再强调一下,正常调用时必然走KiFastSystemCall,返回时必然到KiFastSystemCallRet,除了这两个指针不能改,其它都可以~~
2009-9-30 20:34
0
雪    币: 339
活跃值: (29)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
热心的achillis,表示支持
2009-9-30 20:45
0
雪    币: 287
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
呵呵 真心感谢achillis 虽然我也想到了这个方法
但这个方法有个缺陷 就是如果在短跳范围0xFF内没有可用作补丁的地址 那又该怎么办呢~
再次感谢achillis的指点 谢谢~
2009-9-30 21:00
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
短跳范围内一般都是可以找到5个nop的,假如真的没有,那么把SEH Handler替换掉,然后只用改一个字节就可以了,0xCC
2009-9-30 21:09
0
雪    币: 287
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
热心的achillis 受教了 谢谢..
2009-9-30 21:22
0
雪    币: 324
活跃值: (113)
能力值: ( LV15,RANK:280 )
在线值:
发帖
回帖
粉丝
12
学习.
思考:
1 能不能写个简单的驱动程序,在ring0层修改7ffe3000处内容。
2 自己的hook函数在在用户地址空间,系统空间调用户空间函数,有没有可能出错。

希望看到楼主最后的解决办法和结果。
2010-7-7 17:33
0
雪    币: 379
活跃值: (152)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
13
7C92D92E >/$  B8 AD000000                 mov     eax, 0AD
7C92D933  |.  BA 0003FE7F                 mov     edx, 7FFE0300
7C92D938  |.  FF12                        call    dword ptr [edx]  // call ntdll.KiFastSystemCall
7C92D93A  \.  C2 1000                     retn    10

mov edx,xxxxx[你函数的地址]
hook执行后在你的程序加上mov     edx, 7FFE0300,记得先要pushad、pushfd
再跳到7C92D938 这里执行ntdll.KiFastSystemCall不就可以,为什么不自己在后面写 call    dword ptr [edx] ,也可以,但是还要平衡堆栈,简单点,不用二次短跳
2010-7-7 18:43
0
游客
登录 | 注册 方可回帖
返回
//