过程: OpenProcess->NtOpenProcess->KiFastSystemCall->sysenter
kd> u ntdll!NtOpenProcess
ntdll!ZwOpenProcess:
7c92d5fe b87a000000 mov eax,7Ah
7c92d603 ba0003fe7f mov edx,offset SharedUserData!SystemCallStub (7ffe0300)
7c92d608 ff12 call dword ptr [edx] //进入SystemCall eax装载的是函数调用号
7c92d60a c21000 ret 10h
7c92d60d 90 nop
嗯,NtOpenProcess调用了SharedUserData!SystemCallStub (7ffe0300)
而SharedUserData是一个数据结构
#define SharedUserData ((KUSER_SHARED_DATA * const) KI_USER_SHARED_DATA)
每个进程用户空间的0x7ffe0000都以只读方式映射到相同的物理页面上,而这个物理页面上就是KUSER_SHARED_DATA结构的数据 [0x7ffe0300]=[KUSER_SHARED_DATA偏移0x300处]=SystemCall=KiFastSystemCall
验证一下
kd> dd 7ffe0300
7ffe0300 7c92e510 7c92e514 00000000 00000000
kd> u 7c92e510
ntdll