windbg查看SSDT表

本文深入探讨了SSDT(System Services Descriptor Table)的概念,它是连接Ring3的Win32 API与Ring0内核函数的桥梁。SSDT包含一个庞大的地址索引表,用于存储系统服务函数的地址。通过Windbg的dd命令,可以查看映射到进程虚拟地址空间中的SSDT,了解其结构及如何定位系统服务函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 概述

SSDT,System Services Descriptor Table,系统服务描述符表。
见此
    https://blog.csdn.net/bcbobo21cn/article/details/52083557

这个表就是一个把ring3的Win32 API和ring0的内核函数联系起来。SSDT包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。

SSDT定义为下面结构体;
    typedef struct _SYSTEM_SERVICE_TABLE{};

进入Windbg,使用如下的命令,即可查看到SSDT表;

    lkd> dd KeServiceDescriptorTable
    8055ab80  804e3d20 00000000 0000011c 804d9f48
    8055ab90  00000000 00000000 00000000 00000000
    8055aba0  00000000 00000000 00000000 00000000
    8055abb0  00000000 00000000 00000000 00000000 

为什么输入 dd KeServiceDescriptorTable 可以查看到SSDT表?

d命令是查看某地址所储存的数据;
db/dw/dd/dq/dD/df
不同在于所显示的数据长度;

db显示一字节的长度;
dw显示两字节的长度;
dd显示四字节的长度;
dq显示八字节的长度;
dD 显示double实数(8字节的长度);
df 显示float实数(4字节的长度);

dd后面跟的应该是个地址;此处跟的是 KeServiceDescriptorTable ,那么就是Windbg自己转换了;

在windbg.exe中就看得比较清楚,KeServiceDescriptorTable中就只有第一项有数据,其他都是0。
其中804e3d20是KeServiceDescriptorTable.ntoskrnel.ServiceTableBase,服务函数个数为0x11c个。

再看804e3d20地址里是什么东西:
    lkd> dd 804e3d20
    804e3d20  80587691 805716ef 8057ab71 80581b5c
    804e3d30  80599ff7 80637b80 80639d05 80639d4e
    804e3d40  8057741c 8064855b 80637347 80599539
    804e3d50  8062f4ec 8057a98c 8059155e 8062661f
    如上,80587691 805716ef 8057ab71 80581b5c 这些就是系统服务函数的地址了。
 

Win32 进程4GB的虚拟地址空间结构如下;00000000-7FFFFFFF为用户空间,80000000-FFFFFFFF为系统空间;

显示的系统服务函数地址在80000000之上,这就对了;

那么目前看来,dd KeServiceDescriptorTable 此命令,并非直接看到内核中的SSDT,看到的是映射到进程虚拟地址空间中的SSDT;

2 SSDT结构定义

这些都是文字的,还不能操作;先复习一下,有条件再操作;

SSDT是一个表,不是数据库的表,是描述符表;
为什么称为表,应该是它里面包含一个庞大的地址索引表;

看上去有些复杂,什么是地址索引表;如果是地址表的话,应该是包含一些地址,这些地址就是要执行的函数的地址;地址索引表,是不是也是地址表,还是说通过地址索引表,再去找到一些地址,然后才找到要执行的函数;

同时SSDT定义为一个结构体,typedef struct _SYSTEM_SERVICE_TABLE{};不知道是在哪儿定义的,也许是在ntddk.h;
它有四个成员,含义分别是,
    指向系统服务函数地址表;
    ServiceCounterTableBase,这不知道是什么;
    NumberOfService,此成员是服务函数的个数;
    ParamTableBase,这不知道是什么;
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值