首页
论坛
专栏
课程

[原创]分享比较完整的ROOTKIT DEMO! 原来Shadow Hook和SSDT Hook一样容易!

2008-8-5 23:37 103159

[原创]分享比较完整的ROOTKIT DEMO! 原来Shadow Hook和SSDT Hook一样容易!

2008-8-5 23:37
103159
这里写的ROOTKIT比较简单(有些代码是消化别人的代码后改写过来的),高手跳过.......
包含以下内容:(详细请看源代码)
SSDT Hook
//hook system call
#define HOOK_SYSCALL(FuncName, pHookFunc, pOrigFunc ) \
          pOrigFunc = (PVOID)InterlockedExchange( \
          (PLONG)&MappedSystemCallTable[ SYSCALL_INDEX(FuncName) ], \
          (LONG)pHookFunc)
      
//unhook system call   
#define UNHOOK_SYSCALL(FuncName, pHookFunc, pOrigFunc ) \
          InterlockedExchange( \
          (PLONG)&MappedSystemCallTable[ SYSCALL_INDEX(FuncName) ],\
          (LONG)pOrigFunc)
SSDT HOOK了如下函数:
ZwQueryValueKey
ZwEnumerateValueKey
ZwQueryDirectoryFile
ZwOpenProcess
ZwDeleteKey
ZwDeleteValueKey
ZwSaveKey
ZwLoadDriver
ZwSetSystemInformation
ZwTerminateProcess

Shadow Hook
仿照SSDT HOOK,下面定义两个宏,让Shadow Hook和SSDT Hook一样简单!
//hook shadow system call
#define HOOK_SHADOW_SYSCALL(SysCallIndex, pHookFunc, pOrigFunc ) \
          pOrigFunc = (PVOID)InterlockedExchange( \
          (PLONG)&MappedSystemCallTable[ (SysCallIndex) ], \
          (LONG)pHookFunc)
      
//unhook shadow system call   
#define UNHOOK_SHADOW_SYSCALL(SysCallIndex, pHookFunc, pOrigFunc ) \
          InterlockedExchange( \
          (PLONG)&MappedSystemCallTable[ (SysCallIndex) ],\
          (LONG)pOrigFunc)
上周一接到腾讯的电话面试,由于有一段时间没研究HOOK了,问到Shadow Hook时没回答好!汗!
现在把Shadow Hook重新整理了一下!
Shadow Hook了如下函数,程序框架比较好,容易加入新挂钩函数
NtUserFindWindowEx
NtUserGetForegroundWindow
NtUserQueryWindow
NtUserBuildHwndList
NtUserWindowFromPoint
NtUserSetWindowsHookEx
NtUserGetDC
NtUserGetDCEx
NtUserSendInput

为了保护进程,研究了终止进程的方法
WINDOWS内核定时器
老土的文件/目录隐藏
注册表键值隐藏
驱动隐藏
系统线程
IRP文件操作

多种加载内核级ROOTKIT方法
Ring3中恢复SSDT(ZwSystemDebugControl)
从资源释放文件
远程进程注入
消息钩子注入DLL
查找窗口
查找进程

注意:不要随便运行程序,最好在虚拟机下运行!此程序仅供学习WINDOWS内核驱动编程用!
在自己的ntddk.h中的结构IO_STACK_LOCATION添加如下代码才能顺利通过编译:
//Parameters for IRP_MJ_DIRECTORY_CONTROL
struct {
   ULONG Length;
   PUNICODE_STRING FileName;
   FILE_INFORMATION_CLASS POINTER_ALIGNMENT \
   FileInformationClass;
} QueryDirectory;
下面两图分别是程序启动信息和在Ring0恢复SSDT:




