随笔- 20  文章- 0  评论- 0  阅读- 5910 

SSDT表是什么?有什么用?
SSDT(System Service Descriptor Table,系统服务描述符表),用来存储服务函数索引及服务函数地址。通过该表被保护起来,只具读的属性,不能写。(不过可以使用CRO寄存器的第1位来改变SSDT的属性。CRO寄存器第1位叫做保护属性位,控制着页的读或写属性。如果为1,则可以读/写/执行;如果为0,则只可以读/执行。SSDT,IDT的页属性在默认下都是只读,可执行的,但不能写。)
SSDT结构大致如下:
image

SSDT HOOK是什么???
SSDTHOOK是指将上述SSDT表中对应函数服务号的服务函数进行InlineHook,换成对应的过滤(Fake)函数。

SSDT HOOK怎么实现???
SSDT HOOK的实现可分为4步:
1.获取要Hook的服务函数的服务号;
2.获取SSDT表的基地址
3.将SSDT表中对应函数服务号的函数的地址
4.对相应的服务函数进行InlineHook,跳转到Fake函数

以下为详细实现方法:
1.获取要Hook的服务函数的服务号:
获取服务函数的服务号有两种方法:
①应用层:可直接使用Windbg,使用 u命令+Zw系列函数或Nt系列函数(如:u ZwTerminateProcess),查看汇编指令中的mov eax,xx指令,xx为函数服务号
②内核层:采用解析PE文件(ntdll.dll)的方式获取函数服务号。
打开System32目录下的ntdll.dll文件,使用内存映射(FileMapping)的方式将其映射到内存中,在其导出表中找到对应服务函数的地址,对其地 址+4后解析得到函数服务号
2.获取SSDT表的基地址
获取SSDT表的基地址的方式根据x86和x64可分为两种:
x86:
可直接使用Ntoskrnl.exe 的导出变量:KeServiceDescriptorTable,该变量指向SSDT的基地址
x64:
①读取地址为0xC0000082的MSR寄存器(MSR_LSTAR寄存器),得到KiSystemCall64函数的基地址,在Windbg中可使用如下指令获得:

点击查看代码
rdmsr 0xc0000082
msr[c0000082] = fffff800`03ede640
②从上述地址开始向下暴力搜索机器码{0x4c,0x8d,0x15}找到对应的指令
点击查看代码
fffff800`03ede772 [4c8d15]c7202300 lea r10,[nt!KeServiceDescriptorTable (fffff800`04110840)];其中KeServiceDescriptorTable为SSDT基址**

3.获取服务函数的地址
服务函数的地址根据x86和x64分为两种:
x86:
FunctionAddress = SSDTBase + 4 * ServiceIndex
x64:
FunctionAddress = SSDTBase + (SSDTBase[index] >> 4) 后4位存储函数个数
4.对获取到的服务函数进行InlineHook
x86下可使用InlineHook直接从原服务函数跳到Fake函数;x64下需要选择一个跳板(Trampoline),可使用不常使用的函数KeBugCheckEx作为跳板 (Trampoline)。

使用Windbg获取SSDT基地址的方法:

点击查看代码
kd> rdmsr 0xc0000082
msr[c0000082] = fffff800`03ede640 ;msr[c0000082]中的内容为KiSystemCall64的首地址
-------------------------------------------------------------------------------------------
kd> u fffff800`03ede640 l 50
nt!KiSystemCall64:
fffff800`03ede640 0f01f8 swapgs
fffff800`03ede643 654889242510000000 mov qword ptr gs:[10h],rsp
fffff800`03ede64c 65488b2425a8010000 mov rsp,qword ptr gs:[1A8h]
fffff800`03ede655 6a2b push 2Bh
fffff800`03ede657 65ff342510000000 push qword ptr gs:[10h]
fffff800`03ede65f 4153 push r11
fffff800`03ede661 6a33 push 33h
fffff800`03ede663 51 push rcx
fffff800`03ede664 498bca mov rcx,r10
fffff800`03ede667 4883ec08 sub rsp,8
fffff800`03ede66b 55 push rbp
fffff800`03ede66c 4881ec58010000 sub rsp,158h
fffff800`03ede673 488dac2480000000 lea rbp,[rsp+80h]
fffff800`03ede67b 48899dc0000000 mov qword ptr [rbp+0C0h],rbx
fffff800`03ede682 4889bdc8000000 mov qword ptr [rbp+0C8h],rdi
fffff800`03ede689 4889b5d0000000 mov qword ptr [rbp+0D0h],rsi
fffff800`03ede690 c645ab02 mov byte ptr [rbp-55h],2
fffff800`03ede694 65488b1c2588010000 mov rbx,qword ptr gs:[188h]
fffff800`03ede69d 0f0d8bd8010000 prefetchw [rbx+1D8h]
fffff800`03ede6a4 0fae5dac stmxcsr dword ptr [rbp-54h]
fffff800`03ede6a8 650fae142580010000 ldmxcsr dword ptr gs:[180h]
fffff800`03ede6b1 807b0300 cmp byte ptr [rbx+3],0
fffff800`03ede6b5 66c785800000000000 mov word ptr [rbp+80h],0
fffff800`03ede6be 0f848c000000 je nt!KiSystemCall64+0x110 (fffff800`03ede750)
fffff800`03ede6c4 488945b0 mov qword ptr [rbp-50h],rax
fffff800`03ede6c8 48894db8 mov qword ptr [rbp-48h],rcx
fffff800`03ede6cc 488955c0 mov qword ptr [rbp-40h],rdx
fffff800`03ede6d0 f6430303 test byte ptr [rbx+3],3
fffff800`03ede6d4 4c8945c8 mov qword ptr [rbp-38h],r8
fffff800`03ede6d8 4c894dd0 mov qword ptr [rbp-30h],r9
fffff800`03ede6dc 7405 je nt!KiSystemCall64+0xa3 (fffff800`03ede6e3)
fffff800`03ede6de e80d140000 call nt!KiSaveDebugRegisterState (fffff800`03edfaf0)
fffff800`03ede6e3 f6430380 test byte ptr [rbx+3],80h
fffff800`03ede6e7 7442 je nt!KiSystemCall64+0xeb (fffff800`03ede72b)
fffff800`03ede6e9 b9020100c0 mov ecx,0C0000102h
fffff800`03ede6ee 0f32 rdmsr
fffff800`03ede6f0 48c1e220 shl rdx,20h
fffff800`03ede6f4 480bc2 or rax,rdx
fffff800`03ede6f7 483983b8000000 cmp qword ptr [rbx+0B8h],rax
fffff800`03ede6fe 742b je nt!KiSystemCall64+0xeb (fffff800`03ede72b)
fffff800`03ede700 483983b0010000 cmp qword ptr [rbx+1B0h],rax
fffff800`03ede707 7422 je nt!KiSystemCall64+0xeb (fffff800`03ede72b)
fffff800`03ede709 488b93b8010000 mov rdx,qword ptr [rbx+1B8h]
fffff800`03ede710 0fba6b4c0b bts dword ptr [rbx+4Ch],0Bh
fffff800`03ede715 66ff8bc4010000 dec word ptr [rbx+1C4h]
fffff800`03ede71c 48898280000000 mov qword ptr [rdx+80h],rax
fffff800`03ede723 fb sti
fffff800`03ede724 e8170b0000 call nt!KiUmsCallEntry (fffff800`03edf240)
fffff800`03ede729 eb0f jmp nt!KiSystemCall64+0xfa (fffff800`03ede73a)
fffff800`03ede72b f6430340 test byte ptr [rbx+3],40h
fffff800`03ede72f 7409 je nt!KiSystemCall64+0xfa (fffff800`03ede73a)
fffff800`03ede731 f00fbaab0001000008 lock bts dword ptr [rbx+100h],8
fffff800`03ede73a 488b45b0 mov rax,qword ptr [rbp-50h]
fffff800`03ede73e 488b4db8 mov rcx,qword ptr [rbp-48h]
fffff800`03ede742 488b55c0 mov rdx,qword ptr [rbp-40h]
fffff800`03ede746 4c8b45c8 mov r8,qword ptr [rbp-38h]
fffff800`03ede74a 4c8b4dd0 mov r9,qword ptr [rbp-30h]
fffff800`03ede74e 6690 xchg ax,ax
fffff800`03ede750 fb sti
fffff800`03ede751 48898be0010000 mov qword ptr [rbx+1E0h],rcx
fffff800`03ede758 8983f8010000 mov dword ptr [rbx+1F8h],eax
nt!KiSystemServiceStart:
fffff800`03ede75e 4889a3d8010000 mov qword ptr [rbx+1D8h],rsp
fffff800`03ede765 8bf8 mov edi,eax
fffff800`03ede767 c1ef07 shr edi,7
fffff800`03ede76a 83e720 and edi,20h
fffff800`03ede76d 25ff0f0000 and eax,0FFFh
nt!KiSystemServiceRepeat:
fffff800`03ede772 4c8d15 c7202300 lea r10,[nt!KeServiceDescriptorTable (fffff800`04110840)] ;小括号中的地址为SSDT的基地址
fffff800`03ede779 4c8d1d 00212300 lea r11,[nt!KeServiceDescriptorTableShadow (fffff800`04110880)]
fffff800`03ede780 f7830001000080000000 test dword ptr [rbx+100h],80h
fffff800`03ede78a 4d0f45d3 cmovne r10,r11
fffff800`03ede78e 423b441710 cmp eax,dword ptr [rdi+r10+10h]
fffff800`03ede793 0f83e9020000 jae nt!KiSystemServiceExit+0x1a7 (fffff800`03edea82)
fffff800`03ede799 4e8b1417 mov r10,qword ptr [rdi+r10]
fffff800`03ede79d 4d631c82 movsxd r11,dword ptr [r10+rax*4]
fffff800`03ede7a1 498bc3 mov rax,r11
fffff800`03ede7a4 49c1fb04 sar r11,4
fffff800`03ede7a8 4d03d3 add r10,r11
fffff800`03ede7ab 83ff20 cmp edi,20h
fffff800`03ede7ae 7550 jne nt!KiSystemServiceGdiTebAccess+0x49 (fffff800`03ede800)
fffff800`03ede7b0 4c8b9bb8000000 mov r11,qword ptr [rbx+0B8h]
 posted on   Hanpto  阅读(188)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示