资讯·论坛·笑话大全·QQ表情·设为首页
发新话题
打印

[黑客攻防] 一些ROOTKIT的资料

一些ROOTKIT的资料

来源:WhiteCell技术论坛
- n- a# s) @6 |9 ^7 q5 [' o3 h( z我爱电脑技术论坛
/ u3 P5 }% m  D' Y# @! L$ ?9 h: Twww.520diannao.comList:打造最好的电脑自学交流论坛8 R+ [9 r* I9 \9 ]0 b( ~' n/ v/ Z+ V$ Z0 i
一,前言
; M/ P2 F  T! z! D我爱电脑技术社区--打造最好的电脑技术自学交流平台二,简介
" B9 g% b" \6 W电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站三,rootkit的一些以公开的隐藏技术
2 w; `5 l$ V. y我爱电脑技术论坛四,一些隐藏技术的应对方法我爱电脑技术论坛! Y3 M3 s& f3 x: ~
五,about ring0 rootkitwww.520diannao.com6 |9 I! N0 K- S0 v4 D6 \
六,rootkit的检测www.520diannao.com4 S3 I7 P) r0 L- M, R! I
我爱电脑技术论坛6 n! f& @1 g& s4 }: W
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站1 ]9 K: L# O  b4 I" I5 d( D# c
*************************
6 F! q4 [, i* j% ?+ P" z/ d; u9 Lwww.520diannao.com
- d* r: h- x- O/ Q0 }我爱电脑技术社区--打造最好的电脑技术自学交流平台一.先说几句与技术无关的话。我爱电脑技术论坛# y' c6 u3 G9 q( w) Y# F
  现在很多人对rootkit认识不够,可以说空白。而此愚文的目的就是让菜鸟认识rootkit→了解rootkit。也让一些想研究它的人把这篇文章当作一个参考或是入门级的指导。文章中介绍的rootkit的隐藏方法只是一部分。还有很多技术没有提到,另外还有一些未公开的技术。有些地方我未引用代码,因为不想占用过多的篇幅。以免有玩弄代码的嫌疑,不过写完以后还是觉得代码太多,请个位见谅。一-三的内容适合菜鸟看,也许第四部分之后对很多人来说都有些意义吧。如果高手不幸看到了,请准备好,不要吐到屏幕上或身上。
4 u8 x) d* G) V8 R8 X我爱电脑技术社区--打造最好的电脑技术自学交流平台以往的文章写的比较乱,而且格式不公正,这样的形式写文章也是第一次。以前文章中引用代码和文字也没有详细说明,再此也对作者表示谦意。感谢XX提的这个建议。打造最好的电脑自学交流论坛/ _3 G' |! ]3 L) k
今天是9月11号,庆祝一下童童的生日。顺便为911事件中的遇难者祈祷。同时也感谢MGF病毒的作者指点。
% Z. f" B8 }: J# ^4 c*************************
7 a* ^& B6 w2 W3 e打造最好的电脑自学交流论坛
, u( ?/ _2 l4 v' Y9 x6 }二.简单的说说rootkit.
! H: {- F% D3 G! F+ f5 g7 Uwww.520diannao.comRootkit的历史已经很悠久了。存在于windows,unix,linux等操作系统中,不只局限在windows,此文我只以windows平台为例来说rootkit。Root在英语中是根,扎根的意思,kit是包的意思。rootkit我们可以把它理解成一个利用很多技术来潜伏在你系统中的一个后门,并且包含了一个功能比较多的程序包,例如有、清除日志,添加用户,b7cmdshell,添加删除启动服务等功能。当然它的设计者也要用一些技术来隐藏自己,确保不被发现。隐藏包括隐藏进程,隐藏文件,端口,或句柄,注册表的项,键值等等。总之,写rootkit的人是狡尽乳汁利用很多办法不被发现。
) X# O3 d9 z( U" A, ~, m& v现在人们最熟悉的windows rootkit 就是hacker defender和ntrootkit了,还有使用了baiyuanfan在XCON提出的ring3 rootkit新思路的byshell,呵呵。而linux下就是knark了。
; x& @1 Z" l2 f8 a( I, Z7 _打造最好的电脑自学交流论坛电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站  ]9 X7 H/ e/ r5 e
*************************打造最好的电脑自学交流论坛3 ]# ^) c+ U  c/ `8 K& K) |

