KiFastCallEntry 里面有
83c8838f 8bf8 mov edi,eax // eax 系统调用号
83c88391 c1ef08 shr edi,8 // eax 除以 256 取整
83c88394 83e710 and edi,10h // eax 是否大于 0x1000
83c88397 8bcf mov ecx,edi // ecx 是0x00 或者 0x10
83c88399 03bebc000000 add edi,dword ptr [esi+0BCh]
// KThread.ServiceTable (KeServiceDescriptorTable or KeServiceDescriptorTableShadow)
83c8839f 8bd8 mov ebx,eax
83c883a1 25ff0f0000 and eax,0FFFh // 系统调用号是否 超过 0xFFF
83c883a6 3b4708 cmp eax,dword ptr [edi+8] // 比较 KSYSTEM_SERVICE_TABLE.NumberOfService
83c883a9 0f8333fdffff jae nt!KiBBTUnexpectedRange (83c880e2) // 调用号 异常
// 2
83c883af 83f910 cmp ecx,10h
83c883b2 751a jne nt!KiFastCallEntry+0xce (83c883ce) ----------------------------------
|
Win32: |
|
83c883b4 8b8e88000000 mov ecx,dword ptr [esi+88h] // Teb: Ptr32 Void |
83c883ba 33f6 xor esi,esi |
83c883bc 0bb1700f0000 or esi,dword ptr [ecx+0F70h] // GdiBatchCount : Uint4B |
83c883c2 740a je nt!KiFastCallEntry+0xce (83c883ce) |
83c883c4 52 push edx |
83c883c5 50 push eax |
83c883c6 ff154cd9da83 call dword ptr [nt!KeGdiFlushUserBatch (83dad94c)] |
83c883cc 58 pop eax |
83c883cd 5a pop edx |
|
<----------------------------------------------------------------------------------------------------
NoWin32:
然后 《Windows 内核情景分析》 里面说要看是 主表(KSERVICE_TABLE_DESCRIPTOR.ntoskrnl) 还是 副表(KSERVICE_TABLE_DESCRIPTOR.win32k) 要看 ecx 是否为 0x10 或者 0x00
只有在 调用号 大于 0x1000 ecx才会 为 0x10 啊。。。
Shadow SSDT 的调用号也没超过 0x1000 啊。。。何来的 eax > 0x1000 让 ecx 等于 0x10 调用副表。。。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课