[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

上传的附件:
最新回复 (116)
embedlinux 1 2008-8-5 23:46
2
0
自己顶一下!
笨奔 1 2008-8-5 23:54
3
0
晕,一上来就碰到如此好贴,赞个先。受教了。
embedlinux 1 2008-8-6 00:00
4
0
欢迎对程序提出意见, 多多交流!
yjcpu 1 2008-8-6 00:22
5
0
[QUOTE=;]...[/QUOTE]
又见RootKit,危险
embedlinux 1 2008-8-6 00:28
6
0
ROOTKIT主要看是用在哪些地方啊!有时也是很多帮助的!这里只是为了学习WINDOWS底层HOOK编程!
nevergone 3 2008-8-6 07:49
7
0
学习
LZ代码写得很好
sudami 25 2008-8-6 08:42
8
0
谢谢分享。

学习~
鸡蛋壳 2008-8-6 10:22
9
0
可以做个OD插件。
xPLK 3 2008-8-6 10:26
10
0
其实那个宏可以简化一点的。
虽然那样写看着方便但是没必要。

///////
写得不错额~

不过感觉那个HookOfZwOpenProcess这样写不通用。

push   0C4h       //push 0C4h     68c4000000  用WinDbg查看
push   804daa90h  //push 804daa90 6890aa4d80
jmp   [JmpNtOpenProcessAddr]
embedlinux 1 2008-8-6 13:38
11
0
HookOfZwOpenProcess这样写主要为了对付inline hook!
cvcvxk 10 2008-8-6 13:57
12
0
还算不错,综合里几年来的开源工程,大家应该谢谢楼主的分享。

在pediy混的写木马哥们赶紧膜拜楼主吧~~
Winker 8 2008-8-6 15:11
13
0
我第一个膜拜1下
xPLK 3 2008-8-6 15:34
14
0


u一下:

lkd> u NtOpenProcess
nt!NtOpenProcess:
80573d06 68c4000000      push    0C4h
80573d0b 6810b44e80      push    offset nt!ObWatchHandles+0x25c (804eb410)
lOOp 2008-8-6 18:16
15
0
学习一下
xss 4 2008-8-6 18:48
16
0
谢谢楼主的分享.
achillis 15 2008-8-6 20:55
17
0
楼主的代码不错,学习~
Winker 8 2008-8-6 22:51
18
0
XP SP3下驱动测试蓝了。
embedlinux 1 2008-8-7 01:21
19
0
只在XPSP2下测试过,用IDA反汇编一下user32.dll、gdi32.dll, 看看shadow Hook的函数索引号是否和XPSP2下的相同?
鸡蛋壳 2008-8-7 07:33
20
0
XP SP2 干净系统情况下,直接用KmdManager.exe加载蓝屏,LZ源程序改一下才能加载成功,因为系统在D盘。LZ驱动稳定性有待解决。有一个区别是本人的系统是美化版系统。
boywhp 12 2008-8-7 08:10
21
0
呵呵 不错!省得有些小东西还到处找
dayed 1 2008-8-7 09:07
22
0
非常谢LZ,顶
xPLK 3 2008-8-7 09:55
23
0
你看那个NtOpenProcess的Hook就可以看出点问题了。
achillis 15 2008-8-7 10:44
24
0
楼主说了是Demo啊,又不是成品,学习为主~
embedlinux 1 2008-8-7 11:44
25
0
热烈欢迎自己修改程序,加强稳定性和增加功能! 修改后也不要忘了分享一下哦!
Winker 8 2008-8-7 16:05
26
0
  测试并修改中。
frozenrain 2008-8-7 16:32
27
0
欢迎驱动 可惜看不懂  驱动太邪恶了
MCY 2008-8-7 17:03
28
0
非常感谢楼主,这是个好东西呀.
lopman 2008-8-7 17:37
29
0
路过,帮顶
embedlinux 1 2008-8-7 19:37
30
0
有哪位高手修改好驱动了吗?
我在XPSP2下用INSTDRV.EXE能成功加载驱动,但在卸载时,却蓝屏了!
不对SSDT HOOK ,只hook shadow,驱动能够顺利加载和卸载,估计是SSDT hooK方面出问题了! 对于SSDT HOOK, 首先恢复SSDT HOOK,然后再HOOK, 每隔几ms重新HOOK。 在没有装杀毒软件的系统中也不能正常卸载!
目前也在加紧修改中测试中!!!!
鸡蛋壳 2008-8-7 21:20
31
0
SSDT hooK 已经可能不是很好而且稳定的办法,建议研究江民驱动[hook shadow+inline hook]。
轩辕小聪 7 2008-8-7 21:36
32
0
小伟的意思是说你对原函数的内容是硬编码,在不同的系统或不同的内核文件的情况下会挂掉。
embedlinux 1 2008-8-7 22:37
33
0
我的程序采用硬编码编程兼容性很差,我在XPSP2下是:
kd> u NtOpenProcess
nt!NtOpenProcess:
805c0e1e 68c4000000      push    0C4h
805c0e23 6890aa4d80      push    offset nt!FsRtlLegalAnsiCharacterArray+0x1ff0 (804daa90)
805c0e28 e8d374f7ff      call    nt!wctomb+0x45 (80538300)
在不同系统或不同内核文件下函数前面几个字节就变了,应该写个模块直接从内核中读取函数前面几个字节!
shdow浅蓝 2008-8-8 09:58
34
0
楼主有才!!!
neverqq 2008-8-9 19:33
35
0
学习 ....
lixupeng 2008-8-9 21:00
36
0
学习下
vcfan 1 2008-8-10 02:53
37
0
很好很强大,严重支持!
kagayaki 2008-8-10 03:24
38
0
收藏!!!!
ppanger 4 2008-8-10 20:35
39
0
驱动编译错误:

irpfile.c <548> : error c2039 'QueryDirectory' : is not a member of '__unnamed'
irpfile.c <549> : error c2039 'QueryDirectory' : is not a member of '__unnamed'
irpfile.c <550> : error c2039 'QueryDirectory' : is not a member of '__unnamed'

不知是什么错误 望LZ赐教
embedlinux 1 2008-8-10 23:36
40
0
//自己的ntddk.h中添加的代码: QueryDirectory
        //Parameters for IRP_MJ_DIRECTORY_CONTROL
        struct {
            ULONG Length;
            PUNICODE_STRING FileName;
            FILE_INFORMATION_CLASS POINTER_ALIGNMENT \
            FileInformationClass;
        } QueryDirectory;
详情请用WinDbg查看IO_STACK_LOCATION 结构。
ppanger 4 2008-8-11 11:22
41
0
感谢LZ的回答 编译通过 DDK中 ntddk.h 对于 _IO_STACK_LOCATION结构确实有很多参数没有定义 再次感谢 希望LZ的项目不断更新
embedlinux 1 2008-8-11 15:18
42
0
呵呵!That's OK!
embedlinux 1 2008-8-13 23:24
43
0
今天去看了网龙,环境果然很不错!没人顶,自己顶帖子了!
reebox 2008-8-18 20:32
44
0
学习,谢谢分享!!!
梦魇颖雨 2008-9-16 18:58
45
0
确实不错。。支持一下,刚刚也要用。。。谢谢了
junxiong 1 2008-9-16 23:02
46
0
谢谢分享。
dragoneroo 2008-9-24 11:26
47
0
谢谢楼主的分享。
得到很多帮助!
nanalied 2008-9-24 14:41
48
0
弱弱的问一下。。。我不小心运行了。。。怎么才能把系统恢复过来。。。
embedlinux 1 2008-9-26 12:43
49
0
进入安全模式,打开注册表,删除
SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\Explorer\\Run
下的键就可以了!
infuse 2008-9-26 20:45
50
0
我在干净的XP sp3下加载驱动没问题
游客
登录 | 注册 方可回帖
返回