5 h, U: i& ?0 J我爱电脑技术社区--打造最好的电脑技术自学交流平台三.rootkit的一些以公开的隐藏技术以及检测技术。打造最好的电脑自学交流论坛& d! v, v: o2 B$ {$ K
1.  删除进程双项链上的进程对象。
6 ]" `2 U+ d  s7 [1 k1 T% fps:用的似乎很多,连现在的一些盗号的程序也利用上了
3 I" l4 B% }* q+ O5 f& r* ?www.520diannao.com现在所有人查看进程一般都是通过任务管理器(taskmgr.exe)来查看。了解一些编程知识的人都知道,任务管理器枚举进程信息是靠的 NtQuerySystemInformation 也就是ZwQuerySystemInformation 函数。众所周知,这个Native Api (本机API)枚举进程是要通过进程活动链表的。我们就来看看这个结构。
/ s8 t$ R8 l; C- U1 p+ A打造最好的电脑自学交流论坛typedef struct _OBJECT_ATTRIBUTES
0 W; H$ A% D- m/ h. O, U{
' l. P7 D: v( B# r电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站ULONG Length;
: _" o" b3 i+ i7 \* x4 x" m8 w我爱电脑技术社区--打造最好的电脑技术自学交流平台HANDLE RootDirectory;
& i3 N. b" d5 s  L, i: G9 `5 wwww.520diannao.comPUNICODE_STRING ObjectName;打造最好的电脑自学交流论坛  t1 D: E6 v' l& {/ E8 f
ULONG Attributes;
6 b( d& k5 J& Z$ E' ?; I; m& T6 uPVOID SecurityDescriptor;
* y8 ^9 x7 |8 P' V! IPVOID SecurityQualityOfService;
. s) J4 s  K+ {0 M, c/ [* d电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站} OBJECT_ATTRIBDTES, *POBJECT_ ATTRIBUTES;" J$ z2 {  C. U! ^. H3 O
我爱电脑技术论坛$ v6 H5 T/ C- m/ A& y( E- o6 b7 u8 S6 S8 I
typedef struct _IO_STATUS_BLOCK我爱电脑技术论坛1 b0 B& ^3 N. ?
{
2 X* j# |4 Z+ J  J3 M. t, swww.520diannao.comNTSTATDS Status;我爱电脑技术论坛$ W3 J7 s. S5 b3 q
ULONG Information;
5 l; p+ o( \/ E& E: t4 Nwww.520diannao.com}IO_STATUS_BLOCK , * PIO_STATUS_BLOCK ;打造最好的电脑自学交流论坛, G: N+ r3 ]3 H& Z' D& o

+ a! l- `6 {; L* I6 s我爱电脑技术社区--打造最好的电脑技术自学交流平台typedef struct _LIST_ENTRY我爱电脑技术社区--打造最好的电脑技术自学交流平台- m: i7 \; |/ I5 B
{
+ X1 }/ X/ }9 O; N7 x  W7 ?我爱电脑技术论坛Struct _LIST_ENTRY *Flink;我爱电脑技术社区--打造最好的电脑技术自学交流平台  J0 P; ?/ o5 V# g
Struct _LIST_ENTRY *Blink;我爱电脑技术论坛1 C6 ~, _- q$ D1 w2 ~& m: W# B, X
}LIST_ENTRY, *PLIST_ENTRY;

TOP

双向链表的典型例子就是进程和线程链。内部变量PsActiveProcessHead是一个LIST_ENTRY结构,在ntoskrnl.exe的数据段中,指定了系统进程列表的第一个成员。仔细想想,如果我们将进程对象从进程双向链表中移除,那么调用 NtQuerySystemInformation来枚举进程的任务管理器taskmgr.exe中就不会看到我们的进程了。那么就有人会担心了。如果进程从链表中删除,那还会被运行么?答案是,会。因为windows的ds,也就是线程分派器,也叫任务调度分配器(dispatcher scheduler)使用的是另一个数据结构,也就是说,进线程是否被调度处理与进程双向活动链表无关,不会被CPU忽略,不必担心。2003年pjf在安全焦点上提出的就是这个方法且给出了这个方法的实现代码。文章结尾处的参考资料中我会给出这个文章的URL。" c; w5 d# Y6 |1 b
2.修改系统调用表(sst)  T2 F, f9 L; d% Q2 `# ?
rootkit可以通过在系统调用表中添加添加自己的服务然后运行想要执行的任务。He4HookInv就是这样。He4HookInv也是一个比较有名的windows rootkit。下面我们来看看He4HookInv具体的实现过程。在以前人们不知道它是如何实现的这些,一些介绍rootkit的文章也是提到一点,不过只知道是修改的SST,细节也没有过多描述。直到phrack杂志公布了He4HookInv的一些细节。打造最好的电脑自学交流论坛( y# s8 b0 A, O4 A4 u) P2 u  @
He4Hook在不同版本所使用的方法是有所不同的。公布的方法中有两种。这里只说说第一种方法。如果想了解第二种方法和原版就看文章结尾的参考资料吧(phrack的连接)。打造最好的电脑自学交流论坛' N1 l. ~/ B- N  `0 ~
ZwCreateFile, ZwOpenFile,IoCreateFile,ZwQueryDirectoryFile, ZwClose 这些函数在Ntdll.dll中是这样实现的。我爱电脑技术论坛3 W/ u) j' s- ?  z8 M+ m
mov eax, NumberFunctionwww.520diannao.com' m6 N( J  M' X# x1 J$ ?$ l
lea edx, [esp+04h]
% ~2 p4 |* U6 }* p) U4 gwww.520diannao.comint 2eh; Syscall interface我爱电脑技术社区--打造最好的电脑技术自学交流平台% Q& D: H2 z& N1 E+ Y
打造最好的电脑自学交流论坛! u  u5 n' z$ w
当然Ntdll.dll是一个main gate,真正的函数调用是在Ntoskrnl中完成的。关于本机API的,可以看参考资料中我写的另一篇文章《浅析本机API》。
% \+ I4 a$ k3 T+ x/ Y9 pwww.520diannao.comEAX中储存着系统调用号。int 2Eh代表转到中断描述符表IDT位置0x2E处的中断处理程序。中断处理程序把EAX里的值作为查找表中的索引,去找到最终的目标函数。这个表就是系统服务表SST。ntoskrnl通过KeServiceDescriptorTable符号,导出了主要SDT的一个指针。我们可以通过 KeServiceDescriptorTable来访问SDT。现在来看看KeServiceDescriptorTable的结构。我爱电脑技术社区--打造最好的电脑技术自学交流平台, p: |; S: `8 E

! `% I9 O/ l2 J6 x打造最好的电脑自学交流论坛typedef struct SystemServiceDescriptorTable我爱电脑技术论坛, W! E/ ^& R% O0 V
{  |  {: t3 t& i* g9 F5 t' y. [6 {
SSD SystemServiceDescriptors[4];
; [2 i- B/ Z$ ]& {我爱电脑技术社区--打造最好的电脑技术自学交流平台} SSDT, *LPSSDT;
3 K! ]+ @8 Q$ Y! h电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站Other structures:我爱电脑技术论坛) B# L5 i7 {+ ?
typedef VOID *SSTAT[];
1 d, N, n% V% M# I( e我爱电脑技术论坛typedef unsigned char SSTPT[];我爱电脑技术社区--打造最好的电脑技术自学交流平台+ ?/ d$ Z0 @% a# W: E
typedef SSTAT *LPSSTAT;
0 o0 B6 b6 w! \8 i' s1 t6 e打造最好的电脑自学交流论坛typedef SSTPT *LPSSTPT;
. N6 b1 C/ q% Qtypedef struct SystemServiceDescriptor
1 d, [# T! ?* f+ C: z7 }7 T. I打造最好的电脑自学交流论坛{我爱电脑技术论坛# N8 U, x" I$ f7 c, s* k" Z
LPSSTAT lpSystemServiceTableAddressTable;电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站. j8 `9 Z# f! O9 t0 _( b
ULONG dwFirstServiceIndex;
5 x9 I9 S6 B# g9 Q  @www.520diannao.comULONG dwSystemServiceTableNumEntries;打造最好的电脑自学交流论坛; V4 a" [" l! e( ?" N: h
LPSSTPT lpSystemServiceTableParameterTable;
" S7 x, B/ f* n/ bwww.520diannao.com} SSD, *LPSSD;
" W( b, i. a3 M, f' K打造最好的电脑自学交流论坛KeServiceDescriptorTable 指向的DescriptorTable 只能从内核模式访问。在用户模式下,有一个未输出的KeServiceDescriptorTableShadow 。底层服务有 :
! S. D: u2 b/ Q2 E6 a* ]我爱电脑技术社区--打造最好的电脑技术自学交流平台KeServiceDescriptorTable->SystemServiceDescriptors[0]
$ l, h7 `8 ^" K" w6 U- O  x0 W0 {电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站KeServiceDescriptorTableShadow->SystemServiceDescriptors[0]
1 ~& O3 u* X- ^) }; b* r我爱电脑技术社区--打造最好的电脑技术自学交流平台内核模式图形化用户界面服务(GUI):
6 ~* g3 `2 o9 K3 C$ A7 \/ S. M我爱电脑技术社区--打造最好的电脑技术自学交流平台KeServiceDescriptorTableShadow->SystemServiceDescriptors[1]
: o2 K* H+ r5 |$ Q% S7 c  `电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站在WinNt4(SP3-6)和Win2k build 2195之前的所有版本中,DescriptorTable的其他的元素在写入时是空闲的,表中每个元素为SSID结构,包含有以下数据:
( f/ F2 D3 l# q- {打造最好的电脑自学交流论坛lpSystemServiceTableAddressTable 指针表,当相关系统调用启用时,它指向被调用的函数内存地址数组。我爱电脑技术社区--打造最好的电脑技术自学交流平台) Q  B4 |  ^" @- v9 _2 A2 o5 ?7 O

: f0 g: o7 P3 s电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站dwFirstServiceIndex 指向第一个函数的开始地址电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站9 s* q. D; }8 N: j, ]8 g
dwSystemServiceTableNumEntries  表中服务数目
0 Z2 y6 q$ M, X, G# p  q我爱电脑技术社区--打造最好的电脑技术自学交流平台lpSystemServiceTableParameterTable  表示出入栈的字节数目
9 N: s0 F! \! y8 G6 n打造最好的电脑自学交流论坛
5 }$ v% |  v' Y+ x/ H我爱电脑技术论坛为了取得系统调用,He4HookInv 用一个指针替代了KeServiceDescriptorTable->SystemServiceDescriptos[0]. lpSystemServiceTableAddressTableIn中存储的地址,而指向其所属表。& D: [" C1 O$ e1 p. f( c- J( l2 S6 h
我爱电脑技术论坛& R. f# T. T3 ]" j* A
你可以通过在系统调用表中添加自己的服务而界入He4HookInv。He4HookInv将更新以下两表:我爱电脑技术社区--打造最好的电脑技术自学交流平台& g$ c; x) j% Q, F8 N' d
- KeServiceDescriptorTable
! U/ ]  ?1 M& Owww.520diannao.com- KeServiceDescriptorTableShadow.
+ u2 y4 y# k8 t% Y2 \, R0 q( awww.520diannao.com但是,如果He4HookInv只更新KeServiceDescriptorTable ,新的服务项在用户模式下将不能被调用。为了定位KeServiceDescriptorTable Shadow ,将用到以下技术:KeAddSystemServiceTable 函数能向内核驱动层添加服务,而且能向两个表中同时添加。如果它的0指示符是相同的,通过扫描KeAddSystemServiceTable 函数代码就可以找到shadow 表的地址,具体可以在He4HookInv.c文件中的FindShadowTable(void)函数中查看是怎么实现的。如果这个办法失败, He4Hook使用一个硬编码的地址((KeServiceDescriptorTable-0x230)来定位ShadowTable的位置.这个地址从WinNT-sp3来就没有变过.另外一个问题是如何找到系统服务的编号,这个其实很简单,由于系统服务的函数体都具有以下形式(mov eax, NumberFunction),所以我们只要把系统服务的函数地址加上1bytes,就可以得到系统服务对应的编号。
6 q' [7 I  S/ v- x  {: T/ s( R我爱电脑技术社区--打造最好的电脑技术自学交流平台He4HookInv利用的第二个方法就是修改文件系统驱动中DRIVER_OBJECT的回调表,这里就不在详细说明了。

