首页
社区
课程
招聘
[求助]求助这段代码
发表于: 2013-8-17 08:12 3287

[求助]求助这段代码

2013-8-17 08:12
3287
   1:  //=====================================================================================//
   2:  //Name: KSYSTEM_SERVICE_TABLE 和 KSERVICE_TABLE_DESCRIPTOR                             //
   4:  //Descripion: 用来定义 SSDT 结构                                                       //
   6:  //=====================================================================================//
   7:  typedef struct _KSYSTEM_SERVICE_TABLE
   8:  {
   9:      PULONG  ServiceTableBase;        // SSDT (System Service Dispatch Table)的基地址
  10:      PULONG  ServiceCounterTableBase; // 包含 SSDT 中每个服务被调用的次数
  11:      ULONG   NumberOfService;    [COLOR="Red"] // 服务函数的个数, NumberOfService * 4 就是整个地址表的大小[/COLOR]
  12:      ULONG   ParamTableBase;          // SSPT(System Service Parameter Table)的基地址
  13:   
  14:  } KSYSTEM_SERVICE_TABLE, *PKSYSTEM_SERVICE_TABLE;
  15:   
  16:   
  17:  typedef struct _KSERVICE_TABLE_DESCRIPTOR
  18:  {
  19:      KSYSTEM_SERVICE_TABLE   ntoskrnl; // ntoskrnl.exe 的服务函数
  20:      KSYSTEM_SERVICE_TABLE   win32k;   // win32k.sys 的服务函数(GDI32.dll/User32.dll 的内核支持)
  21:      KSYSTEM_SERVICE_TABLE   notUsed1;
  22:      KSYSTEM_SERVICE_TABLE   notUsed2;
  23:   
  24:  } KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;
  25:   
  26:   
  27:  //导出由 ntoskrnl.exe 所导出的 SSDT
  28:  extern PKSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable;


红色的部分   是我不明白的地方 , 为什么服务函数的个数 乘以 4 就是整个地址表的大小呢?   这个4怎么来的 啊?

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 778
活跃值: (208)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
2
地址表里面的每个服务函数的地址是ULONG型的,ULONG就是4个字节。
2013-8-17 09:22
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
3
楼上正解 ,了解这个结构最好配合内核调试工具 ,比如 windbg

dd  nt!  KeServiceDescriptorTable    命令就可以看到SSDT表结构

它是一个地址表,以整数存储函数地址:

函数1地址,函数2地址,函数3地址,函数4地址 ....

整数类型大小为4字节,所以 个数x 4  就是SSDT表大小

参考文章:

【原创】Win32Asm 驱动学习笔记<3>调试基础

shadow ssdt学习笔记(一)(二)
2013-8-17 12:36
0
游客
登录 | 注册 方可回帖
返回
//