枚举内核模块

NTSTATUS MyEnumKernelModule(IN CHAR* str,OUT ULONG *moduleadd,OUT ULONG *modulesie)
{
  NTSTATUS status = STATUS_SUCCESS;
  ULONG   n       = 0;
  ULONG   i       = 0;
  PSYSTEM_MODULE_INFORMATION_ENTRY   module = NULL;
  PVOID   pbuftmp = NULL;
  ANSI_STRING    ModuleName1,ModuleName2;
  BOOLEAN  tlgstst= FALSE;  //如果找到了指定模块则设置为TRUE
  
  //利用11号功能 枚举内核模块
  status = ZwQuerySystemInformation(11, &n, 0, &n);
  
  //申请内存
  pbuftmp = ExAllocatePool(NonPagedPool, n);
  
  //再次执行,将 枚举结果放到指定的内存区域
  status = ZwQuerySystemInformation(11, pbuftmp, n, NULL);
  module = (PSYSTEM_MODULE_INFORMATION_ENTRY)((PULONG )pbuftmp + 1 );
  
  //初始化字符串 
  RtlInitAnsiString(&ModuleName1,str);

  n       = *((PULONG)pbuftmp );

  for ( i = 0; i < n; i++ )
  {
    RtlInitAnsiString(&ModuleName2,&module[i].ImageName);
    //DbgPrint("%d\t0x%08X 0x%08X %s\n",module[i].LoadOrderIndex,module[i].Base,module[i].Size,module[i].ImageName);
    
    if (RtlCompareString(&ModuleName1,&ModuleName2,TRUE) == 0)
    {
      DbgPrint("MyEnumKernelModule:%s:%0X \n",ModuleName2.Buffer,module[i].Base);
      *moduleadd  = module[i].Base;
      *modulesie  = module[i].Size;
      tlgstst = TRUE;
      break;
    }
  }

  ExFreePool(pbuftmp);

  if tlgstst == FALSE)
  {
    return  FAILED_TO_OBTAIN_FUNCTION_ADDRESSES;
  }

  return status;

转至:http://bbs.pediy.com/showthread.php?t=185057&highlight=%E6%9E%9A%E4%B8%BE+%E4%B8%BE%E9%A9%B1+%E9%A9%B1%E5%8A%A8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值