您的位置:首页 > 其它

枚举内核模块

2014-04-24 15:21 561 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: