进程注入通常都是涉及 CreateRemoteThread调用。在内核会调用到NtCreateThread(2008,vista,win7是NtCreateThreadEx),所以检测方法是Hook NtCreateThread,在钩子函数中判别是否是CreateRemoteThread调用引起。
CreateRemoteThread和CreateThread最终都会调用到NtCreateThread,所以需要对这两个方法进行区别判断,方法是CreateRemoteThread的目标进程ID和当前ID是不一样的,而CreateThread是相同的。
看NtCreateThread原型:
NTSTATUS NtCreateThread(
OUT PHANDLE ThreadHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN HANDLE ProcessHandle,
OUT PCLIENT_ID ClientId,
IN PCONTEXT ThreadContext,
IN PINITIAL_TEB InitialTeb,
IN BOOLEAN CreateSuspended );
这里的ProcessHandle是目标进程Handle,通过这个Handle获得目标进程ID,然后通过PsGetCurrentProcessId得到当前的进程ID,比较这两个ID。
通过ProcessHandle得到目标进程ID的方法:
DWORD GetProcessIDByHandle(HANDLE