首页
论坛
课程
招聘
[原创]N种内核注入DLL的思路及实现
2008-11-2 16:53 54613

[原创]N种内核注入DLL的思路及实现

2008-11-2 16:53
54613
                      《N种内核注入DLL的思路及实现》
Author :  sudami  [sudami@163.com]
Time  :  01-11-2008
Links  :  http://hi.baidu.com/sudami

    内核注入,技术古老但很实用。现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中。可能有部分人会说:“都进内核了.什么不能干?”。是啊,要是内核中可以做包括R3上所有能做的事,软件开发商们也没必要做应用程序了。有时,我们确实需要R3程序去干驱动做起来很困难或者没必要驱动中去做的事,进程 /  DLL是不错的选择,但进程目标太大,所以更多的同学趋向于注DLL

    若要开发安全软件、小型工具,可借鉴其思路,Anti Rootkits时,在某些极端情况下,可使用同样的技术发现、清除RK,保证用户电脑的正常使用。在此,我将探讨几种内核注入DLL的思路及实现原理。

                                          (1) APC技术

    给一个Alertbale的用户态线程插APC,让其执行其中的ShellCode,来执行我们的代码。这个方法简单易行,但是不够稳定,兼容性不好。测试中发现经常出现Explorer.exe等插崩溃的情况,而且有杀软在的情况下,插入有时会被拦截,起不到应有的效果。(可参考我以前逆过的一个驱动:逆向fuck.sys--编译通过--源码)
   
                 (2) 内核Patch  \\KnownDLLs\\Kernel32.dll CreateThread

    \\KnownDLLs是系统加载时对象管理器加载最新磁盘DLL到内存的,当其他进程想调用某个DLL时,就不用重复从磁盘加载了,而会从这里映射一份到自己的进程空间中去。这样给我们做全局Patch提供了一个很好的机会:
        ZwOpenSection打开 \\KnownDlls\\kernel32.dll,调用ZwMapViewOfSection映射一份到自己进程空间,然后寻找kernel32.dll在内存中代码节的空隙,选择这里作为我们fake函数的存储Buffer。修改CreateThread函数的开头5字节跳转到这个间隙,当系统任何一个线程创建时,会走到CreateThread函数,然后执行空隙中的ShellCode,其负责调用LoadLibrary加载我们的DLLDLL一经加载,会发IOCTL通知本驱动,让驱动卸载HOOK。这样就完成了内核注DLL的过程。测试时发现Svchost.exe进程调用CreateThread函数很频繁,所以触发也会很快,基本1秒不到就能将DLL加载进去,而我们的HOOK也卸掉了。所以稳定性提高不少。示意图如下:




(3) 内核 HOOK ZwMapViewOfSection

    有部分模块加载时会调用ZwMapViewOfSection,比如进程创建时映射NDLL到自己的虚拟空间中去.我们替换SSDT中的这个函数,过滤出是加载Kernel32.dll的情况,从参数中取得其基址,Inline HookEAT中的CreateThread函数,跳转到在这个进程虚拟地址空间中申请的Buffer,在其中完成DLL的加载过程.

关键API:
ZwAllocateVirtualMemory ---- 在此进程空间中分配内存,存放Shellcode
ZwProtectVirtualMemory ---- 使当前内存块具有可读可写属性
IoAllocateMdl ---- 创建MDL

关键Code如下:



    同方法2相比,原理类似。但修改时机不同,效果差不多,只是注入DLL的时间会慢一些。至于Shellcode的编写,就大同小异了.萝卜白菜各有所爱,主要看个人发挥。要是闲写shellcode麻烦,请到看雪学院去查资料,模板很多,在这里就不YY了。
    【看雪读书月】学习ShellCode编写
    [note]一个简单的Shellcode
    shellcode之小小琢磨
    Add_Section

