分析系統調用(win下)
阿新 • • 發佈:2018-06-23
ado return 直接 ont 控制 http expec i+1 drs 分析快速系統調用的位置
int main()
{
CreateFile(
L"C:\\1.txt",
FILE_ALL_ACCESS,
NULL,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
return 0;
}
直接在CreateFileW上下斷點
進入之後,能夠看到
進入之後,能夠看到
這個SYSENTER就是三環世界的邊緣地帶了,OD就無法繼續分析了。
在SYSENTER上按F7,就直接回到了上一層函數。
分析MSR 0x174 0x175 0x176
kd> rdmsr 0x174
msr[174] = 00000000`00000008 //新的CS
kd> rdmsr 0x175
msr[175] = 00000000`80792000 //新的ESP
kd> rdmsr 0x176
msr[176] = 00000000`83e91790 //新的EIP
分析MSR 0x176號中存儲地址指向位置的代碼
nt!KiFastCallEntry: 83e91790 b923000000 mov ecx,23h 83e91795 6a30 push 30h 83e91797 0fa1 pop fs //fs被修改,指向了KPCR 83e91799 8ed9 mov ds,cx 83e9179b 8ec1 mov es,cx 83e9179d 648b0d40000000 mov ecx,dword ptr fs:[40h] 83e917a4 8b6104 mov esp,dword ptr [ecx+4] 83e917a7 6a23 push 23h 83e917a9 52 push edx 83e917aa 9c pushfd 83e917ab 6a02 push 2 83e917ad 83c208 add edx,8 83e917b0 9d popfd 83e917b1 804c240102 or byte ptr [esp+1],2 83e917b6 6a1b push 1Bh 83e917b8 ff350403dfff push dword ptr ds:[0FFDF0304h] 83e917be 6a00 push 0 83e917c0 55 push ebp 83e917c1 53 push ebx 83e917c2 56 push esi 83e917c3 57 push edi 83e917c4 648b1d1c000000 mov ebx,dword ptr fs:[1Ch] //重要 得到KPCR自己 83e917cb 6a3b push 3Bh 83e917cd 8bb324010000 mov esi,dword ptr [ebx+124h] //重要 得到當前執行線程的ETHREAD 83e917d3 ff33 push dword ptr [ebx] 83e917d5 c703ffffffff mov dword ptr [ebx],0FFFFFFFFh 83e917db 8b6e28 mov ebp,dword ptr [esi+28h] 83e917de 6a01 push 1 83e917e0 83ec48 sub esp,48h 83e917e3 81ed9c020000 sub ebp,29Ch 83e917e9 c6863a01000001 mov byte ptr [esi+13Ah],1 83e917f0 3bec cmp ebp,esp 83e917f2 7597 jne nt!KiFastCallEntry2+0x49 (83e9178b) 83e917f4 83652c00 and dword ptr [ebp+2Ch],0 83e917f8 f64603df test byte ptr [esi+3],0DFh 83e917fc 89ae28010000 mov dword ptr [esi+128h],ebp 83e91802 0f8538feffff jne nt!Dr_FastCallDrSave (83e91640) 83e91808 8b5d60 mov ebx,dword ptr [ebp+60h] 83e9180b 8b7d68 mov edi,dword ptr [ebp+68h] 83e9180e 89550c mov dword ptr [ebp+0Ch],edx 83e91811 c74508000ddbba mov dword ptr [ebp+8],0BADB0D00h 83e91818 895d00 mov dword ptr [ebp],ebx 83e9181b 897d04 mov dword ptr [ebp+4],edi 83e9181e fb sti 83e9181f 8bf8 mov edi,eax //edi中存放了調用號 83e91821 c1ef08 shr edi,8 //X YYYY YYYY YYYY //X YYYY //1 0000 //X 0000 //如果SSDT的話,X就是0,整個這個數就是0 //如果ShadowSSDT的話,X就是1,整個這個數就是16 83e91824 83e710 and edi,10h 83e91827 8bcf mov ecx,edi 83e91829 03bebc000000 add edi,dword ptr [esi+0BCh] //重要 得到服務表,自動就適應了SSDT或者ShadowSSDT 83e9182f 8bd8 mov ebx,eax 83e91831 25ff0f0000 and eax,0FFFh //X YYYY YYYY YYYY //0 1111 1111 1111 //0 YYYY YYYY YYYY 83e91836 3b4708 cmp eax,dword ptr [edi+8] 83e91839 0f8333fdffff jae nt!KiBBTUnexpectedRange (83e91572) 83e9183f 83f910 cmp ecx,10h 83e91842 751a jne nt!KiSystemServiceAccessTeb+0x12 (83e9185e) 83e91844 8b8e88000000 mov ecx,dword ptr [esi+88h] 83e9184a 33f6 xor esi,esi nt!KiSystemServiceAccessTeb: 83e9184c 0bb1700f0000 or esi,dword ptr [ecx+0F70h] 83e91852 740a je nt!KiSystemServiceAccessTeb+0x12 (83e9185e) 83e91854 52 push edx 83e91855 50 push eax 83e91856 ff1594dafb83 call dword ptr [nt!KeGdiFlushUserBatch (83fbda94)] 83e9185c 58 pop eax 83e9185d 5a pop edx 83e9185e 64ff05b0060000 inc dword ptr fs:[6B0h] 83e91865 8bf2 mov esi,edx //把用戶棧基址拷貝給了esi 83e91867 33c9 xor ecx,ecx 83e91869 8b570c mov edx,dword ptr [edi+0Ch] //這裏得到的是參數大小表 83e9186c 8b3f mov edi,dword ptr [edi] //重要 得到服務表中的函數地址表 //這個表叫做系統服務調度表(SSDT) 83e9186e 8a0c10 mov cl,byte ptr [eax+edx] //得到參數所占用的字節數 83e91871 8b1487 mov edx,dword ptr [edi+eax*4] //重要 得到了函數地址 83e91874 2be1 sub esp,ecx //棧頂擡高這麽大,準備拷貝參數 83e91876 c1e902 shr ecx,2 83e91879 8bfc mov edi,esp //內核棧是目的位置edi 83e9187b f6457202 test byte ptr [ebp+72h],2 83e9187f 7506 jne nt!KiSystemServiceAccessTeb+0x3b (83e91887) 83e91881 f6456c01 test byte ptr [ebp+6Ch],1 83e91885 740c je nt!KiSystemServiceCopyArguments (83e91893) 83e91887 3b3550d8fb83 cmp esi,dword ptr [nt!MmUserProbeAddress (83fbd850)] 83e9188d 0f832e020000 jae nt!KiSystemCallExit2+0xa5 (83e91ac1) nt!KiSystemServiceCopyArguments: 83e91893 f3a5 rep movs dword ptr es:[edi],dword ptr [esi] //拷貝參數 83e91895 f6456c01 test byte ptr [ebp+6Ch],1 83e91899 7416 je nt!KiSystemServiceCopyArguments+0x1e (83e918b1) 83e9189b 648b0d24010000 mov ecx,dword ptr fs:[124h] 83e918a2 8b3c24 mov edi,dword ptr [esp] 83e918a5 89993c010000 mov dword ptr [ecx+13Ch],ebx 83e918ab 89b92c010000 mov dword ptr [ecx+12Ch],edi 83e918b1 8bda mov ebx,edx //重要 83e918b3 f60588a6f88340 test byte ptr [nt!PerfGlobalGroupMask+0x8 (83f8a688)],40h 83e918ba 0f954512 setne byte ptr [ebp+12h] 83e918be 0f8580030000 jne nt!KiServiceExit2+0x179 (83e91c44) 83e918c4 ffd3 call ebx //重要 調用了真正的系統函數
KPCR(PROCESSPOR Control Region) 處理器控制域,其中存儲了CPU相關的信息,每一核CPU都有一個。
FS寄存器,在用戶層的時候,指向的是TEB,在內核層的時候,指向的是KPCR。
nt!_KPCR
+0x120 PrcbData : _KPRCB
+0x000 MinorVersion : ??
+0x002 MajorVersion : ??
+0x004 CurrentThread : ????
所以FS:[124]就是CurrentThread,當前運行線程的ETHREAD。
在ETHREAD的0xbc這個位置,存儲的是一個叫做服務表的東西。
kd> dt _KTHREAD
nt!_KTHREAD
+0x000 Header : _DISPATCHER_HEADER
+0x010 CycleTime : Uint8B
......
+0x0bc ServiceTable : Ptr32 Void
分析系統調用(win下)