飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2498|回复: 0

Kernel Hooks 1 SSDT by webxeyes

[复制链接]
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-9-24 18:42:34 | 显示全部楼层 |阅读模式
    用户态的钩子比较容易被发现,比较优雅的解决办法就是使用内核态钩子
    内核态是一个高虚拟地址区域,在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的

    相关帖子

    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表