jocleys 发表于 2020-8-6 00:17:25

分享一个2004下的快速算出SSSDT表序的方法

本帖最后由 jocleys 于 2020-8-10 23:40 编辑

首先,根据这个(https://github.com/hfiref0x/SyscallTables/blob/master/Binary/Tables/win32k/19041.txt)网址得到syscall的序号。

然后根据 NtUserGetWindowMinimizeRectSSSDT:0x44ASyscall:5194 就可以很快速的算出来需要的序号了。
比如说 NtUserQueryWindow的syscall编号是4112,和NtUserGetWindowMinimizeRect的差值是43A,所以他的SSSDT编号就是0x10.

Tesla.Angela 发表于 2020-8-9 04:39:55

WIN10的SSSDT的函数的序号可以动态获取。

tangptr@126.com 发表于 2020-8-9 14:10:51

本帖最后由 tangptr@126.com 于 2020-8-9 14:19 编辑

win10rs1开始直接遍历win32u.dll的导出表就行了,除了那个gDispatchTableValues之外都是SSSDT上的函数。然后index嘛只需要借助反汇编引擎算出syscall/sysenter之前eax的值即可。(与一般系统上ntdll.dll动态解析SSDT是同一个原理)
然后SSSDT上的index是从4096,也就是0x1000开始的,所以需要-4096。
如果用你那张表的话,你可以注意到这张表是按函数名排过序的,所以如果只是搜索一个函数的index就可以直接用二分法。Windows 10 x64 2004有1316个SSSDT函数,那么搜索次数不超过ceil(log(2,1316))+1=12次就能找到任意函数的index。

jocleys 发表于 2020-8-10 23:42:07

tangptr@126.com 发表于 2020-8-9 14:10
win10rs1开始直接遍历win32u.dll的导出表就行了,除了那个gDispatchTableValues之外都是SSSDT上的函数。然 ...

感谢!

Tesla.Angela 发表于 2020-8-11 03:43:24

tangptr@126.com 发表于 2020-8-9 14:10
win10rs1开始直接遍历win32u.dll的导出表就行了,除了那个gDispatchTableValues之外都是SSSDT上的函数。然 ...

遍历WIN32K.SYS的导出表好像也行,那里有一堆__win32kstub__开头的函数。
页: [1]
查看完整版本: 分享一个2004下的快速算出SSSDT表序的方法