3.1.系统调用
OpenProcess和ReadProcessMemory从3环进0环的过程
kernel32.OpenProcess KernelBase.OpenProcess Ntdll.NtOpenProcess 7FFE0300(获取KiFastCallEntry) sysenter
ZwOpenProcess
edx,esp
KiFastSystemCall
main.cpp
kd> dt _KPCR
dt _KPCR 每个cpu逻辑核的状态
5.KUSER_SHARED_DATA
6.KUSER_SHARED_DATA FFDF0000
304位置是 SystemCallReturn
7.ntdll.dll --> ZwOpenProcess
ServiceTable:指向函数地址表,KeServiceDescriptorTable+服务号*4 = 函数地址 Count:系统服务表被调用的次数
ServiceLimit:函数数量
ArgmentTable:函数参数表,每个参数4个字节.获取字节数后处以4,得到函数参数个数
kd> .thread
kd> dd 0x83fbcb00 83fbcb00 83ed052c 00000000 00000191 83ed0b74 83fbcb10 00000000 00000000 00000000 00000000
3.3.系统调用返回R3
在Ring0 代码执行完毕,调用SYSEXIT 指令退回Ring3 时,CPU 会做出如下操作
3.4.SSDThook
tools.h
tools.c
}
KdPrint(("找到函数%s addr %p\r\n", funcName, funcAddr));
}
{
#include #include "tools.h"