TOP

3.端口隐藏
$ F. O( g1 S4 ]很多人检查自己中没中木马或后门,都会一些方法来查看自己本机所开的端口来判断是否有木马监听,而有些rootkit就开始想如何隐藏端口了。www.520diannao.com% ]" t9 p( V+ L, c9 R
最简单的枚举当前所开放的端口信息是调用iphlpapi.dll中的AllocateAndGetTcpTableFromStack和 AllocateAndGetUdpTableFromStack函数,或者AllocateAndGetTcpExTableFromStack和 AllocateAndGetUdpExTableFromStack函数。打造最好的电脑自学交流论坛: y. `5 K6 y! E2 x0 o4 X+ `
  DWORD WINAPI AllocateAndGetTcpTableFromStack(
, D. f  Q# \$ F电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站    OUT PMIB_TCPTABLE *pTcpTable,6 y8 `! a6 Z! u1 p% L: O( R0 I, p
    IN BOOL bOrder,我爱电脑技术论坛! o7 c" C6 ]2 z! q
    IN HANDLE hAllocHeap,
* J0 H( u3 X& L我爱电脑技术论坛    IN DWORD dwAllocFlags,我爱电脑技术论坛* y5 S! V. L6 c6 G
    IN DWORD dwProtocolVersion;打造最好的电脑自学交流论坛& w& j5 H) h* k2 r' e' z* u8 {
  );www.520diannao.com2 x) t' _' O6 e! Z" g& B
