首页
社区
课程
招聘
[求助]初学Rootkit,有几个基础问题想搞明白
发表于: 2008-7-17 15:32 6656

[求助]初学Rootkit,有几个基础问题想搞明白

2008-7-17 15:32
6656
买了本《ROOTKITS -Windows内核的安全防护》

看了前面几章,想亲手写几个HOOK API做下实验,里面有个例子是HideProcessHookMdl

有部分代码如下:

#pragma pack(1)
typedef struct ServiceDescriptorEntry {
        unsigned int *ServiceTableBase;
        unsigned int *ServiceCounterTableBase; //Used only in checked build
        unsigned int NumberOfServices;
        unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()

__declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
#define SYSTEMSERVICE(_function)  KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]

......
......
......

NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject,
         IN PUNICODE_STRING theRegistryPath)
{
  // Register a dispatch function for Unload
  theDriverObject->DriverUnload  = OnUnload;

  // Initialize global times to zero
  // These variables will account for the
  // missing time our hidden processes are
  // using.
  m_UserTime.QuadPart = m_KernelTime.QuadPart = 0;

  // save old system call locations
  OldZwQuerySystemInformation =(ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation));

  // Map the memory into our domain so we can change the permissions on the MDL
  g_pmdlSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices*4);
  if(!g_pmdlSystemCall)
      return STATUS_UNSUCCESSFUL;

  MmBuildMdlForNonPagedPool(g_pmdlSystemCall);

  // Change the flags of the MDL
  g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;

  MappedSystemCallTable = MmMapLockedPages(g_pmdlSystemCall, KernelMode);

  // hook system calls
  HOOK_SYSCALL( ZwQuerySystemInformation, NewZwQuerySystemInformation, OldZwQuerySystemInformation );
                              
  return STATUS_SUCCESS;
}

有几个疑问:
1. __declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable; 为什么要以DLL导出变量形式,而我在PE段里面没有看到导出的变量
2. 当定义了KeServiceDescriptorTable 之后,它的初始化在哪里完成的?
  是不是下面几句初始化的?

    g_pmdlSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices*4);
  if(!g_pmdlSystemCall)
      return STATUS_UNSUCCESSFUL;

  MmBuildMdlForNonPagedPool(g_pmdlSystemCall);

3. MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices*4); 这个函数的主要作用是什么?

小弟初学,想学精点,还望大哥们赐教

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 709
活跃值: (2590)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
1. msdn
2. SDT是内核导出的全局变量,申明后即可使用
3. DDK.

2008-7-17 16:38
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
真是太感谢你了,我大概了解了:
1,是从DLL导入全局变量,全局变量就是KeServiceDescriptorTable
3,这个函数的功能我也知道了,就是创建一MDL

  但是我刚调试了一下,MappedSystemCallTable 这个变量是指向新的内存,但是内存的内容和大小和SSDT是一样的,这个意思好像是新分配了块内存就可以修改了
  但是我想老的SSDT还不是没有动,这相当于把SSDT的内容复制过来了,但是系统服务调用时会访问这块新的内存吗,还是我没太理解MDL的含义??
  再请指教
2008-7-17 17:08
0
雪    币: 709
活跃值: (2590)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
4
MDL的作用就是申请一块新内存,在这块内存里的操作,最终会安全稳定的影响原来映射的数据,这样就到达修改数据的目的了.

系统访问的还是系统原来的数据,我们映射MDL只是为了安全稳定的修改原来的数据.
2008-7-17 17:48
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
顶sudami
牛人
2008-7-17 21:33
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
多谢sudami,真是有种豁然开朗,走进Rootkit之门的感觉
2008-7-18 09:38
0
雪    币: 709
活跃值: (2590)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
7
你有书,真好。
我连书都没有啊...
2008-7-18 10:17
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
8
这本书好像很烂,还不如直接看ddk
2008-7-18 10:53
0
游客
登录 | 注册 方可回帖
返回