首页
社区
课程
招聘
[原创]初学驱动——绕过DNF的Inline Hook
发表于: 2009-4-5 16:31 51494

[原创]初学驱动——绕过DNF的Inline Hook

2009-4-5 16:31
51494
事先声明:发表这篇文章目的只为交流学习,以及提醒TX“贵公司的网游有此漏洞,望尽快修复,还玩家们一个公平的游戏空间!”,如有人将此代码用于不法用途,本人概不负责!
另本文为本菜鸟学习驱动一个月的笔记文章,高手请飘过~~~

众所周知,DNF的驱动Inline Hook了几个函数,我只研究了NtOpenProcess这个函数,发现其在NtOpenProcess函数调用ObOpenObjectByPointer的地方下了个跳转,跳转到DNF自身的代码里面,从而使其他程序无法通过此函数获取DNF的进程句柄而达到保护的目的。此外,DNF的驱动还Inline Hook了NtReadVirtualMemory和NtWriteVirtualMemory函数,使其他程序无法随意修改DNF的进程内存。

我首先想到的当然是经典常规的恢复Inline Hook法了,可惜DNF的驱动一检测到Hook被恢复便马上重启电脑= = ,于是天真无邪的A计划落空了。。。。

然后我又想到在DNF的跳转之前下个跳转,由我的代码来实现ObOpenObjectByPointer函数的功能后再返回NtOpenProcess,以绕过DNF的跳转指令,但是我发现DNF实在太BT了,只要是修改了其跳转指令前的某条指令即可引起DNF的报警,没办法,B计划的也落空了。。。。

后来我看到了堕落天才大虾的文章《SSDT Hook的妙用-对抗ring0 inline hook》,然后想到了一个比较笨,但是很实用的方法,就是在游戏启动前先把NtOpenProcess整个函数的代码保存下来,再SSDT Hook,把地址指向我的代理函数。但是后来我发现DNF的驱动貌似还有个保护机制 ,我估计是每隔一段时间检测系统是否有调用NtOpenProcess函数,没有的话就又弹出那个经典的“发现非法模块”的窗口= =! 。于是我在我的驱动里面做了个代理函数,函数里面先调用被DNF修改了的NtOpenProcess,丢弃返回值后再调用我保存的代码,最后返回这次的句柄,这时DNF就完全没有做声了!最后我们再来恢复一下NtReadVirtualMemory和NtWriteVirtualMemory函数的Inline Hook就万事大吉了~~~

这种方法可能通用性不强,因为事先没有知道NtOpenProcess函数代码占用的大小,我只在我XP SP2 Build 2600的机子上测试通过,请大家注意这一点,用WinDbg查看下具体大小然后在我的代码里面修改下值就可以了。此方法也能绕过冰刃的Inline Hook,但是前提是要在这些软件驱动前加载本驱动。
最后非常感谢堕落天才大虾的文章,还有就是衷心希望TX能尽快修复此漏洞,还玩家们一个公平的游戏空间!

完整驱动代码的地址:http://download.csdn.net/source/1177008

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (68)
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
遇到 挂钩太深 就挂了

unpack.cn

有份ASM代码

过完所有TX游戏

只是具体有些偏移需要调整

至今没封

原因不明
2009-4-5 17:04
0
雪    币: 208
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
那份ASM代码我看过了,和一起给出的驱动IDA出来的代码完全不一样。。。驱动应该早就封了的,但是我不知道那份代码是干什么用的,为什么要一起给出来?。。。
2009-4-5 17:25
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
没封,还好好的
2009-4-5 17:32
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
在 UNPACK 共两份

PASS开头那份至今没封

你说给出的驱动不知道你什么意思

那代码的作用是过完TX的驱动保护
2009-4-5 17:35
0
雪    币: 208
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我在猴岛下载的,驱动的文件名是SYSFuncHook.sys,另外还有个EXE是带毒的我脱掉了,不知道你下载到的版本和我的是不是一样。。。
2009-4-5 17:42
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
请看好

UNPACK.CN

作者就发到那

只提供代码

其他的论坛都不是作者发的

作者都说了
2009-4-5 17:45
0
雪    币: 208
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
;write by y3y3y3 from www.unpack.cn
.386
.model flat, stdcall
option casemap:none

