关于未公开函数ZwQuerySystemInformation的使用

本文介绍了在内核编程中遇到的未公开函数ZwQuerySystemInformation,详细讨论了其在获取系统模块信息时的作用。尽管微软官方未提供完整信息,但通过网络资源,作者分享了一段ring3环境下使用该函数获取进程模块信息的代码,并解析了SYSTEM_MODULE_INFORMATION结构。对比drivers.exe,揭示了ZwQuerySystemInformation在不同信息类下的功能。
摘要由CSDN通过智能技术生成

      最近看一些关于内核方面的资料,碰到未公开函数,未能在微软官方找到答案,从网上了解到一些信息,摘录下来备用。

      我看到驱动程序在ring0调用的一段代码的使用:

ULONG GetModuleBase(PCHAR szModuleName)
{
    ULONG uSize = 0x10000;
    PVOID pModuleInfo = ExAllocatePoolWithTag(NonPagedPool, 
                                            uSize, 
                                            'GetB');
    if (pModuleInfo == NULL)
    {
        KdPrint(("ExAllocatePoolWithTag failed\n"));
        return 0;
    }
    RtlZeroMemory(pModuleInfo, uSize);

    NTSTATUS status = ZwQuerySystemInformation(SystemModuleInformation, 
        pModuleInfo, 
        uSize, 
        NULL);

    if(!NT_SUCCESS(status))
    {
        KdPrint(("FindModuleByAddress query failed\n"));
        KdPrint(("FindModuleByAddress status: 0x%x\n", status));
        if (pModuleInfo != NULL)
        {
            ExFreePool(pModuleInfo);
            pModuleInfo = NULL;
        }
        return 0;
    }

    ULONG uNumberOfModules = *(PULONG)pModuleInfo;
    if (uNumberOfModules == 0)
    {
        return 0;
    }

    PRTL_PROCESS_MODULE_INFORMATION pStart = 
        (PRTL_PROCESS_MODULE_INFORMATION)((ULONG)pModuleInfo + sizeof(ULONG));

    for (ULONG uCount = 0; uCount < uNumberOfModules; uCount++)
    {
        PUCHAR pszFullPathName = (PUCHAR)pStart->FullPathName;

        ULONG uOffsetName = pStart->OffsetToFileName;

        PUCHAR pszName = (PUCHAR)(pszFullPathName + uOffsetName);

        if (_stricmp((const char *)pszName, szModuleName) == 0)
        {
            ULONG uImageBase = (ULONG)pStart->ImageBase;
            if (pModuleInfo != NULL)
            {
                ExFreePool(pModuleInfo);
                pModuleInfo = NULL;
            }
            return uImageBase;
        }

        pStart++;
    }
    
    if (pModuleInfo != NULL)
    {
        ExFreePool(pModuleInfo);
        pModuleInfo = NULL;
    }
    return 0;
}
      上面代码GetModuleBase功能是获取指定名字的模块的内存中的基址。

      其中ZwQuerySystemInformation函数微软官方链接:ZwQuerySystemInformation并未能提供足够的信息,SystemModuleInformation并没有在官方链接中找到描述的使用方法。我想官方不可能会漏掉这个使用,故意不公开一定是有原因的,传统上的原因是这块内容很可能在后面的版本改变不公开给用户使用。我不管是什么原因,能弄清楚这块内容,就是我的目标。

      函数原型:

NTSTATUS WINAPI ZwQuerySystemInformation(
  _In_       SYSTEM_INFORMATION_CLASS SystemInformationClass,
  _Inout_    PVOID SystemInformation,
  _In_       ULONG SystemInformationLength,
  _Out_opt_  PULONG ReturnLength
);

      在网上找到一段利用在ring3中利用ZwQuerySystemInformation来获取进程模块信息的代码,稍加修改,就可以正常编译运行,功能类似于ddk提供的drivers.exe的功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值