我爱电脑技术论坛, E+ A9 l2 V3 l2 ]! \* E' h! d' u
  DWORD WINAPI AllocateAndGetUdpTableFromStack(我爱电脑技术社区--打造最好的电脑技术自学交流平台( o5 P$ M9 p; D6 A, J8 `- D( m' T0 t
    OUT PMIB_UDPTABLE *pUdpTable,
% D) Z3 o9 J" t$ T! J' l# [. Rwww.520diannao.com    IN BOOL bOrder,
: l+ j# l3 a* }1 f8 x/ d- S- E    IN HANDLE hAllocHeap,我爱电脑技术论坛; B  c; g' o9 |8 K1 ]
    IN DWORD dwAllocFlags,www.520diannao.com0 G) J6 f/ ^% P
    IN DWORD dwProtocolVersion;
* A9 L9 X, B+ }www.520diannao.com  );电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站' W% F% v6 e' x# |8 g
我爱电脑技术论坛, O% k2 i: l- ?7 p# y  T
  DWORD WINAPI AllocateAndGetTcpExTableFromStack(
' C+ J& f9 a2 z, n0 Z+ Z: E打造最好的电脑自学交流论坛    OUT PMIB_TCPTABLE_EX *pTcpTableEx,0 t1 F6 k; T) r; @8 j
    IN BOOL bOrder,
, d1 Y2 `7 C& r; h; V7 H7 Mwww.520diannao.com    IN HANDLE hAllocHeap,打造最好的电脑自学交流论坛9 c; r, _' a5 k( V* I6 s# v
    IN DWORD dwAllocFlags,
! ~- l' B7 p' _- I& o' h- A  K我爱电脑技术社区--打造最好的电脑技术自学交流平台    IN DWORD dwProtocolVersion;电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站2 A* P5 ~, s$ a7 p/ c+ P
  );电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站) u% J/ p, R- O; I: F5 v

* v2 h/ [5 W7 w3 Y2 Y我爱电脑技术社区--打造最好的电脑技术自学交流平台  DWORD WINAPI AllocateAndGetUdpExTableFromStack(我爱电脑技术社区--打造最好的电脑技术自学交流平台5 w; D& P) y) ^8 N
    OUT PMIB_UDPTABLE_EX *pUdpTableEx,
; w8 ]2 x3 s9 Q% {0 C3 s$ hwww.520diannao.com    IN BOOL bOrder,我爱电脑技术论坛3 w8 U" N% x3 u$ `
    IN HANDLE hAllocHeap,电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站9 s* I# h& x( u& c+ {% @# D
    IN DWORD dwAllocFlags,
7 Z0 [3 Y  I$ `) a( \3 h( D% Dwww.520diannao.com    IN DWORD dwProtocolVersion;
# M+ g; {1 m( f( X; [5 v我爱电脑技术论坛  );电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站) A. d( Z' p) [# t5 F+ J/ B
还有另外一种方法。当程序创建了一个套接字并开始监听时,它就会有一个为它和打开端口的打开句柄。我们在系统中枚举所有的打开句柄并通过 NtDeviceIoControlFile把它们发送到一个特定的缓冲区中,来找出这个句柄是否是一个打开端口的。这样也能给我们有关端口的信息。因为打开句柄太多了,所以我们只检测类型是File并且名字是\Device\Tcp或\Device\Udp的。打开端口只有这种类型和名字。
( v: d9 F* f1 ^- M而通过察看iphlpapi.dll的代码。就会发现这些函数同样都是调用NtDeviceIoControlFile并发送到一个特定缓冲区来获得系统中所有打开端口的列表。也就是说,我们挂接NtDeviceIoControlFile函数就可以隐藏端口。' o3 O1 v+ I" J3 i* k
我们来看看NtDeviceIoControlFile的原型
' Q& i$ R6 Q" O- ^0 c我爱电脑技术社区--打造最好的电脑技术自学交流平台NTSTATUS NtDeviceIoControlFile(打造最好的电脑自学交流论坛! |2 e- L$ Z( |3 l3 O" ]! z1 w
  IN HANDLE FileHandle
. A4 l1 ^( y2 U. K) R( P我爱电脑技术社区--打造最好的电脑技术自学交流平台  IN HANDLE Event OPTIONAL,
% E3 ?* a! x4 u* D* _3 g我爱电脑技术论坛  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
" w  m. G7 }, v+ \电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站  IN PVOID ApcContext OPTIONAL,
! W; O8 j# M% R2 m8 A( e& y  OUT PIO_STATUS_BLOCK IoStatusBlock,
+ w/ z1 `$ r+ r( S) z5 }我爱电脑技术论坛  IN ULONG IoControlCode,
% J& D. H; H' ~; _www.520diannao.com  IN PVOID InputBuffer OPTIONAL,
2 M" M- N, t/ Z$ S我爱电脑技术论坛  IN ULONG InputBufferLength,电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站" Y8 y+ ]7 m+ q
  OUT PVOID OutputBuffer OPTIONAL,
/ q! R6 {1 P, y* Z6 M+ s! Q% d5 [我爱电脑技术社区--打造最好的电脑技术自学交流平台  IN ULONG OutputBufferLength我爱电脑技术社区--打造最好的电脑技术自学交流平台* k% p4 y; x# u' L
);  
- J2 q; C1 O4 R3 N2 @' ]! M% r我爱电脑技术论坛  {9 k. h9 u4 i# B+ T  C7 u3 P
我们来看看《The Undocumented Functions-Microsoft Windows NT_2000》中对这些参数的描述我爱电脑技术论坛5 h9 |) t- ]2 a1 @" r
FileHandle我爱电脑技术论坛; s" o- }$ F* f4 y' J( k
HANDLE to Device Object opened as a file.我爱电脑技术社区--打造最好的电脑技术自学交流平台6 U# @9 [: g6 {1 R6 o, P
Eventwww.520diannao.com. [$ v! N) Z4 R' Q) g2 q( H3 O6 x
Optional HANDLE to Event Object signalled on the end of processing request.
3 ~2 R8 g' P" r8 r, eApcRoutine
$ h+ r0 B% \9 p' q电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站Optional pointer to user's APC Routine called on the end of processing request.# g* H4 W& D3 u- S3 v
ApcContext
- y) X& y1 V: L. ^# u' f电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站User's parameter to ApcRoutine.电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站; I. d/ d( y: a/ Y- J
IoStatusBlock
  t# Y8 M8 K, ?- d, m& z: z* m7 D我爱电脑技术社区--打造最好的电脑技术自学交流平台IO result of call.
