HMODULE getKernel32Address()
{
PVOID64 Peb = GetPeb();
PVOID64 LDR_DATA_Addr = *(PVOID64**)((BYTE*)Peb + 0x018); //0x018是LDR相对于PEB偏移 存放着LDR的基地址
UNICODE_STRING* FullName;
HMODULE hKernel32 = NULL;
LIST_ENTRY* pNode = NULL;
pNode = (LIST_ENTRY*)(*(PVOID64**)((BYTE*)LDR_DATA_Addr + 0x30)); //偏移到InInitializationOrderModuleList
while (true)
{
FullName = (UNICODE_STRING*)((BYTE*)pNode + 0x38);//BaseDllName基于InInitialzationOrderModuList的偏移
if (*(FullName->Buffer + 12) == '\0')
{
hKernel32 = (HMODULE)(*((ULONG64*)((BYTE*)pNode + 0x10)));//DllBase
break;
}
pNode = pNode->Flink;
}
return hKernel32;
}
注意事项:
UNICODE_STRING* FullName;这个结构体要用到#include <ntdef.h>,但是我们已经包含了#include <windows.h>,一个内核级的一个windows的,那么会有很多函数重定义,会有重合,所以我们不要直接#include <ntdef.h>,而是使用将需要的复制出来单独写一个头文件
比如这样,我将需要的全部写到一个头文件,然后我在主代码中调用头文件
这样就不会重定义了,正常编译成功