找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5826|回复: 2

[转换][非原创]驱动里枚举内核模块

  [复制链接]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-7-9 13:11:08 | 显示全部楼层 |阅读模式
本帖最后由 Tesla.Angela 于 2010-7-9 13:12 编辑

拿网上Ring 3的代码转成Ring 0的,没什么价值,发这里当是灌水了。
#include <ntddk.h>

NTKERNELAPI    NTSTATUS ObOpenObjectByPointer( IN PVOID  Object,IN ULONG  HandleAttributes,IN PACCESS_STATE PassedAccessState,IN ACCESS_MASK DesiredAccess,IN POBJECT_TYPE ObjectType,IN KPROCESSOR_MODE  AccessMode,OUT HANDLE Handle );
NTKERNELAPI    NTSTATUS ZwQuerySystemInformation(ULONG SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength);
NTKERNELAPI    NTSTATUS ZwAllocateVirtualMemory(HANDLE ProcessHandle,PVOID *BaseAddress,ULONG_PTR ZeroBits,PSIZE_T RegionSize,ULONG AllocationType,ULONG Protect);
NTKERNELAPI    NTSTATUS ZwFreeVirtualMemory(HANDLE ProcessHandle,PVOID *BaseAddress,PSIZE_T RegionSize,ULONG FreeType);

typedef struct _SYSTEM_MODULE_INFORMATION
{
    ULONG   Reserved[2];
    PVOID   Base;
    ULONG   Size;
    ULONG   Flags;
    USHORT  Index;
    USHORT  Unknown;
    USHORT  LoadCount;
    USHORT  ModuleNameOffset;
    CHAR    ImageName[256];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;

HANDLE GetCurrentProcess()
{
    HANDLE hprocess;
    ObOpenObjectByPointer(PsGetCurrentProcess(),0,0,0,0,0,&hprocess) ;
    return hprocess;
}

int EnumKernelDlls()
{
    NTSTATUS status = STATUS_SUCCESS;
    ULONG moduleNum,len,retLen;
    PSYSTEM_MODULE_INFORMATION module = NULL;
    HANDLE CurProc = GetCurrentProcess();
    PVOID buf=0;
    int ii=0;
    ZwQuerySystemInformation(11,NULL,0,&len);//DbgPrint("len= %d\n",len);
    status=ZwAllocateVirtualMemory(CurProc,&buf,0,&len,MEM_COMMIT,PAGE_READWRITE);
    if (!NT_SUCCESS(status))
    {
        DbgPrint("allocate failed !\n");
        return 0;
    }
    status=ZwQuerySystemInformation(11,buf,len,&retLen);
    if (!NT_SUCCESS(status))
    {
        DbgPrint("query failed!\n");
        return 0;
    }
    module=(PSYSTEM_MODULE_INFORMATION)((PULONG)buf+1);
    moduleNum=*((PULONG)buf);
    DbgPrint("\n--------------------------------------------------------------------\n");
    for (ii=0;ii<moduleNum;ii++)
    {
        DbgPrint("ID:%3d\tBaseAddress:0x%08X\tModuleName:%12s\tsize:%7d\n",

                    ii+1,
                    module->Base,
                    module->ImageName + module->ModuleNameOffset,
                    module->Size);
        module++;
    }
    DbgPrint("--------------------------------------------------------------------\n");
    ZwFreeVirtualMemory(CurProc,&buf,&len,MEM_RELEASE);
    return 0;
}

顺便赞一下老罗的代码高亮软件,真好用。

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-7-10 21:50:30 | 显示全部楼层
转载:通过PsLoadedModuleList枚举驱动

  1. /*
  2. By VirusWizard
  3. 2009.7.18
  4. 一种相对来说比较古老的方法,NtQuerySystemInformation内部也是使用这种方法。
  5. 对付此方法相当简单,从双向链表里摘除即可。
  6. 这个LDR_DATA_TABLE_ENTRY结构算是比较完整的了,从WRK抠出来的。
  7. LDR_DATA_TABLE_ENTRY也可以用于枚举PEB中的模块,隐藏模块的方法也是一样的。
  8. */
  9. typedef struct _LDR_DATA_TABLE_ENTRY {
  10.      LIST_ENTRY InLoadOrderLinks;
  11.      LIST_ENTRY InMemoryOrderLinks;
  12.      LIST_ENTRY InInitializationOrderLinks;
  13.     PVOID DllBase;
  14.     PVOID EntryPoint;
  15.     ULONG SizeOfImage;
  16.     UNICODE_STRING FullDllName;
  17.     UNICODE_STRING BaseDllName;
  18.     ULONG Flags;
  19.     USHORT LoadCount;
  20.     USHORT TlsIndex;
  21.     union {
  22.          LIST_ENTRY HashLinks;
  23.          struct {
  24.             PVOID SectionPointer;
  25.             ULONG CheckSum;
  26.          };
  27.      };
  28.     union {
  29.          struct {
  30.             ULONG TimeDateStamp;
  31.          };
  32.          struct {
  33.             PVOID LoadedImports;
  34.          };
  35.      };
  36.      struct _ACTIVATION_CONTEXT * EntryPointActivationContext;
  37.     PVOID PatchInformation;
  38. } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

  39. NTSTATUS EnumDriver(
  40.             PDRIVER_OBJECT pDrvObj
  41.              );
  42. //////////////////////////////////////////////////////////////////////////
  43. NTSTATUS DriverEntry(
  44.              PDRIVER_OBJECT pDriverObj,
  45.              PUNICODE_STRING pRegistryString
  46.               )
  47. {
  48.      pDriverObj->DriverUnload = DriverUnload;
  49.      EnumDriver(pDriverObj);
  50.      dprintf("[EnumDrv] Loaded \n");
  51.     return STATUS_SUCCESS;
  52. }

  53. VOID DriverUnload(
  54.           PDRIVER_OBJECT pDriverObj
  55.            )
  56. {
  57.      dprintf("[EnumDrv] Unloaded\n");
  58. }

  59. NTSTATUS EnumDriver(
  60.             PDRIVER_OBJECT pDrvObj
  61.              )
  62. {
  63.     NTSTATUS status = STATUS_UNSUCCESSFUL;
  64.      PLIST_ENTRY pList = NULL;
  65.      PLDR_DATA_TABLE_ENTRY Ldr = NULL;
  66.     int nCount = 0;
  67.      pList = ( (PLIST_ENTRY)pDrvObj->DriverSection )->Flink;
  68.     do
  69.      {
  70.          Ldr = CONTAINING_RECORD(
  71.              pList,
  72.              LDR_DATA_TABLE_ENTRY,
  73.              InLoadOrderLinks);
  74.         if ( Ldr->EntryPoint &&
  75.              Ldr->FullDllName.Buffer )
  76.          {
  77.              dprintf("DriveName : %S\n",Ldr->FullDllName.Buffer);
  78.              dprintf("ImageBase : 0x%08X.\n",Ldr->DllBase);
  79.              dprintf("ImageSize : 0x%08X.\n",Ldr->SizeOfImage);
  80.              dprintf("EntryPoint : 0x%08X.\n",Ldr->EntryPoint);
  81.              dprintf("-------------------------------\n");
  82.              nCount++;
  83.          }
  84.          pList = pList->Flink;
  85.      } while ( pList != ((LIST_ENTRY*)pDrvObj->DriverSection)->Flink );
  86.      dprintf("NumOfDriver : %d.\n",nCount);
  87.     return STATUS_SUCCESS;
  88. }a
复制代码
如果附件无法下载,请点击这里
本网站最菜的人 该用户已被删除
发表于 2010-7-10 22:10:47 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表