系统调用.docx
- 文档编号:28600202
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:15
- 大小:130.77KB
系统调用.docx
《系统调用.docx》由会员分享,可在线阅读,更多相关《系统调用.docx(15页珍藏版)》请在冰豆网上搜索。
系统调用
Windows系统调用
Windows2K通过2Eh中断来实现系统调用的,但是在XP后使用SysEnter来实现系统调用了,同时2Eh中断还是保存着的。
不管是2EH中断还是SYSENTER,Windows对所有的系统调用都会生成下面的KTRAP_FRAME堆栈框架。
KTRAP_FRAME框架结构图
用户态下使用2EH中断时,CPU会自动产生0x78和0x74以保存用户态下的堆栈和指针;若直接是从系统层调用2EH,则CPU是不会自动保存堆栈的,所以需要程序自己保存。
SYSTENTER只能是从RING3(用户态)到RING0(系统态)。
和2EH中断不同,CPU执行SYSENTER是不会自动在堆栈中保存数据的。
所以为了2EH时堆栈情况一致,需要处理程序模拟保存一些数据。
2EH和SYSENTER的堆栈一致后,下面真正的系统调用时一样的,最后返回时根据调用的不同返回情况也不同。
SYSENTER系统服务调用过程
以NtReadFile调用为例。
一.NtDll.Dll中,NtReadFile过程如下:
ntdll!
NtReadFile:
7c92d9b0b8b7000000 mov eax,0B7h
7c92d9b5ba0003fe7f mov edx,offsetSharedUserData!
SystemCallStub(7ffe0300)
7c92d9baff12 call dwordptr[edx]
7c92d9bcc22400 ret 24h
二.0x7ffe0300地址存放0x7c92e4f0,反汇编它:
ntdll!
KiFastSystemCall:
7c92e4f08bd4 mov edx,esp
7c92e4f20f34 sysenter
因为SYSENTER执行时,CPU并不会向CALL一样保存返回地址和状态信息,所以需要这样一个“桩”(STUB)段,通过它来保存返回信息。
同样的,下面的(五)就是利用这里保存的返回信息返回值NtReadFile中。
这里的KiFastSystemCall和(五)中的SystemCallReturn都是保存在_KUSER_SHARED_DATA结构中。
用户态下的0X7FFE0000和系统态下的0XFFDF0000同时指向它。
结构如下:
nt!
_KUSER_SHARED_DATA
+0x000TickCountLow :
Uint4B
+0x004TickCountMultiplier:
Uint4B
+0x008InterruptTime :
_KSYSTEM_TIME
+0x014SystemTime :
_KSYSTEM_TIME
+0x020TimeZoneBias :
_KSYSTEM_TIME
+0x02cImageNumberLow :
Uint2B
+0x02eImageNumberHigh :
Uint2B
+0x030NtSystemRoot :
[260]Uint2B
+0x238MaxStackTraceDepth:
Uint4B
+0x23cCryptoExponent :
Uint4B
+0x240TimeZoneId :
Uint4B
+0x244Reserved2 :
[8]Uint4B
+0x264NtProductType :
_NT_PRODUCT_TYPE
+0x268ProductTypeIsValid:
UChar
+0x26cNtMajorVersion :
Uint4B
+0x270NtMinorVersion :
Uint4B
+0x274ProcessorFeatures:
[64]UChar
+0x2b4Reserved1 :
Uint4B
+0x2b8Reserved3 :
Uint4B
+0x2bcTimeSlip :
Uint4B
+0x2c0AlternativeArchitecture:
_ALTERNATIVE_ARCHITECTURE_TYPE
+0x2c8SystemExpirationDate:
_LARGE_INTEGER
+0x2d0SuiteMask :
Uint4B
+0x2d4KdDebuggerEnabled:
UChar
+0x2d5NXSupportPolicy :
UChar
+0x2d8ActiveConsoleId :
Uint4B
+0x2dcDismountCount :
Uint4B
+0x2e0ComPlusPackage :
Uint4B
+0x2e4LastSystemRITEventTickCount:
Uint4B
+0x2e8NumberOfPhysicalPages:
Uint4B
+0x2ecSafeBootMode :
UChar
+0x2f0TraceLogging :
Uint4B
+0x2f8TestRetInstruction:
Uint8B
+0x300SystemCall :
Uint4B
+0x304SystemCallReturn:
Uint4B
+0x308SystemCallPad :
[3]Uint8B
+0x320TickCount :
_KSYSTEM_TIME
+0x320TickCountQuad :
Uint8B
+0x330Cookie :
Uint4B
三.显示MSR,因为SYSENTER和SYSEXIT需要它。
lkd>rdmsr174
msr[174]=00000000`00000008 ;RING0下CS
lkd>rdmsr175
msr[175]=00000000`f78bb000 ;进入RING0后的ESP
lkd>rdmsr176
msr[176]=00000000`804de89f ;进入RING0后的EIP
XPGDT如下,SYSENTER和SYSEXIT用到这些:
000800000000ffffffffCodeREAc0BgPgP Nl00000c9b;RING0下CS
001000000000ffffffffDataRWAc0BgPgP Nl00000c93;RING0下SS
001800000000ffffffffCodeREAc3BgPgP Nl00000cfb;RING3下CS
002000000000ffffffffDataRWAc3BgPgP Nl00000cf3;RING3下SS
四.进入RING0
反汇编0x804de89f,nt!
KiFastCallEntry.
这个过程分成3部分:
1).每次调用都会创建一个_KTRAP_FRAME框架,第一部分就是创建这个框架
nt!
_KTRAP_FRAME
+0x000DbgEbp :
Uint4B
+0x004DbgEip :
Uint4B
+0x008DbgArgMark :
Uint4B
+0x00cDbgArgPointer :
Uint4B
+0x010TempSegCs :
Uint4B
+0x014TempEsp :
Uint4B
+0x018Dr0 :
Uint4B
+0x01cDr1 :
Uint4B
+0x020Dr2 :
Uint4B
+0x024Dr3 :
Uint4B
+0x028Dr6 :
Uint4B
+0x02cDr7 :
Uint4B
+0x030SegGs :
Uint4B
+0x034SegEs :
Uint4B
+0x038SegDs :
Uint4B
+0x03cEdx :
Uint4B
+0x040Ecx :
Uint4B
+0x044Eax :
Uint4B
+0x048PreviousPreviousMode:
Uint4B
+0x04cExceptionList :
Ptr32_EXCEPTION_REGISTRATION_RECORD
+0x050SegFs :
Uint4B
+0x054Edi :
Uint4B
+0x058Esi :
Uint4B
+0x05cEbx :
Uint4B
+0x060Ebp :
Uint4B
+0x064ErrCode :
Uint4B
+0x068Eip :
Uint4B
+0x06cSegCs :
Uint4B
+0x070EFlags :
Uint4B
+0x074HardwareEsp :
Uint4B
+0x078HardwareSegSs :
Uint4B
+0x07cV86Es :
Uint4B
+0x080V86Ds :
Uint4B
+0x084V86Fs :
Uint4B
+0x088V86Gs :
Uint4B
2).直接调用内核中的服务过程
3).从第一部分中创建的框架_KTRAP_FRAME中,返回至RING3状态
第一部分创建框架
nt!
KiFastCallEntry:
804de89fb923000000 mov ecx,23h
804de8a46a30 push 30h
804de8a60fa1 pop fs ;RING0下FS=0x30
804de8a88ed9 mov ds,cx;RING3下0x20数据段
804de8aa8ec1 mov es,cx;RING3下0x20数据段
804de8ac648b0d40000000 mov ecx,dwordptrfs:
[40h];TSS
804de8b38b6104 mov esp,dwordptr[ecx+4]
804de8b66a23 push 23h
804de8b852 push edx
804de8b99c pushfd
804de8ba6a02 push 2
804de8bc83c208 add edx,8
804de8bf9d popfd ;EFLAGS=2
804de8c0804c240102 or byteptr[esp+1],2;EFLAGS设置。
804de8c56a1b push 1Bh
804de8c7ff350403dfff push dwordptrds:
[0FFDF0304h]
804de8cd6a00 push 0
804de8cf55 push ebp
804de8d053 push ebx
804de8d156 push esi
804de8d257 push edi
804de8d3648b1d1c000000 mov ebx,dwordptrfs:
[1Ch]
804de8da6a3b push 3Bh
804de8dc8bb324010000 mov esi,dwordptr[ebx+124h]
804de8e2ff33 push dwordptr[ebx]
804de8e4c703ffffffff mov dwordptr[ebx],0FFFFFFFFh
804de8ea8b6e18 mov ebp,dwordptr[esi+18h]
804de8ed6a01 push 1
804de8ef83ec48 sub esp,48h
804de8f281ed9c020000 sub ebp,29Ch
804de8f8c6864001000001 mov byteptr[esi+140h],1
804de8ff3bec cmp ebp,esp
804de9010f8565ffffff jne nt!
KiFastCallEntry2+0x25(804de86c)
804de90783652c00 and dwordptr[ebp+2Ch],0
804de90bf6462cff test byteptr[esi+2Ch],0FFh
804de90f89ae34010000 mov dwordptr[esi+134h],ebp
804de9150f8535feffff jne nt!
Dr_FastCallDrSave(804de750)
804de91b8b5d60 mov ebx,dwordptr[ebp+60h]
804de91e8b7d68 mov edi,dwordptr[ebp+68h]
804de92189550c mov dwordptr[ebp+0Ch],edx
804de924c74508000ddbba mov dwordptr[ebp+8],0BADB0D00h
804de92b895d00 mov dwordptr[ebp],ebx
804de92e897d04 mov dwordptr[ebp+4],edi
804de931fb sti
第一部分执行完后,_KTRAP_FRAME如下图。
第二部分真正的系统调用,此时EAX=系统调用号;EDX=调用参数;ESI=当前线程ETHREAD.
804de9328bf8 mov edi,eax
804de934c1ef08 shr edi,8
804de93783e730 and edi,30h
804de93a8bcf mov ecx,edi
804de93c03bee0000000 add edi,dwordptr[esi+0E0h]
804de9428bd8 mov ebx,eax
804de94425ff0f0000 and eax,0FFFh
804de9493b4708 cmp eax,dwordptr[edi+8]
804de94c0f8330fdffff jae nt!
KiBBTUnexpectedRange(804de682)
804de95283f910 cmp ecx,10h
804de955751b jne nt!
KiFastCallEntry+0xcf(804de972)
804de957648b0d18000000 mov ecx,dwordptrfs:
[18h]
804de95e33db xor ebx,ebx
804de9600b99700f0000 or ebx,dwordptr[ecx+0F70h]
804de966740a je nt!
KiFastCallEntry+0xcf(804de972)
804de96852 push edx
804de96950 push eax
804de96aff1568355680 call dwordptr[nt!
KeGdiFlushUserBatch(80563568)]
804de97058 pop eax
804de9715a pop edx
804de97264ff0538060000 inc dwordptrfs:
[638h] <--KPRCB.KeSystemCalls增加一个计数
804de9798bf2 mov esi,edx
804de97b8b5f0c mov ebx,dwordptr[edi+0Ch]
804de97e33c9 xor ecx,ecx
804de9808a0c18 mov cl,byteptr[eax+ebx]
804de9838b3f mov edi,dwordptr[edi]
804de9858b1c87 mov ebx,dwordptr[edi+eax*4]
804de9882be1 sub esp,ecx
804de98ac1e902 shr ecx,2
804de98d8bfc mov edi,esp
804de98f3b35d48e5680 cmp esi,dwordptr[nt!
MmUserProbeAddress(80568ed4)]
804de9950f83a8010000 jae nt!
KiSystemCallExit2+0x9f(804deb43)
804de99bf3a5 repmovsdwordptres:
[edi],dwordptr[esi]
804de99dffd3 call ebx
804de99f8be5 mov esp,ebp
804de9a1648b0d24010000 mov ecx,dwordptrfs:
[124h]
804de9a88b553c mov edx,dwordptr[ebp+3Ch]
804de9ab899134010000 mov dwordptr[ecx+134h],edx
第三部分返回至RING3
nt!
KiServiceExit:
804de9b1fa cli
804de9b2f7457000000200 test dwordptr[ebp+70h],20000h
804de9b97506 jne nt!
KiServiceExit+0x10(804de9c1)
804de9bbf6456c01 test byteptr[ebp+6Ch],1
804de9bf7456 je nt!
KiServiceExit+0x66(804dea17)
804de9c1648b1d24010000 mov ebx,dwordptrfs:
[124h]
804de9c8c6432e00 mov byteptr[ebx+2Eh],0
804de9cc807b4a00 cmp byteptr[ebx+4Ah],0
804de9d07445 je nt!
KiServiceExit+0x66(804dea17)
804de9d28bdd mov ebx,ebp
804de9d4894344 mov dwordptr[ebx+44h],eax
804de9d7c743503b000000 mov dwordptr[ebx+50h],3Bh
804de9dec7433823000000 mov dwordptr[ebx+38h],23h
804de9e5c7433423000000 mov dwordptr[ebx+34h],23h
804de9ecc7433000000000 mov dwordptr[ebx+30h],0
804de9f3b901000000 mov ecx,1
804de9f8ff152c904d80
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 系统 调用