getKernel32Address自实现(x64下写法)

本文详细解释了如何通过HMODULEgetKernel32Address函数在Windows内核级别动态查找Kernel32.dll的地址,避免因头文件重定义问题而采取特殊处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>,而是使用将需要的复制出来单独写一个头文件
在这里插入图片描述
比如这样,我将需要的全部写到一个头文件,然后我在主代码中调用头文件
在这里插入图片描述
这样就不会重定义了,正常编译成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值