找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 8747|回复: 7

弱弱的问下 WIN64 SSDT

[复制链接]

9

主题

32

回帖

0

精华

铜牌会员

积分
162
发表于 2013-1-5 11:23:09 | 显示全部楼层 |阅读模式
在论坛里开放的WIN64 枚举SSDT 中
  1. VOID GetNtosBase()
  2. {
  3.         char FileName[260]={0},*FullName;
  4.         NtosBase=GetNtosBaseAndPath(FileName);
  5.         FullName=cs("C:\\Windows\\system32\",FileName);
  6.         strcpy(NtosName,FullName);
  7.         printf("NTOSKRNL base: %llx\n",NtosBase);
  8.         printf("NTOSKRNL name: %s\n",NtosName);
  9. }
复制代码
这里提到的 GetNtosBaseAndPath 函数是肿么实现的?

857

主题

2632

回帖

2

精华

管理员

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

积分
36130
发表于 2013-1-5 14:48:44 | 显示全部楼层
用ZwQuerySystemInformation枚举内核模块。

9

主题

32

回帖

0

精华

铜牌会员

积分
162
 楼主| 发表于 2013-1-5 14:51:46 | 显示全部楼层
Tesla.Angela 发表于 2013-1-5 14:48
用ZwQuerySystemInformation枚举内核模块。

继续问,ZwQuerySystemInformation 结果是 ntkrnlmp.exe 这个怎么得来的?

857

主题

2632

回帖

2

精华

管理员

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

积分
36130
发表于 2013-1-5 15:14:10 | 显示全部楼层
xiaoc1026 发表于 2013-1-5 14:51
继续问,ZwQuerySystemInformation 结果是 ntkrnlmp.exe 这个怎么得来的?

随便贴一份驱动里枚举内核模块的代码给你,会不会用就看你自己了:
  1. #define kprintf                DbgPrint
  2. #define kmalloc(_s)        ExAllocatePoolWithTag(NonPagedPool, _s, 'SYSQ')
  3. #define kfree(_p)        ExFreePool(_p)

  4. NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation
  5. (
  6.         IN ULONG        SystemInformationClass,
  7.         OUT PVOID        SystemInformation,
  8.         IN ULONG        Length,
  9.         OUT PULONG        ReturnLength
  10. );

  11. void GetKernelModuleBase(char* lpModuleName, ULONG64 *ByRefBase, ULONG *ByRefSize)
  12. {
  13.         typedef struct _SYSTEM_MODULE_INFORMATION_ENTRY
  14.         {
  15.                 ULONG Unknow1;
  16.                 ULONG Unknow2;
  17.                 ULONG Unknow3;
  18.                 ULONG Unknow4;
  19.                 PVOID Base;
  20.                 ULONG Size;
  21.                 ULONG Flags;
  22.                 USHORT Index;
  23.                 USHORT NameLength;
  24.                 USHORT LoadCount;
  25.                 USHORT ModuleNameOffset;
  26.                 char ImageName[256];
  27.         } SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;
  28.         typedef struct _SYSTEM_MODULE_INFORMATION
  29.         {
  30.                 ULONG Count;//内核中以加载的模块的个数
  31.                 SYSTEM_MODULE_INFORMATION_ENTRY Module[1];
  32.         } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
  33.         typedef struct _KLDR_DATA_TABLE_ENTRY
  34.         {
  35.                 LIST_ENTRY64 InLoadOrderLinks;
  36.                 ULONG64 __Undefined1;
  37.                 ULONG64 __Undefined2;
  38.                 ULONG64 __Undefined3;
  39.                 ULONG64 NonPagedDebugInfo;
  40.                 ULONG64 DllBase;
  41.                 ULONG64 EntryPoint;
  42.                 ULONG SizeOfImage;
  43.                 UNICODE_STRING FullDllName;
  44.                 UNICODE_STRING BaseDllName;
  45.                 ULONG   Flags;
  46.                 USHORT  LoadCount;
  47.                 USHORT  __Undefined5;
  48.                 ULONG64 __Undefined6;
  49.                 ULONG   CheckSum;
  50.                 ULONG   __padding1;
  51.                 ULONG   TimeDateStamp;
  52.                 ULONG   __padding2;
  53.         }KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;
  54.     ULONG NeedSize, i, ModuleCount, BufferSize = 0x5000;
  55.     PVOID pBuffer = NULL;
  56.         PCHAR pDrvName = NULL;
  57.     NTSTATUS Result;
  58.     PSYSTEM_MODULE_INFORMATION pSystemModuleInformation;
  59.     do
  60.     {
  61.         //分配内存
  62.         pBuffer = kmalloc( BufferSize );
  63.         if( pBuffer == NULL )
  64.             return;
  65.         //查询模块信息
  66.         Result = ZwQuerySystemInformation( 11, pBuffer, BufferSize, &NeedSize );
  67.         if( Result == STATUS_INFO_LENGTH_MISMATCH )
  68.         {
  69.             kfree( pBuffer );
  70.             BufferSize *= 2;
  71.         }
  72.         else if( !NT_SUCCESS(Result) )
  73.         {
  74.             //查询失败则退出
  75.             kfree( pBuffer );
  76.             return;
  77.         }
  78.     }
  79.     while( Result == STATUS_INFO_LENGTH_MISMATCH );
  80.     pSystemModuleInformation = (PSYSTEM_MODULE_INFORMATION)pBuffer;
  81.         //获得模块的总数量
  82.     ModuleCount = pSystemModuleInformation->Count;
  83.         //遍历所有的模块
  84.     for( i = 0; i < ModuleCount; i++ )
  85.         {
  86.                 if((ULONG64)(pSystemModuleInformation->Module[i].Base) > (ULONG64)0x8000000000000000)
  87.                 {
  88.                         pDrvName = pSystemModuleInformation->Module[i].ImageName+pSystemModuleInformation->Module[i].ModuleNameOffset;
  89.                         if( _stricmp(pDrvName,lpModuleName)==0 )
  90.                         {
  91.                                 *ByRefBase = (ULONG64)pSystemModuleInformation->Module[i].Base;
  92.                                 *ByRefSize = pSystemModuleInformation->Module[i].Size;
  93.                                 goto exit_sub;
  94.                         }
  95.                 }
  96.         }
  97. exit_sub:
  98.         kfree(pBuffer);
  99. }
复制代码

9

主题

32

回帖

0

精华

铜牌会员

积分
162
 楼主| 发表于 2013-1-7 13:29:22 | 显示全部楼层
Tesla.Angela 发表于 2013-1-5 15:14
随便贴一份驱动里枚举内核模块的代码给你,会不会用就看你自己了:

感谢老大分享

0

主题

25

回帖

0

精华

铜牌会员

积分
61
发表于 2013-2-1 19:00:16 | 显示全部楼层
Tesla.Angela 发表于 2013-1-5 15:14
随便贴一份驱动里枚举内核模块的代码给你,会不会用就看你自己了:

很有用的介紹

7

主题

414

回帖

1

精华

铂金会员

积分
2173
发表于 2013-4-7 17:44:01 | 显示全部楼层
Tesla.Angela 发表于 2013-1-5 15:14
随便贴一份驱动里枚举内核模块的代码给你,会不会用就看你自己了:

真的很實用

1

主题

35

回帖

0

精华

铜牌会员

积分
129
发表于 2015-4-24 08:42:12 | 显示全部楼层
会蓝屏吗。这样做
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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