getKernel32Address自实现(x64下写法)

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;
}

getKernel32Address自实现(x64下写法)_第1张图片
getKernel32Address自实现(x64下写法)_第2张图片
注意事项:
UNICODE_STRING* FullName;这个结构体要用到#include ,但是我们已经包含了#include ,一个内核级的一个windows的,那么会有很多函数重定义,会有重合,所以我们不要直接#include ,而是使用将需要的复制出来单独写一个头文件
getKernel32Address自实现(x64下写法)_第3张图片
比如这样,我将需要的全部写到一个头文件,然后我在主代码中调用头文件
getKernel32Address自实现(x64下写法)_第4张图片
这样就不会重定义了,正常编译成功

你可能感兴趣的:(网络安全,c++)