ring0内存遍历。获取函数地址

ZwQuerySystemInformation   函数的声明

 

NTKERNELAPI                                          //不知道为什么 据说DDK 里面有这个宏定义
NTSTATUS

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

 

我是这样声明的 

extern NTSTATUS ZwQuerySystemInformation(ULONG SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength);  //编译通过了,实际还没有测试。

 

第一个参数是一个枚举类型,传入的是你需要查询的信息的类型,如果你要查询进程的相关信息,则你需要传入SystemProcessesAndThreadsInformation,要是查询系统模块信息,传入SystemInformationClass

以下是这个enmu类型的定义。

typedef enum _SYSTEM_INFORMATION_CLASS {
SystemBasicInformation, // 0 Y N
SystemProcessorInformation, // 1 Y N
SystemPerformanceInformation, // 2 Y N
SystemTimeOfDayInformation, // 3 Y N
SystemNotImplemented1, // 4 Y N
SystemProcessesAndThreadsInformation, // 5 Y N
SystemCallCounts, // 6 Y N
SystemConfigurationInformation, // 7 Y N
SystemProcessorTimes, // 8 Y N
SystemGlobalFlag, // 9 Y Y
SystemNotImplemented2, // 10 Y N
SystemModuleInformation, // 11 Y N
SystemLockInformation, // 12 Y N
SystemNotImplemented3, // 13 Y N
SystemNotImplemented4, // 14 Y N
SystemNotImplemented5, // 15 Y N
SystemHandleInformation, // 16 Y N
SystemObjectInformation, // 17 Y N
SystemPagefileInformation, // 18 Y N
SystemInstructionEmulationCounts, // 19 Y N
SystemInvalidInfoClass1, // 20
SystemCacheInformation, // 21 Y Y
SystemPoolTagInformation, // 22 Y N
SystemProcessorStatistics, // 23 Y N
SystemDpcInformation, // 24 Y Y
SystemNotImplemented6, // 25 Y N
SystemLoadImage, // 26 N Y
SystemUnloadImage, // 27 N Y
SystemTimeAdjustment, // 28 Y Y
SystemNotImplemented7, // 29 Y N
SystemNotImplemented8, // 30 Y N
SystemNotImplemented9, // 31 Y N
SystemCrashDumpInformation, // 32 Y N
SystemExceptionInformation, // 33 Y N
SystemCrashDumpStateInformation, // 34 Y Y/N
SystemKernelDebuggerInformation, // 35 Y N
SystemContextSwitchInformation, // 36 Y N
SystemRegistryQuotaInformation, // 37 Y Y
SystemLoadAndCallImage, // 38 N Y
SystemPrioritySeparation, // 39 N Y
SystemNotImplemented10, // 40 Y N
SystemNotImplemented11, // 41 Y N
SystemInvalidInfoClass2, // 42
SystemInvalidInfoClass3, // 43
SystemTimeZoneInformation, // 44 Y N
SystemLookasideInformation, // 45 Y N
SystemSetTimeSlipEvent, // 46 N Y
SystemCreateSession, // 47 N Y
SystemDeleteSession, // 48 N Y
SystemInvalidInfoClass4, // 49
SystemRangeStartInformation, // 50 Y N
SystemVerifierInformation, // 51 Y Y
SystemAddVerifier, // 52 N Y
SystemSessionProcessesInformation // 53 Y N
}SYSTEM_INFORMATION_CLASS;

第二个参数是你用来接收信息的一片内存区域,第三个参数是这边内存的大小,第四个参数返回长度,不是必选的.

当我们第一个参数传入的是SystemProcessesAndThreadsInformation则返回的一片内存空间一个PSYSTEM_PROCESSES的结构。

当我们第一个参数传入的是SystemModuleInformation则返回的一片内存空间一个SYSTEM_MODULE_INFORMATION的结构


typedef struct _SYSTEM_MODULE_INFORMATION { // Information Class 11
    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;

 

 

 

PVOID ExAllocatePool(                                   //还是用的这个分配内存的。。。用下面的返回值定义PULONG 报错。
  __in  POOL_TYPE PoolType,
  __in  SIZE_T NumberOfBytes
);

PVOID ExAllocatePoolWithTag(                       //分配内存函数
  __in  POOL_TYPE PoolType,                         //内存的参数  见下个枚举类型
  __in  SIZE_T NumberOfBytes,                      //内存的大小  PAGE_SIZE
  __in  ULONG Tag                                           //感觉是这个内存区域的描述类的东西,就是给它起个名字。"tag1" 引号别少了
);
typedef enum _POOL_TYPE {
  NonPagedPool                    = 0,  一页的大小是PAGE_SIZE    大小在PAGE_SIZE上 必须是PAGE_SIZE的整倍数
  PagedPool                       = 1,
  NonPagedPoolMustSucceed         = 2,
  DontUseThisType                 = 3,
  NonPagedPoolCacheAligned        = 4,
  PagedPoolCacheAligned           = 5,
  NonPagedPoolCacheAlignedMustS   = 6
} POOL_TYPE;

 

 

代码还没完善 目前问题很大  有空在修改

ULONG getFunAdd(ULONG feature1, ULONG feature2, ULONG feature3, ULONG feature4) //获取函数原始地址
{
// extern NTSTATUS ZwQuerySystemInformation(ULONG SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength);
NTKERNELAPI
NTSTATUS ZwQuerySystemInformation(
        IN  ULONG SystemInformationClass,
        IN  OUT PVOID SystemInformation,
        IN  ULONG SystemInformationLength,
        OUT PULONG ReturnLength OPTIONAL
);
typedef struct _SYSTEM_MODULE_INFORMATION_ENTRY
{
    ULONG  Unknown1;
    ULONG  Unknown2;
#ifdef _WIN64
        ULONG Unknown3;
        ULONG Unknown4;
#endif
    PVOID  Base;
    ULONG  Size;
    ULONG  Flags;
    USHORT  Index;
    USHORT  NameLength;
    USHORT  LoadCount;
    USHORT  PathLength;
    CHAR  ImageName[256];
} SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;

typedef struct _SYSTEM_MODULE_INFORMATION
{
    ULONG Count;
    SYSTEM_MODULE_INFORMATION_ENTRY Module[1];
}  SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;

 ULONG i=0;
 ULONG j=0;
 ULONG m=0;
 PULONG p;
 NTSTATUS ntStatus;
 PSYSTEM_MODULE_INFORMATION pp;
 
 p=ExAllocatePool(NonPagedPool,PAGE_SIZE);
 if(!p)
 {
  return 0;
 }
 ntStatus = ZwQuerySystemInformation(11,p,sizeof(p),NULL);  //11是SystemModuleInformation  
    if ( !NT_SUCCESS( ntStatus ) )
    {
        KdPrint(( "ZwQuerySystemInformation Error!/n" ));
        ExFreePool(p);
        return 0;
    }
    pp=(PSYSTEM_MODULE_INFORMATION)p;
    m=pp->Count;
    for(i=0;i<m;i++)
    {
     KdPrint(( "111SystemMode,Base: %x/n", pp->Module[i].Base ));
        KdPrint(( "111SystemMode, ImageName,: %s/n",pp->Module[i].ImageName ));
        KdPrint(( "111SystemMode, Size: %d/n",pp->Module[i].Size ));

        //关键码比较
    }
 ExFreePool(p);
 return 0;
}     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值