在前面的博文`《驱动开发:内核读取SSDT表基址》`中已经教大家如何寻找`SSDT`表基地址了,今天给大家分享两个适用于`WinDBG`调试器上的脚本文件,该脚本文件可以很好的枚举出当前系统内的`SSDT`以及`SSSDT`表中的数据,可以方便后续文章的学习参考之用,当然脚本不是我写的,文章末尾我会给出参考原文链接。

在前面的博文《驱动开发:内核读取SSDT表基址》中已经教大家如何寻找SSDT表基地址了,今天给大家分享两个适用于WinDBG调试器上的脚本文件,该脚本文件可以很好的枚举出当前系统内的SSDT以及SSSDT表中的数据,可以方便后续文章的学习参考之用,当然脚本不是我写的,文章末尾我会给出参考原文链接。

第一段脚本可用于枚举64位系统下所有的SSDT表,将脚本保存为enum_ssdt.log写入以下内容。

aS ufLinkS "";

aS ufLinkE "";

r $t1 = nt!KeServiceDescriptorTable;

r $t2 = poi(@$t1 + 0x10);

r $t1 = poi(@$t1);

.printf "\n\nKeServiceDescriptorTable->KiServiceTable: %p\nKeServiceDescriptorTable->Count: %d\n", @$t1, @$t2;

.printf "\nOrd Address fnAddr Symbols\n";

.printf "--------------------------------\n\n";

.for (r $t0 = 0; @$t0 != @$t2; r $t0 = @$t0 + 1)

{

r @$t3 = (poi(@$t1 + @$t0 * 4)) & 0x00000000`FFFFFFFF;

$$.printf "2. %p\n", @$t3;

.if ( @$t3 & 0x80000000 )

{

r @$t3 = (@$t3 >> 4) | 0xFFFFFFFF`F0000000;

r @$t3 = 0 - @$t3;

r @$t3 = @$t1 - @$t3;

}

.else

{

r @$t3 = (@$t3 >> 4);

r @$t3 = (@$t1 + @$t3);

}

.printf /D "[%3d] ${ufLinkS}%p${ufLinkE} (%y)\n", @$t0, @$t3, @$t3, @$t3, @$t3;

}

.printf "\n- end -\n";

回到WinDBG中输入命令$>

还有一个输出SSSDT地址的脚本,直接保存位enum_sssdt.log,写入以下内容。

aS ufLinkS "";

aS ufLinkE "";

r $t1 = nt!KeServiceDescriptorTableShadow;

r $t2 = @$t1 + 0x08*4;

r $t3 = poi(@$t2 + 0x10);

r $t2 = poi(@$t2);

.printf "\n\nKeServiceDescriptorTableShadow->W32pServiceTable: %p\nKeServiceDescriptorTableShadow->Count: %d\n", @$t2, @$t3;

.printf "\nOrd Address Symbols\n";

.printf "--------------------------------\n\n";

.for (r $t0 = 0; @$t0 != @$t3; r $t0 = @$t0 + 1)

{

r @$t4 = (poi(@$t2 + @$t0 * 4)) & 0x00000000`FFFFFFFF;

$$.printf "2. %p\n", @$t4;

.if ( @$t4 & 0x80000000 )

{

r @$t4 = (@$t4 >> 4) | 0xFFFFFFFF`F0000000;

r @$t4 = 0 - @$t4;

r @$t4 = @$t2 - @$t4;

}

.else

{

r @$t4 = (@$t4 >> 4);

r @$t4 = (@$t2 + @$t4);

}

.printf /D /os "[%3d] ${ufLinkS}%p${ufLinkE} (%y)\n", @$t0, @$t4, @$t4, @$t4, @$t4;

}

.printf "\n- end -\n";

使用WinDBG附加到应用层explorer.exe,并执行遍历命令。

0: kd> !process 0 0 explorer.exe

0: kd> .process ffff9b8a552b0340

0: kd> .reload win32k.sys

0: kd> $>

输出遍历效果如下所示。

参考文献

https://www.cnblogs.com/ImprisonedSoul/p/15603120.html

https://www.cnblogs.com/ImprisonedSoul/p/15603209.html

精彩链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。