; D+ n, e1 s% z9 @9 N. n我爱电脑技术论坛IoControlCode
. }3 W: c) \' p6 j7 c( r打造最好的电脑自学交流论坛IO Control code [IOCTL_*].我爱电脑技术论坛& e) W- S+ q- S) X4 ]4 x
InputBuffer我爱电脑技术社区--打造最好的电脑技术自学交流平台& a/ l' ~# ]+ ]4 ^/ A, J! f
User's allocated buffer with input data.
1 F5 A( z' N1 G. h0 f; S6 X; R我爱电脑技术论坛InputBufferLength
+ z! P$ n- `6 `: Q* f电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站Length of InputBuffer, in bytes.) M4 \& E" |" q' v6 I, P
OutputBuffer打造最好的电脑自学交流论坛- Y" i/ m2 ^2 Y
User's allocated buffer for result data.电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站, {) J0 z; H# h, I9 Q/ ?- O
OutputBufferLength电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站+ J+ c1 E2 P1 B9 F; E5 B5 L
Length of OutputBuffer, in bytes.电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站9 T/ K/ h+ G. W- H7 h: T2 ~
主要的就是FileHandle,IoStatusBlock,IoControlCode,IoControlCode,InputBufferLength,OutputBuffer,OutputBufferLength。
6 m! x$ @6 j$ kwww.520diannao.com摘自《在NT系列操作系统里让自己“消失”》。
! d. n. t7 B- w我爱电脑技术社区--打造最好的电脑技术自学交流平台还有关于端口隐藏的技术就不提了 因为在我说的文章中已经说的很清楚了,所以在写就是浪费篇幅了。电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站4 Q8 }, @# \4 ~( n/ l7 _
jiurl也曾经提到过了一种隐藏端口的方法,并且给出了代码。在参考资料中有文章URL。www.520diannao.com3 N- {/ l  U4 W, f* J
4 文件隐藏。
9 d' ~& U5 k. R5 ?% E+ Z5 ~) Qwww.520diannao.com在WINNT里在某些目录中寻找某个文件的方法是枚举它里面所有的文件和它的子目录下的所有文件。文件的枚举是使用NtQueryDirectoryFile函数。
0 M7 s7 M' j" D* w9 D  kNTSTATUS NtQueryDirectoryFile(打造最好的电脑自学交流论坛/ |4 k" I; Z1 f% D/ i  }
  IN HANDLE FileHandle,7 r4 N. a  ?4 p3 x: d9 F. s" k
  IN HANDLE Event OPTIONAL,我爱电脑技术论坛* x( E9 k/ l2 V6 Y0 Q
  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
7 n: }  C4 k( T3 y1 G) w" O) V电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站  IN PVOID ApcContext OPTIONAL,
, Y- J( m7 g/ D9 |% M  c+ L) ^  OUT PIO_STATUS_BLOCK IoStatusBlock,
) T% u3 b" J  Cwww.520diannao.com  OUT PVOID FileInformation,电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站4 e* d' [' m! E
  IN ULONG FileInformationLength,www.520diannao.com$ b/ O- \+ |% B/ {
  IN FILE_INFORMATION_CLASS FileInformationClass,电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站$ s3 R: E+ i" K( d* u
  IN BOOLEAN ReturnSingleEntry,
  }) M" r' k$ gwww.520diannao.com  IN PUNICODE_STRING FileName OPTIONAL,
6 S+ M: M6 `3 F5 N+ I& l; z* Uwww.520diannao.com  IN BOOLEAN RestartScanwww.520diannao.com: R5 W. B! O: A- Z4 g
);

TOP

在《The Undocumented Functions-Microsoft Windows NT_2000》中对这些参数的描述电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站3 a3 Z9 C, A) P
FileHandle
' R! G* b0 V+ ]/ P. D8 F; zHANDLE to File Object opened with FILE_DIRECTORY_FILE option and FILE_LIST_DIRECTORY access.
/ L2 K7 m, x$ dwww.520diannao.comEvent我爱电脑技术论坛4 i+ z+ m) S$ ]$ x
Optional HANDLE to Event Object signaled after query complete.
6 _3 Y: }. [- E" Y$ t9 j$ ~6 p# vwww.520diannao.comApcRoutine我爱电脑技术论坛; B# _2 G2 j* b0 c) n7 h. y2 d5 |/ J
Optinal pointer to user's APC routine queued after query complete.
# m$ z8 U/ d# k/ j8 }我爱电脑技术论坛ApcContext6 N0 F9 a4 B: V# ]. V
Parameter for ApcRoutine.
, g2 N, Q5 I( Y2 z' E我爱电脑技术社区--打造最好的电脑技术自学交流平台IoStatusBlock
, c& r' a2 j- O9 Fwww.520diannao.comIO result of call.我爱电脑技术论坛, J0 t, N3 @0 a% A3 Y& ^) {* F
FileInformation
" N; p& e" N( P3 f6 qUser's allocated buffer for output data.
) n, f! d3 S9 J! E打造最好的电脑自学交流论坛Length  d+ ]& T5 a5 z3 `2 a* f
Length of FileInformation buffer, in bytes.
6 e0 e5 Y% H" }5 q我爱电脑技术社区--打造最好的电脑技术自学交流平台FileInformationClass电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站4 J6 w& ~- `7 P  |7 Z" e
Information class. Can be one of:我爱电脑技术社区--打造最好的电脑技术自学交流平台: U) U8 E5 `$ a
FileDirectoryInformation
+ S3 @$ ]+ i' y2 L1 C电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站FileFullDirectoryInformation我爱电脑技术论坛5 j, A. z2 N; r8 ?: S
FileBothDirectoryInformation电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站" \( W. N1 c# c4 Q4 g$ [2 W# ?
FileNamesInformation我爱电脑技术社区--打造最好的电脑技术自学交流平台% q: N# O- ^$ @" B
FileOleDirectoryInformation
3 C6 f0 C4 e; h8 e( t5 G打造最好的电脑自学交流论坛ReturnSingleEntry我爱电脑技术论坛4 k! g+ n. K. }. C9 c
If set, only one entry is returned.www.520diannao.com* e5 C3 b7 H! u7 x1 d2 Z, w- W
FileMask我爱电脑技术社区--打造最好的电脑技术自学交流平台  w+ A1 B) D4 F# V0 W3 t3 Z$ y  T
If specified, only information about files matches this wildchar mask will be returned.! w3 a' k) ^2 e3 V! [' \3 r
RestartScan
8 M3 V2 R- p0 t& n! A我爱电脑技术社区--打造最好的电脑技术自学交流平台Used with ReturnSingleEntry parameter. If set, NtQueryDirectoryFile continue enumeration after last enumerated element in previous call. If no, returns the first entry in directory.我爱电脑技术社区--打造最好的电脑技术自学交流平台8 j0 m. r! L& N  O, Y
我爱电脑技术论坛0 J; V6 K! m& G! _
与隐藏文件相关的重要参数是FileHandle,FileInformation,FileInformationClass.
2 x5 d' r3 u# a% p- M% D9 s7 ~( k我爱电脑技术社区--打造最好的电脑技术自学交流平台FileInformationClass中的相关信息过多,只说其中重要的四个。电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站2 b$ ]: {7 |! P% c
FileDirectoryInformation
2 H" K% d6 t! s% }FileFullDirectoryInformation
. ]3 P$ |; d4 w$ m# x打造最好的电脑自学交流论坛FileBothDirectoryInformation
2 y! b* x0 e' i' s; v, H我爱电脑技术论坛FileNamesInformation我爱电脑技术社区--打造最好的电脑技术自学交流平台1 W+ H7 c0 i7 P0 k5 c& c# b
我爱电脑技术社区--打造最好的电脑技术自学交流平台6 W& O! t$ J, o
要写入FileInformation的FileDirecoryInformation记录的结构:" O; E* Y2 h' ]

: H  [+ q& b; K1 \* A我爱电脑技术论坛typedef struct _FILE_DIRECTORY_INFORMATION {/ M/ }# K9 y2 ^9 f* c" `5 p. N+ T
  ULONG NextEntryOffset;' d  I* U) M8 l* p
  ULONG Unknown;% G# ^0 n; f" W6 ]" V& S0 x4 q8 ?
  LARGE_INTEGER CreationTime;打造最好的电脑自学交流论坛& y3 L$ i7 D3 @7 |" Y! z
  LARGE_INTEGER LastAccessTime;