include C:\RadASM\masm32\include\w2k\ntstatus.inc
include C:\RadASM\masm32\include\w2k\ntddk.inc
include C:\RadASM\masm32\include\w2k\ntoskrnl.inc
include C:\RadASM\masm32\include\w2k\w2kundoc.inc
includelib C:\RadASM\masm32\lib\w2k\ntoskrnl.lib
include C:\RadASM\\masm32\Macros\Strings.mac

   
.data
CCOUNTED_UNICODE_STRING "KeAttachProcess",KeAttachProcess_String,  4
CCOUNTED_UNICODE_STRING "PsCreateSystemThread", PsCreateSystemThread_String, 4
CCOUNTED_UNICODE_STRING "ObOpenObjectByPointer",ObOpenObjectByPointer_String,4
CCOUNTED_UNICODE_STRING "NtOpenProcess",NtOpenProcess_String,4
CCOUNTED_UNICODE_STRING "NtOpenThread", NtOpenThread_String,4
PsCreateSystemThread_addr dd ?
NtWriteVirtualMemory_addr dd ?
NtReadVirtualMemory_addr  dd ?
ObOpenObjectByPointer_addr dd ?
NtOpenThread_addr dd ?
NtOpenProcess_addr dd ?
KiAttachProcess_addr dd ?
NtWriteVirtualMemory_oldbyte db 10 dup (0)
PsCreateSystemThread_oldbyte db 10 dup (0)
NtReadVirtualMemory_oldbyte  db 10 dup (0)
KiAttachProcess_oldbyte db 10 dup (0)
threadproc dd ?
sysbase dd ?
hook    dd ?
………………
*********************************************
哦,不好意思,我真搞错了。。。你说的是这个代码吧?这个代码我真没看过,研究下。。。
2009-4-5 18:23
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
是这代码。。。。。。
2009-4-5 19:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感觉腾讯的东西不要动的好~~~
小心老马的“别动队”人员把你逮去南山法院
2009-4-5 20:26
0
雪    币: 208
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
额。。。10楼提醒的是,我仅为技术研究哈。。。
2009-4-5 21:42
0
雪    币: 308
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
不错!谢谢分享!
2009-4-5 22:11
0
雪    币: 22
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
一旦出现危险,可以采取以下方法
将所有技术资料散播开,让他们晕头转向,在互联网四处传播,注册大量马甲,即可
最后,上网的人都会造外挂,那抓谁呢,不是喜欢抓的?叫他们慢慢追究。

喜欢做挂的,那这辈子注定,你就老天奉命的,你必须违法,要不你只有自尽

只有不上看雪学院,只有不懂什么叫外挂的人,才是最安全,自然,也是最可爱的啦
2009-4-6 18:31
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我也想学驱动,从哪开始好?我是初学初学再初学者......
2009-4-6 21:03
0
雪    币: 208
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我是看罗云彬翻译的《Four-F的驱动开发教程》,可惜太菜很多都没怎么看明白。。。希望有高人能跟帖指导下
2009-4-6 21:34
0
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
不懂不懂的问一句,能不能调试下驱动,然后看它的判断在哪里,

最后就暴力把它代码给改了行不?,就好像patch破R3的一般程序一样
2009-4-6 22:02
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
TX的驱动,完全可以这样
2009-4-6 22:29
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
看了楼主修复 CALL 和 JXX 的函数,狂晕了一下,这C不是一般难懂,下面来个ASM版本的

fixcode proc  PCopyNtOpenProcess_addr:dword,PNtOpenProcess_addr:dword,PNtOpenProcess_Size:dword
       ;write by fixfix
        pushad
        mov edi,PCopyNtOpenProcess_addr
        mov ecx,PNtOpenProcess_Size
        mov esi,PNtOpenProcess_addr
        rep movsb
        popad
        
        pushfd
        pushad
        xor ecx,ecx
        mov eax,PNtOpenProcess_addr
j:      cmp PNtOpenProcess_Size,ecx
        jne @F
        popad
        popfd
        ret 12
@@:     cmp byte ptr [eax],0e8h
        jne @f
        mov edx,dword ptr [eax+1]
        lea esi,dword ptr [eax+edx+5]
        mov edi,PCopyNtOpenProcess_addr
        add edi,ecx
        sub esi,edi
        sub esi,5
        mov dword ptr [edi+1],esi
        add eax,5
        add ecx,5
        jmp j
@@:     cmp byte ptr [eax],0fh
        jne @F
        cmp byte ptr [eax+1],8Fh
        jg @F
        mov edx,dword ptr [eax+2]
        lea esi,dword ptr [eax+edx+6]
        mov edi,PCopyNtOpenProcess_addr
        add edi,ecx
        sub esi,edi
        sub esi,6
        mov dword ptr [edi+2],esi
        add eax,6
        add ecx,6
        jmp j
@@:     inc eax
        inc ecx
        jmp j
fixcode endp
2009-4-7 14:33
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
恢复Inline Hook 方法,能说一下吗,有没有只恢复Inline Hook就可以搞定的程序让我学习一下,介绍一个。

我想先从怎么恢复Inline Hook开始学习,还有。。如何知道什么函数被 Inline Hook了
2009-4-7 14:33
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
RKU之类的内核工具扫描下
2009-4-7 14:34
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
我是个什么都没懂的初学者,内核工具说一下名字吧,我得先搞明白全过程的第一步
2009-4-7 14:37
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
Rootkit Unhooker

google 下
2009-4-7 14:39
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
谢谢指点
2009-4-7 14:43
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
用RKU看了一下Np,只Hook了NtUserPostMessage;奇怪的是我做了一个遍历进程获取窗口名的东西一开,Np就弹个大红叉叉了,这是什么原因呢?

我用了EnumWindows,GetWindowText和GetWindowThreadProcessId,在RKU里面没找到这3个API

是不是级别不在一个层次里(R0?R3?)

如果要看前面3个API有没给Hook掉要怎么做?
2009-4-7 17:02
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
你程序用到 OPENPROCESS ?

R3下面就是R0 了
2009-4-7 17:04
0
游客
登录 | 注册 方可回帖
返回
//