ZwQuerySystemInformation 枚举驱动模块

在R0下利用ZwQuerySystemInformation 查 SystemModuleInformation 来枚举驱动模块

代码如下:

////
//        rootkit.h
////
#define ULONG unsigned long
#define PULONG unsigned long *
#define PVOID void *
#define USHORT unsigned short

#define SystemModuleInformationClass  11

typedef struct
{
    PVOID section;
    PVOID MappedBase;
    PVOID ImageBase;
    ULONG ImageSize;
    ULONG Flags;
    USHORT LoadOrderIndex;
    USHORT InitOrderIndex;
    USHORT LoadCount;
    USHORT PathLength;
    char ImageName[MAXIMUM_FILENAME_LENGTH];

}SYSTEM_MODULE,*PSYSTEM_MODULE;

typedef struct
{
    ULONG ModuleCount;
    SYSTEM_MODULE Module[0];    
}SYSTEM_MODULE_INFORMATION,*PSYSTEM_MODULE_INFORMATION;



NTKERNELAPI NTSTATUS ZwQuerySystemInformation(
        ULONG SystemInformationClass,
        PVOID SystemInformation,
        ULONG SystemInformationLength,
        PULONG ReturnLength OPTIONAL
);


 

#include "ntddk.h"
#include "rootkit.h"



void OnUnload(PDRIVER_OBJECT pDriverObj)
{
    DbgPrint("Driver is Unload!\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pRootkitObj,PUNICODE_STRING pRegistPath)
{
    NTSTATUS ntStatus;
    ULONG count;
    ULONG BufferSize=0;

    PSYSTEM_MODULE_INFORMATION pSystemModuleInformation=NULL;
    PSYSTEM_MODULE pSystemModule=NULL;

    pRootkitObj->DriverUnload=OnUnload;

    ZwQuerySystemInformation(SystemModuleInformationClass,NULL,0,&BufferSize);
    pSystemModuleInformation=(PSYSTEM_MODULE_INFORMATION) ExAllocatePool(PagedPool,BufferSize);
    if(pSystemModuleInformation==NULL)
    {
        DbgPrint("ExAllocatePool failed!\n");
        return STATUS_UNSUCCESSFUL;
    }
    ntStatus=ZwQuerySystemInformation(SystemModuleInformationClass,pSystemModuleInformation,BufferSize,NULL);
    if(!NT_SUCCESS(ntStatus))
    {
        DbgPrint("ZwQuerySystemInformation failed!\n");
        ExFreePool(pSystemModuleInformation);
        return ntStatus;
    }
    
    pSystemModule=pSystemModuleInformation->Module;

    for(count=0;count<pSystemModuleInformation->ModuleCount;count++)
    {
        DbgPrint("LoadIndex=%d        \tImageBase=0x%08X        \tImageSize=0x%08X        \tImageName=%s\n",
            pSystemModule[count].LoadOrderIndex,
            pSystemModule[count].ImageBase,
            pSystemModule[count].ImageSize,
            pSystemModule[count].ImageName);

    }

    
    return STATUS_SUCCESS;
}

 

转载于:https://www.cnblogs.com/ktr39/p/3494733.html

资源介绍:getsystemdrive枚举驱动源代码,驱动调试例程资源作者:易语言模块源码下载资源界面:.版本 2 .程序集 程序集1 .子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码 _临时子程序 ()  ' 在初始化代码执行完毕后调用测试代码 返回 (0)  ' 可以根据您的需要返回任意数值 .子程序 _临时子程序 ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。 .子程序 getsystemdrive, 逻辑型, 公开 .参数 数组, 文本型, 数组 .参数 数组个数, 整数型 .参数 驱动地址, 文本型, 可空 数组 .局部变量 lpImageBase, 整数型, , "0" .局部变量 lpcbNeeded, 整数型, , "0" .局部变量 a, 整数型 .局部变量 文本, 文本型 数组清零 (lpImageBase) 重定义数组 (lpImageBase, 假, 数组个数) '  EnumDeviceDrivers (lpImageBase, 数组个数, lpcbNeeded) 文本 = 取空白文本 (数组个数) .计次循环首 (取数组成员数 (lpImageBase), a)     GetDeviceDriverBaseName (lpImageBase [a], 文本, 数组个数)     .判断开始 (lpImageBase [a] ≠ 0)         加入成员 (驱动地址, 取十六进制文本 (lpImageBase [a]))         加入成员 (数组, 文本)     .默认         '      .判断结束 .计次循环尾 () 返回 (真)资源下载:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值