找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5605|回复: 1

Win64 系统下用 WinDbg 快速查看 所有 Shadow SSDT

[复制链接]

2

主题

4

回帖

0

精华

铜牌会员

积分
78
发表于 2017-3-3 23:56:57 | 显示全部楼层 |阅读模式
本帖最后由 LopezBistro 于 2017-3-3 23:55 编辑

打算在 Win64 系统下在 Shadow SSDT 上做点什么的人都知道
  • Shadow SSDT 不能直接读取,
  • Win64 下 Shadow SSDT 的内容不是真正的函数入口地址
用WinDbg 调试 Win64 下 Shadow SSDT 时候经常需要得到真正的入口地址,有没有简单办法快速计算所有 Shadow SSDT 真正的入口地址呢?

下面用64位 Win8.1 为例说明如何能快速得到 所有Shadow SSDT 的真正入口地址。

Win32k.sys 和Session有关,在任何一个属于Csrss.exe Session的进程空间都可以访问Win32k.sys 中 Shadow SSDT(不一定非要GUI进程), 但 Smss.exe 除外。这里用简单的cmd.exe 进程做例子,因此,在列出所有进程以后,切换到cmd.exe进程 (图1)

切换cmd.exe进程以后,nt!KeServiceDescriptorTableShadow变成可以访问的了,其中的0x40e就是Shadow SSDT的大小,而0xffff960000a9200 就是win32k!W32pServiceTable 的地址了。(图2)

表中每一个需要经过转换(右移4位在与基地址就是win32k!W32pServiceTable地址相加)才能得到真正的入口地址。有人给出了一个计算偏移的算法:

win32k!W32pServiceTable+((poi(win32k!W32pServiceTable+4*n)&0x00000000`ffffffff)>>4)-10000000

这里的 n 是win32k!W32pServiceTable表中元素索引。但需要注意的是这个算法并不完备,因为没有考虑周全右移4位后的符号位问题。因此下面命令

ln win32k!W32pServiceTable+((poi(win32k!W32pServiceTable+4*n)&0x00000000`ffffffff)>>4)-10000000

对索引 n = 7 的时候能得到正确地址,但对索引 n = 11 时就没有办法得到。结果像这个样子(图3)

正确的计算偏移的应该是

.foreach /ps 1 /pS 1 ( offset {dd /c 1win32k!W32pServiceTable L poi(nt!KeServiceDescriptorTableShadow+30)}){ .printf"%y\n", ( offset >>> 4) + win32k!W32pServiceTable }

这个命令给出的结果在(图4)中,Shadow SSDT 表中所有入口地址以及函数名都
列出其中。截图只列前面几个。只要有正确的PDB文件,就应该能显示正确的结果。

图1

图1

图2

图2

图3

图3

图4

图4

评分

参与人数 1水晶币 +20 收起 理由
Tesla.Angela + 20 赞一个!

查看全部评分

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2017-3-6 09:20:20 | 显示全部楼层
发帖很认真,鼓励一下。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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