+ L# d. t6 ?5 q% Swww.520diannao.com  LARGE_INTEGER LastWriteTime;我爱电脑技术社区--打造最好的电脑技术自学交流平台' r  \/ m8 p( y( H, \
  LARGE_INTEGER ChangeTime;
, _0 e3 i1 _  N  twww.520diannao.com  LARGE_INTEGER EndOfFile;
- l9 N1 ?5 f* B* ~我爱电脑技术社区--打造最好的电脑技术自学交流平台  LARGE_INTEGER AllocationSize;www.520diannao.com9 C# E7 t9 ], S& \3 X
  ULONG FileAttributes;
$ F7 Z, y& U% V( Awww.520diannao.com  ULONG FileNameLength;
1 A- F7 {+ C: c9 Z电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站  WCHAR FileName[1];
! I" }( q& R5 d' O3 Z# j1 L% A} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
) s1 D( b- O5 E; G5 m2 Q# S电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
2 j  \5 f0 N& N7 W* r$ ewww.520diannao.com
' T9 ^# q- y. Y. N我爱电脑技术社区--打造最好的电脑技术自学交流平台FileFullDirectoryInformation:
$ d* K( `- {% c) C; N5 Q1 t' t我爱电脑技术论坛
2 l8 A* ~6 T! w% [7 h我爱电脑技术论坛typedef struct _FILE_FULL_DIRECTORY_INFORMATION {我爱电脑技术社区--打造最好的电脑技术自学交流平台" d5 ]& |( b0 n0 u: w. e
  ULONG NextEntryOffset;) p+ T, N& ^  M2 Q; _! K
  ULONG Unknown;我爱电脑技术论坛8 W. m" ?$ Y4 E
  LARGE_INTEGER CreationTime;
3 s' _* O) D! e5 f# `! E0 ?# `% u  LARGE_INTEGER LastAccessTime;打造最好的电脑自学交流论坛0 ~& |: ~1 Q1 L! m8 @% n! O
  LARGE_INTEGER LastWriteTime;6 R) ]0 G! v. H& n* C+ X
  LARGE_INTEGER ChangeTime;打造最好的电脑自学交流论坛) m. o! V( C% ?, V* f. Q
  LARGE_INTEGER EndOfFile;我爱电脑技术论坛4 \. b- P4 @; a, i
  LARGE_INTEGER AllocationSize;打造最好的电脑自学交流论坛  S7 S6 Z* @/ l5 Q* n
  ULONG FileAttributes;
) c  _2 y3 D, @4 j( @我爱电脑技术论坛  ULONG FileNameLength;我爱电脑技术论坛3 l3 B  }' H. f! M& N
  ULONG EaInformationLength;
& i: R7 l$ F# Z/ [7 @我爱电脑技术论坛  WCHAR FileName[1];电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站% k% [3 a% T7 Q2 Y. n2 j( Z
} FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION;
) x( n/ G! [( ywww.520diannao.com
' b7 f& V( c2 w: b: ~. m我爱电脑技术论坛
* \+ h. r/ u! D" O7 Q. ?8 b我爱电脑技术论坛FileBothDirectoryInformation:
  }8 }# u) b  Y1 h: U: @打造最好的电脑自学交流论坛www.520diannao.com; |% a# S6 K3 e# \) V0 m
typedef struct _FILE_BOTH_DIRECTORY_INFORMATION {
3 A; t$ a) {: s( d电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站  ULONG NextEntryOffset;电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站4 n) E+ h9 x' u' J( @3 C+ f
  ULONG Unknown;
; W# J! }; ^! I) l! K- v  LARGE_INTEGER CreationTime;我爱电脑技术论坛1 I# W7 A" P3 G% A+ S
  LARGE_INTEGER LastAccessTime;
1 ]" n: S& T1 ^% Y2 X. J我爱电脑技术论坛  LARGE_INTEGER LastWriteTime;
' A1 x) [7 Q5 j! Y7 \) ^0 c3 X  LARGE_INTEGER ChangeTime;www.520diannao.com( c4 a' Q# A* ~' o+ K
  LARGE_INTEGER EndOfFile;
$ f2 Q$ ?1 N( B7 A$ }+ o我爱电脑技术社区--打造最好的电脑技术自学交流平台  LARGE_INTEGER AllocationSize;
) }" j5 k9 C& s$ n4 b8 T我爱电脑技术论坛  ULONG FileAttributes;打造最好的电脑自学交流论坛8 f+ `5 y" e. e, h2 A. P
  ULONG FileNameLength;