(4) 内核 HOOK NtCreateThread

    跟踪进程创建的流程,会很明晰的发现有多点可以patch来实现DLL的注入。

    进程创建完时是一个空水壶,里面没有沸腾的热水(threads),于是系统调用NtCreateThread创建其主线程(给空水壶注水凉水),在这个暂停的线程里面折腾了一阵后完事了也厌倦了,于是系统跳了出来,回到进程空间中,调用Kernel32.dll去通知CSRSS.EXE,对它说:“这里有一个新进程出生了,你在你的表里标记一下”。然后就开始加载DLL啦,把系统KnownDLLs中的自己需要的DLLMap一份到这个大水壶中。接着KiThreadStartup加热水壶中的凉水,于是水就开始沸腾了,此时主线程开始工作。。。

    拦截NtCreateThread,取得当前线程上下文,保存它要返回的地址(会回到空水壶中去),劫持为我们自己分配的地址,在其中填充ShellCode来加载目的DLL。至于选择Buffer,思路很多。这里可简单的Attach到当前进程,在充足的虚拟2GB进程地址空间中分配属于你自己的一块小内存,够放ShellCode足矣。示意图如下:


                  (5) 内核感染常用模块,让感染模块帮我们Load DLL
    这个方法就有点绕远了,开始了最本质最原始的感染,可增加新节,可插空隙,总之,让别人的模块Load进内存时顺路的帮我们加载下DLLDLL一旦加载就可以恢复感染,清除痕迹。至于感染代码,网上一堆。只要不是驱动感染驱动(多了个校验和),其他性质都一样,看自己发挥啦。

          (6) 拦截NtCreateUserProcessNtCreateSymbolicLinkObject

    前者在Vista下才有. 拦截后通过PsLookupProcessThreadByCid得到ETHREAD / EPROCESS,判断是否是CSRSS.EXE引起的,若是则在此进程空间内分配一块内存,调用NtGetContextThread得到当前的线程上下文,调用ZwWriteVirtualMemory填充Shellcode区域,取得LdrUnloadDllLdrGetDllHandle等函数地址,通过他们加载DLL。然后调用NtSetContextThread恢复原始的Context。关于这种方法,可参考DriverDevelop上某人发的BIN
[”内核实现DLL注入.可以完美绕过KAV瑞星等杀毒软件”]

(7) 内核拦截NtResumeThread
(8)NtUserSetWindowsHookEx 注入

顺便提下R3DLL的注入:
  1.CreateRemoteThread (or NtCreateThreadEx (Used in Vista))
  2.SetThreadContext (change the EIP)
  3.NtQueueAPCThread
4.RtlCreateUserThread
5. SetWindowHookEx

小结:

    纵观进程启动的全过程,可patch的地方很多,只要保证进程、线程上下文不被破坏,注入的手法可多种多样。只要保证我们的DLL注入时间足够短,稳定性足够高即可。当我们迫不得已要从内核注入DLL到用户进程去时,系统已经中毒很深,此时运用类似上面提到的技术来加载DLL,让DLL做我们驱动无法完成的任务,是可以接受的。

    上面提到的思路是我暂时想到并且已经实现了的,详细过程可参见代码。欢迎积极探讨更好更稳定而且不邪恶的方法。

-----------------------------------------------------------------------------------
参考资料:
1.       Windows Internals---Processes,Threads,Jobs
2.       漫谈兼容内核系列:WINDOWS进程的用户空间
3.       WRK 1.2 ,windbg
   

[公告]请完善个人简历信息,招聘企业等你来!

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (69)
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
太难了 活跃值 2008-11-2 17:00
2
0
顶大侠的作品。。。。。。。。。。。。。。。
雪    币: 203
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wyfe 活跃值 2008-11-2 17:04
3
0
sudami的文章很规范
雪    币: 200
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
shoooo 活跃值 16 2008-11-2 17:16
4
0
不错,收藏,学习,膜拜
雪    币: 519
活跃值: 活跃值 (47)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 活跃值 14 2008-11-2 17:23
5
0
膜拜,学习,收藏,不错
雪    币: 108
活跃值: 活跃值 (11)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
沙金 活跃值 4 2008-11-2 17:51
6
0
收藏,好东西以后肯定会用到的。
雪    币: 79
活跃值: 活跃值 (46)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
frozenrain 活跃值 2008-11-2 18:07
7
0
大米的文章 很详细  图文并茂
雪    币: 70
活跃值: 活跃值 (20)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
Nisy 活跃值 5 2008-11-2 18:11
8
0
强帖 学习之 ~
雪    币: 219
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
glery 活跃值 2 2008-11-2 18:14
9
0
很久没有拜读过这么过瘾的文章了,顶
雪    币: 110
活跃值: 活跃值 (21)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
cater 活跃值 5 2008-11-2 18:20
10
0
向苏大妈同志学习
雪    币: 765
活跃值: 活跃值 (47)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
海风月影 活跃值 17 2008-11-2 18:22
11
0
学习啊,膜拜啊,不错啊,收藏啊
雪    币: 372
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
笨奔 活跃值 1 2008-11-2 18:22
12
0
哈,正好有点研究,谢谢提供参考
雪    币: 234
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
梦魇颖雨 活跃值 2008-11-2 19:01
13
0
哇。。大米蝈蝈终于出山了。。等了好久...
雪    币: 104
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Aleaxander 活跃值 1 2008-11-2 22:31
14
0
膜拜,收藏,学习,不错!
雪    币: 211
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
ufozhyufo 活跃值 3 2008-11-3 08:55
15
0
[QUOTE=sudami;529492]《N种内核注入DLL的思路及实现》
Author :  sudami  [sudami@163.com]
Time  :  01-11-2008
Links  :  http://hi.baidu.com/sudami (http://hi.baidu.com/sudami)

    内核注入,...[/QUOTE]
