- UID
- 66114
注册时间2010-4-1
阅读权限30
最后登录1970-1-1
龙战于野
TA的每日心情 | 慵懒 2019-3-12 17:25 |
---|
签到天数: 3 天 [LV.2]偶尔看看I
|
用户态的钩子比较容易被发现,比较优雅的解决办法就是使用内核态钩子
内核态是一个高虚拟地址区域,在x86中地址从0x80000000开始,如果/3GB开关打开的话,起始地址为0xC000000
通常情况下,进程不能读写内核空间内存的,不过一些进程可以通过调试权限或者一些gates进入内核态
对于我们来说,将通过驱动程序来操作内核态数据
SSDT HOOKING
windows执行体运行在内核模式并为子系统(Win32/POSIX/OS/2)提供支持
These native system services' addresses are listed in a kernel structure called the System Service Dispatch Table (SSDT)
This table can be indexed by system call number to locate the address of the function in memory.
另外一个表:System Service Parameter Table (SSPT)里面内容是相应的服务函数的参数
KeServiceDescriptorTable是一个由kernel导出的表
ntoskrnl.exe中的一个导出项KeServiceDescriptorTable即是SSDT的真身,亦即它在内核中的数据实体。
KeServiceDescriptorTable也包含指向SSPT的指针.
SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数
等
SSDT的数据结构定义如下
typedef struct _SYSTEM_SERVICE_TABLE
{
PVOID ServiceTableBase; //这个指向系统服务函数地址表
PULONG ServiceCounterTableBase; //在check build中这个才有效,free build中一直为0
ULONG NumberOfService; //服务函数的个数
ULONG ParamTableBase; //指向SSPT
}SYSTEM_SERVICE_TABLE,*PSYSTEM_SERVICE_TABLE;
转载注明出处 by webxeyes http://blog.csdn.net/webxeyes
KeServiceDescriptorTable由kernel导出,那用lkd 看看内容,我的是XP SP3
lkd> dd KeServiceDescriptorTable
8055b220 804e36a8 00000000 0000011c 80511088
8055b230 00000000 00000000 00000000 00000000
8055b240 00000000 00000000 00000000 00000000
8055b250 00000000 00000000 00000000 00000000
8055b260 00002730 bf80c059 00000000 00000000
8055b270 821fbbe0 f7ff5b60 81ddda90 8220c340
8055b280 5fb52970 00000009 5fb52970 00000009
8055b290 b3aab5b0 01c9c490 00000000 00000000
四个DWORD 那第一行就是SSDT的内容了,SSDT地址为0x804e36a8 一共有0x11c个服务函数
dump出0x804e36a8
lkd> dd 0x804e36a8
804e36a8 80590df5 8057a0f1 80588999 80592130
804e36b8 8058ea83 8063907e 8063b207 8063b250
804e36c8 8057b6e4 8064a047 80638835 8058e0a1
804e36d8 8063097c 8057bbcd 80589928 806278ff
804e36e8 805de3c9 80569fc3 805da767 805a34ba
804e36f8 804e3cb4 8064a05b 805cab06 804edfac
804e3708 8056a66f 805688dd 8058e50f 8064f93c
804e3718 8058a718 80591b3d 8064fba9 805889eb
其实就是一个个的函数地址,可以使用lkd>u addr进行反汇编
在rootkit中有这样一句话:The SSPT is also depicted in Figure 4-4. Each element in this table is one byte in size and specifies in hex how many bytes its corresponding function in the SSDT takes as parameters.
也就是说SSPT这个基本上一个块就一个DWORD,由前面得出的SSPT的指针,dump看看
lkd> dd 80511088
80511088 2c2c2018 44402c40 1818080c 0c040408
80511098 08081810 0808040c 080c0404 2004040c
805110a8 140c1008 0c102c0c 10201c0c 20141038
805110b8 141c2424 34102010 080c0814 04040404
805110c8 0428080c 1808181c 1808180c 040c080c
805110d8 100c0010 10080828 0c08041c 00081004
805110e8 0c080408 10040828 0c0c0404 28240428
805110f8 0c0c0c30 0c0c0c18 0c10300c 0c0c0c10
如果如书中所说的话,这个第一行其实可以
lkd> dd 80511088
80511088 2c 2c 20 18 44 40 2c 40 18 18 08 0c 0c 04 04 08
将SSDT和SSPT结合起来
第一个服务函数地址为0x80590df5参数占用0x2c个byte
其实这里还可以看出来,那些服务函数地址都是大于 0x8000000的 |
|