问题
在研究进程注入的时候,发现在Win10 64位上调用NtCreateThreadEx可以执行成功,但是换到Win7 64位上会失败,并且返回GetLastError = 8,程序是以管理员运行且内部已实现提升进程访问权限。
解决方案
函数NtCreateThreadEx在32位和64位的定义有所不同,区分不同的系统位数选择函数声明节课解决在Win7 64位上调用失败的问题。
64位NtCreateThreadEx函数声明如下:
DWORD (__stdcall * _NtCreateThreadEx)( PHANDLE ThreadHandle, ACCESS_MASK DesiredAccess, LPVOID ObjectAttributes, HANDLE ProcessHandle, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, ULONG CreateThreadFlags, SIZE_T ZeroBits, SIZE_T StackSize, SIZE_T MaximumStackSize, LPVOID pUnkown) = NULL;
32位NtCreateThreadEx函数声明如下:
DWORD (__stdcall * _NtCreateThreadEx)( PHANDLE ThreadHandle, ACCESS_MASK DesiredAccess, LPVOID ObjectAttributes, HANDLE ProcessHandle, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, BOOL CreateSuspended, DWORD dwStackSize, DWORD Unknown1, DWORD Unknown2, LPVOID Unknown3 ) = NULL;
遗留问题
为什么在Win10 64位上使用32位的函数声明可以执行成功呢?