(ring3) (NtOpenProcess) ssdt层 实现
OpenProcess->ntdll!ZwOpenProcess->ntos!ZwOpenProcess->ntos!NtOpenProcess
(内核中有2套函数 ,zw,nt,nt才是真正的执行函数,zw只是一个过渡函数,可用ida察看ntoskrnl.exe得知) SSDT :主要处理 Kernel32.dll中的系统调用,如openProcess,ReadFile等,主要在ntoskrnl.exe中实现(微软有给出 ntoskrnl源代码) ShadowSSDT: 1.主要处理,user32.dll,GDI32.dll中调用的函数,如postMessage,SendMessage,FindWindow,主要在win32k.sys中实现.(微软未给出win32k代码) 2.需要注意的是shadowSSDT并未导出,可用ida在win32k.sys中的导出表搜索,且结构与ssdt相似,但是不能通过windbg dd命令查看值 3.ShadowSSDT表只能在GUI(即有界面的程序进程)环境下才有值,故我们需要调用KeAttachProcess来切换到GUI线程里。 4.用windbg 命令 .process 861ff020 (861ff020 是通过 命令 !process 0 0得到的)切换到GUI线程上下文 过程:1)(输入windbg命令 ) !process 0 0得到其中一个有 图形界面的程序 (数据如下) PROCESS 861ff020 SessionId: 0 Cid: 0b58 Peb: 7ffde000 ParentCid: 05e4 2) (输入命令) lkd> .process 861ff020 Implicit process is now 861ff020 (切换成功 ) 3) 切换成功后,使用dd KeServiceDescriptorTableShadow即可得到该表数据,否则无法得到,得到数据如下 lkd> dd KeServiceDescriptorTableShadow 其实KeServiceDescriptorTableShadow 包含4个系统服务表,但是我们只用前2个(SSDT,ShadowSSDT) 4) 总结: 1) ShadowSSDT在KeServiceDescriptorTableShadow[1]中,而KeServiceDescriptorTableShadow[0]为ssdt 2)如果要查看win32k服务,必须要切换到GUI线程上下文 5.如何得到ShadowSSDT地址:在insight source中可查询到wrk中有KeAddSystemServiceTable函数,里面有对KeServiceDescriptorTableShadow 的调用 思路:利用搜索特征码的方式搜索KeAddSystemServiceTable,取出KeServiceDescriptorTableShadow
ssdt表的结构可用windbg察看: |
ssdt与shadowssdt区别
最新推荐文章于 2020-09-05 19:03:12 发布