非常好的帖子,感谢分享.
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gry 活跃值 2008-11-3 09:14
16
0
不错,收藏,学习
雪    币: 301
活跃值: 活跃值 (10)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
HSQ 活跃值 8 2008-11-3 10:01
17
0
很全面
雪    币: 100
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
夜凉如水 活跃值 3 2008-11-3 17:11
18
0
xiaoxi xiaoxi
雪    币: 299
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
baohongyu 活跃值 2008-11-3 20:35
19
0
顶啊
雪    币: 108
活跃值: 活跃值 (46)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 活跃值 26 2008-11-3 21:12
20
0
好文,学习。
雪    币: 437
活跃值: 活跃值 (105)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
xss 活跃值 4 2008-11-3 21:38
21
0
学习之,研究研究
雪    币: 93
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ainwx 活跃值 2008-11-3 23:01
22
0
加入学习行列
雪    币: 212
活跃值: 活跃值 (21)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
ppanger 活跃值 4 2008-11-4 18:28
23
0
写得很好,学习,收藏
雪    币: 210
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zgFree 活跃值 2008-11-5 16:38
24
0
图文并茂,值得学习。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
samuelchoi 活跃值 2008-11-5 17:02
25
0
,收藏,学习,膜拜
雪    币: 277
活跃值: 活跃值 (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SkyJack 活跃值 2008-11-7 02:06
26
0
好文,谢谢LZ!
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yongbinxp 活跃值 2008-11-8 11:29
27
0
膜拜,学习
雪    币: 0
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
草屋居士 活跃值 2008-11-9 15:42
28
0
太强大了。。。。。希望有代码或是bin拿来玩玩
雪    币: 466
活跃值: 活跃值 (139)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2008-11-9 20:16
29
0
有代码有BIN,但不会放出来, 思路都出来了.写代码就是体力活啦.
那么多牛B哄哄的人,看了思路,代码一下就写出来了.找他们要吧~~
雪    币: 205
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hakwolf 活跃值 2008-11-17 19:43
30
0
不错,一看就是牛人!!!
雪    币: 195
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
machfe 活跃值 1 2008-11-18 01:32
31
0
厉害,半夜了 呵呵
雪    币: 228
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
XzOsaPl 活跃值 2 2008-11-18 18:36
32
0
顶下 学习收藏...
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
athlor 活跃值 2008-11-18 19:21
33
0
非常有质量的文章,感谢楼主的无私分享.
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
雪的思念 活跃值 2008-11-19 02:47
34
0
目前听起来非常深奥,先收藏起来了慢慢去理解了
雪    币: 217
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
escript 活跃值 2008-11-19 19:55
35
0
顶————-
雪    币: 411
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sadamu 活跃值 2008-11-20 21:33
36
0
注入线程这是我一定要学习的东西。呵呵。
雪    币: 205
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
笨虫虫 活跃值 2008-11-28 01:03
37
0
东西不错,收藏ing
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
playboyxy 活跃值 2008-11-28 14:34
38
0
强悍,值得学习
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xltime 活跃值 2008-12-3 14:08
39
0
初学者,看不明白。顶一下
雪    币: 420
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
草原游子 活跃值 2008-12-4 16:22
40
0
[QUOTE=sudami;529492]《N种内核注入DLL的思路及实现》
Author :  sudami  [sudami@163.com]
Time  :  01-11-2008
Links  :  http://hi.baidu.com/sudami (http://hi.baidu.com/sudami)

    内核注入,...[/QUOTE]
顶,思路不错
雪    币: 212
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
edigar 活跃值 2008-12-4 17:57
41
0
顶下,好文,收藏
雪    币: 207
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
handsome枫雪 活跃值 2008-12-4 19:58
42
0
很好的文章!
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
captaincp 活跃值 2008-12-4 20:32
43
0
非常好,很全面啊
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
阳光味道 活跃值 2008-12-16 22:38
44
0
收藏,学习中
雪    币: 474
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
feierin 活跃值 2008-12-23 21:55
45
0

看雪的牛人真多
雪    币: 0
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
一鸿 活跃值 2009-10-2 23:22
46
0
很好很强大!
雪    币: 211
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
aoyuhuaoju 活跃值 2009-10-5 13:27
47
0
那可以利用这种方法来过杀软
雪    币: 88
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mihanyu 活跃值 2009-10-10 10:28
48
0
。内容详细,有启发性
雪    币: 104
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
FigoY 活跃值 2009-10-10 13:53
49
0
Mark~
雪    币: 1
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
heihuo 活跃值 2009-10-22 16:37
50
0
顶下
游客
登录 | 注册 方可回帖
返回