/ `7 }, Z5 M% W我爱电脑技术社区--打造最好的电脑技术自学交流平台  ULONG EaInformationLength;
1 _3 j. G9 [( u( a: V& C我爱电脑技术论坛  UCHAR AlternateNameLength;我爱电脑技术社区--打造最好的电脑技术自学交流平台2 d- {. M4 L4 x: J; F0 t
  WCHAR AlternateName[12];
" N5 D( J, O8 z7 e3 u, X% r我爱电脑技术社区--打造最好的电脑技术自学交流平台  WCHAR FileName[1];打造最好的电脑自学交流论坛# `! x. V. M" W8 a7 `
} FILE_BOTH_DIRECTORY_INFORMATION, *PFILE_BOTH_DIRECTORY_INFORMATION;
+ L, t$ ~2 M7 N; S# @' L8 Z. R2 K% T( F! _/ P

) o/ |: u9 G! R9 q我爱电脑技术论坛FileNamesInformation:我爱电脑技术社区--打造最好的电脑技术自学交流平台8 ^  y- m; b7 ]8 L+ q

5 `2 s: o# z( \1 g6 W6 ]+ B) W电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站typedef struct _FILE_NAMES_INFORMATION {电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站' ~: |; Z$ x8 S& e
  ULONG NextEntryOffset;
8 K0 V0 @$ N7 R. y) W  ULONG Unknown;电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站' b, q" ~2 m; u- S+ }% `) k' M
  ULONG FileNameLength;www.520diannao.com" R: z$ W6 d' k" b% x/ h0 M7 I
  WCHAR FileName[1];, s2 b# g6 y" \. m6 P
} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;打造最好的电脑自学交流论坛2 h# E$ L) S0 t$ g

, S2 \8 A7 g4 `+ L2 j& Z! S4 O我爱电脑技术论坛这个函数在FileInformation中写入这些结构的一个列表。对我们来说在这些结构类型中只有3个变量是重要的。
$ ^/ w( |* N% L) Y我爱电脑技术论坛NextEntryOffset是这个列表中项的偏移地址。第一个项在地址FileInformation+0处,所以第二个项在地址是FileInformation+第一个项的NextEntryOffset。最后一个项的NextEntryOffset是0。
$ \3 j# k' D6 v, S) e* [电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站FileName是文件全名。
! |( _& e/ G/ L- |/ F/ iwww.520diannao.comFileNameLength是文件名长度。电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站8 D5 v' a! t" Q$ G0 T# Q
如果我们想要隐藏一个文件,我们需要分别通知这4种类型,对每种类型的返回记录我们需要和我们打算隐藏的文件比较名字。如果我们打算隐藏第一个记录,我们可以把后面的结构向前移动,移动长度为第一个结构的长度,这样会导致第一个记录被改写。如果我们想要隐藏其它任何一个,只需要很容易的改变上一个记录的 NextEntryOffset的值就行。如果我们要隐藏最后一个记录就把它的NextEntryOffset改为0,否则 NextEntryOffset的值应为我们想要隐藏的那个记录和前一个的NextEntryOffset值的和。然后修改前一个记录的Unknown变量的值,它是下一次搜索的索引。把要隐藏的记录之前一个记录的Unknown变量的值改为我们要隐藏的那个记录的Unkown变量的值即可。
. D' F: R  t# Y9 l" e3 o0 C我爱电脑技术社区--打造最好的电脑技术自学交流平台如果没有原本应该可见的记录被找到,我们就返回STATUS_NO_SUCH_FILE。
# ?) A$ _3 I" b( i3 o- Y2 ~我爱电脑技术论坛#define STATUS_NO_SUCH_FILE 0xC000000F
7 {6 t8 ~8 d& z: X- R我爱电脑技术论坛同隐藏端口一样。具体请看《在NT系列操作系统里让自己“消失”》。我爱电脑技术社区--打造最好的电脑技术自学交流平台) M2 j& ^# s5 F1 c4 Z# z
5,在说一下baiyuanfan在xcon上提出的ring3 rootkit思路。就是通过挂接本机API实现同步与异步端口复用。利用自删除和复活来隐藏痕迹,不被检测到。
0 z. d* t3 J. f9 ~我爱电脑技术社区--打造最好的电脑技术自学交流平台**********************************www.520diannao.com( J4 R6 O) v* W
我爱电脑技术社区--打造最好的电脑技术自学交流平台4 c- I, c, Y4 @8 e9 A3 g- q
四。一些隐藏技术的应对方法4 f, y/ G* ~6 V+ @/ p9 @7 v; W8 x' K

1 y2 E$ Y" @# ], k- \* K) P电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站像刚才提到的将进程对象从进程双向链表中删除就有办法突破。刚才其实聪明的人已经想到了。NtQuerySystemInformation所需要的链表已经被做了手脚。但windows dispatcher scheduler跟他所用的链表不一样。那么我门可以通过读取windows dispatcher scheduler所用的另一个链表来列出进程。也就是说可以直接通过读取KiWaitInListHead和KiWaitOutListHead来列举进程,这样就突破了修改双向链表隐藏进程的方法。pjf的通过读取KiWaitInListHead列出隐藏的进程中给出了代码。
6 q" {: \- o8 M. a打造最好的电脑自学交流论坛不过这种检测方法不久又被突破了,就是替换内核的进程链表。% D$ \5 \: s; T) k. [
还有人提出使用HOOK SwapContext方法来检测。只要被处理器调度的线程就逃不掉。我爱电脑技术社区--打造最好的电脑技术自学交流平台6 c& b; w4 t* B% e) f, O! W
有些人对这个函数不大了解。我来说说这个函数吧。电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站* k/ ]  g- T- P5 N" ]5 a
WINDOWS 2K/NT/XP系统中,处理器的调度对象是线程,在非SMP的OS中某时间段内当前 CPU 处理的进程只可能有一个。每个进程分配特定的 CPU 时间片来达到执行目的,而系统的 CPU 时钟中断确定了每个进程分配的时间片。也就是当系统 CPU 时钟中断触发时,产生的进程调度请求。处理器时钟中断发生的时候会调用KiDispatchInterrupt(),比较当前进程分配的时间片,如用完后会调用 KiQuantumEnd() 根据各线程优先级等信息用特定的调度算法选择新的线程(ETHREAD),然后将其返回值,一个 ETHREAD 结构作为参数,来调用 SwapContext() 设置 ETHREAD,EPROCESS 中的各项参数,并替换 KPCR 中的相应结构完成线程切换,调度到另一个进程(EPROCESS)的线程(ETHREAD)继续执行。可以说CPU的线程切换离不开 SwapContext函数,当然,rootkit所执行线程的都会通过SwapContext函数来切换使之被CPU处理。打造最好的电脑自学交流论坛7 R& ]1 p# {! X; i( m; [
而在这之后有人就提出自己替换线程的调度就可以躲过这种检测。
3 J& U" w9 ^' c+ `9 W0 M' f我爱电脑技术社区--打造最好的电脑技术自学交流平台在我看来,这种检测方法会占用很大的资源,毕竟CPU的线程切换非常频繁。如果谁有条件可以自己看看,一秒内会发生多少次的线程切换。我爱电脑技术社区--打造最好的电脑技术自学交流平台1 e" v  D/ \6 D) T6 Y
在第六部分我会说一下rootkit的检测。我爱电脑技术社区--打造最好的电脑技术自学交流平台, _* z: M/ f) {: L7 C/ h
*************************

TOP

五,about ring0 rootkit打造最好的电脑自学交流论坛9 t- ]! d, Z, g. E/ f2 n
    有矛就有盾,有木马就有杀毒软件,但在这场双方之间永无休止的拉锯战中,木马始终处于劣势地位,尤其是现在,杀毒软件对木马的绞杀,真是到了“无所不用其极”的地步。杀毒软件凭什么能够长期居于优势地位?原因只有一个:杀毒软件/防火墙先入为主,具有以RING0为主、RING3为辅,大小通吃的天然优势。木马和杀毒软件/防火墙的战争,是一场不对称的战争,就象基地和美国那样。木马从一个赤裸裸的网络软件远程控制软件,发展到反弹型木马,DLL型木马,到现在的“隐身”型木马,身上穿的圣衣越来越厚。但是一个新木马刚刚诞生,很快就被杀毒软件收集特征码,列入黑名单,被到处追杀。当今“好木马”的必须具备无进程,无端口,难查杀等特征。但是在传统的RING3里,在下认为木马技术已经没有多少发展空间,必须到RING0去,在平等的条件下和杀毒软件 /防火墙放手一博。向RING0进军,已经是木马新的发展方向。
+ x1 w) X2 T3 Y+ s2 K/ M8 Q! t电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站和传统的木马相比,RING0木马有什么优势?让我们看看:
1 x# G" h' v! {- K7 C/ l  B$ l- H1,无进程。电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站9 G( D+ t+ h& P3 Z5 o
  RING0木马编译后是一个SYS文件,它和DLL文件那样,是插入到进程里运行的。但DLL插入的是地址在0x80000000下的用户区,而 RING0木马插入到地址在0x80000000以上的系统区,而且所有进程共享,只要它本身不提供unload例程,几乎不可能被卸载,而且没有多少个工具可以列举系统里装载的SYS模块。电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站) @6 V$ g9 P- n
2,无端口。
- L2 h3 i; q: E; B0 J) p) A; F我爱电脑技术论坛  RING0木马可以直接控制网卡收发包,系统和防火墙根本不知道,因此它可以使用任何端口,任何协议。或者通过使防火墙的NDIS驱动失效,突破防火墙的封堵。
6 l0 g: S* {/ s0 ]我爱电脑技术社区--打造最好的电脑技术自学交流平台3,难发现,难查杀,生存能力强。但是,要写出这样一匹好马,需要对系统内核和通讯协议非常熟悉的高手才能胜任,尤其要对ntoskrnl.exe, hal.dll,ndis.sys三个系统模块导出的函数要非常熟悉才行。另外安装RING0木马需要管理员及以上的权限,如果你只获得了肉机的 GUEST权限,还要想办法提升权限才行。以上对RING0木马的描述只是一个构想而已,本人没有用代码实现过,也不知道有没有人写出了这样的木马,希望有人指正指正。不过对于编程爱好者来说,这是一个很大的挑战,能够写出来,足以证明你的能力了!我爱电脑技术论坛* G* I3 `% G" e- ?3 y9 u. V; C% H1 g
打造最好的电脑自学交流论坛$ t; \: d& O7 t* C5 m
**************************www.520diannao.com* M: x& H6 s3 ^7 c
打造最好的电脑自学交流论坛9 k+ X5 j1 Y& W. q3 S
六,rootkit的检测
& k' p( g7 r+ N+ n8 }打造最好的电脑自学交流论坛rootkit和病毒一样,都被杀毒软件厂商“关注”,正如上面about ring0 rootkit中说的一样,是一场永无休止的拉锯战。很多热爱技术的人,也喜欢挑战他们,所以rootkit的检测技术也不断增加。比如EPA(执行路径分析)。rootkit如果通过修改系统调用来实现隐藏目的(就像文章第三部分中提到的一样。),那么肯定会与正常的系统有所不同,当系统调用的路径发生变化的时候,我们通过之间的对比分析,就可以检测到rootkit的存在。当然,这样做也是有缺点的。每次系统调用发生时都要做检查,那么就像上面 HOOK SwapContext一样。都会消耗系统的很多资源。其二,实现起来有难度。电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站( |( }. K* w' x* P
还有就是反病毒的方法,就像对付病毒一样。不过这样的方法很被动。而且未公开的rootkit比较多,所以并不是非常有效。
6 O0 Y4 Q7 I5 Y0 x, Z6 W6 m' |: e, S& u打造最好的电脑自学交流论坛还有一种新生的检测方法,就是微分测试(Differential testing)。不过很容易突破。估计后面的 rootkit就可以饶过了……。* @& O4 @+ e& O  u4 P8 w& E
检测一些rootkit,各位可以使用pjf的icesword,是一款非常优秀的检测工具了。ICE的枚举进程用了不只一种方法。不要以为他什么都可以查到。ps:不过在使用的时候不要呼出softice,否则会崩溃,这是因为ice的反调试机制。也可以试试zzzevazzz的knlsc。不过检测到了以后也是非常难完全清除的,弄不好会造成系统出现故障。提早防备还是比较重要的。下面来说一些可以预防rootkit的方法。至于防御rootkit,还是必备杀毒软件,一些已经以知的rootkit还会被查杀。而一些设置可以阻止rootkit植入,例如禁止访问\Device\ PhysicalMemory 。禁止驱动加载系统调用。不过如果设置的太严格会出问题,记得我当时胡乱设置,导致植入rootkit的时候BSOD.....我爱电脑技术社区--打造最好的电脑技术自学交流平台( z! c$ K* h1 Z7 E1 i; S
**************************

TOP

发新话题