以win7 x86为例(x64就不是我等菜鸟玩的了)

预备资料:

  本地系统服务的地址在内核结构中称为系统服务调度表(System Service Dispatch Table, SSDT)中列出。该表可以基于系统调用编号进行索引,以便定位函数的内存地址。还有一个系统服务参数表(System Service Parameter Table,SSPT)指定了每个系统服务的函数参数的字节数(每个函数对应一个字节)。

  KeServiceDescriptorTable是由内核导出的表。给出如下结构

1 typedef struct _SystemServiceDescriptorTable
2 {
3     PVOID    ServiceTableBase;
4     PULONG   ServiceCounterTableBase;
5     ULONG    NumberOfService;
6     ULONG    ParamTableBase;
7 }SystemServiceTable,*PSystemServiceTable;
     typedef struct _SERVICE_DESCRIPTOR_TABLE{SYSTEM_SERVICE_TABLE   ntoskrnel; //ntoskrnl.exe的服务函数SYSTEM_SERVICE_TABLE   win32k;     //win32k.sys的服务函数,(gdi.dll/user.dll的内核支持)
       SYSTEM_SERVICE_TABLE   NotUsed1;SYSTEM_SERVICE_TABLE   NotUsed2;}SYSTEM_DESCRIPTOR_TABLE,*PSYSTEM_DESCRIPTOR_TABLE;

   参数说明:

     ServiceTableBase :SSDT的基地址。

  ServiceCounterTable 此域用于操作系统的 checked builds,包含着 SSDT 中每个服务被调用次数的计数器。这个计数器由 INT 2Eh 处理程序 (KiSystemService)更新。 
     NumberOfServices 由 ServiceTableBase 描述的服务的数目。
     ParamTableBase 包含每个系统服务参数字节数表的基地址。

  

  引用pediy的大牛堕落天才的话来说:

 

  内核中有两个系统服务描述符表,一个是KeServiceDescriptorTable(由ntoskrnl.exe导出),一个是KeServieDescriptorTableShadow(没有导出)。两者的区别是,KeServiceDescriptorTable仅有ntoskrnel一项,KeServieDescriptorTableShadow包含了ntoskrnel以及win32k。一般的Native API的服务地址由KeServiceDescriptorTable分派,gdi.dll/user.dll的内核API调用服务地址由KeServieDescriptorTableShadow分派。还有要清楚一点的是win32k.sys只有在GUI线程中才加载,一般情况下是不加载的,所以要Hook KeServieDescriptorTableShadow的话,一般是用一个GUI程序通过IoControlCode来触发。

  需要注意的是,一般情况下R0的驱动内存中是没有win32k.sys的,只有在GUI线程加载的时候才会存在,准确的说只有在PsConvertToGuiThread调用的时候把KeServiceDescri

32位的SSDT表结构浅析相关推荐

  1. 如何把32位的注册表文件转换为64位的?

    问题:比如 我的系统是64位的WIN7,但下载的极品飞车14的注册表导入文件却是32位的,于是不能用,还好网上有人做了64位的导入文件.我想知道那些达人是怎么把32位的改成64位的? 把32位的注册表 ...

  2. ssdt 表结构及hook的一般理解

    1       Ssdt表的基本结构 KeServiceDescriptorTable 首地址:8055D700 0: kd> dd KeServiceDescriptorTable 8055d ...

  3. C# .net 3.5 32位app操作64位操作系统的注册表

    做项目的过程中需要读取和修改注册表,操作过程中发现读取的注册的注册表和实际的值不一致. 查阅网上信息了解到,64位操作系统为32位app独立设置了一个目录存放它的注册表项目 计算机\HKEY_LOCA ...

  4. 64位Windows系统注册表的 32 位注册表项和64 位注册表项

    64 位版本 Windows 中的注册表分为 32 位注册表项和 64 位注册表项.许多 32 位注册表项与其相应的 64 位注册表项同名,反之亦然. 64 位版本 Windows 包含的默认 64 ...

  5. 32位应用程序操作64位Windows注册表的方法

    64位的Windows操作系统中能够运行32位的应用程序,主要是由于Windows中提供了WOW64子系统. 1.WOW64子系统 WOW64 (Windows-on-Windows 64-bit)是 ...

  6. VC 32位(或64位)win7操作系统的注册表操作

    *.bat文件: @echo  "Win7系统下->右键->以管理员权限运行" rem 切换到当前bat文件所在目录 cd /d %~dp0  pause rem 杀死 ...

  7. 转载】将32位代码向64位平台移植的注意事项

    转载]将32位代码向64位平台移植的注意事项 新近的64位平台在二进制上与32位应用程序兼容,这意味着可以非常简单地移植现有的程序.许多目前在32位平台上运行良好的程序也许不必移植,除非程序有以下要求 ...

  8. (转)移植32位程序64位系统

    64个系统已经为32位的应用程序准备了运行32位程序的环境,这个环境就是WOW64的. WOW64 是Windows -32-on-Windows-64 的缩写.它为现有的 32 位应用程序提供了 3 ...

  9. VB如何在Win10X64位系统上进行读写64位的注册表

    win10X64位系统注册表分两个部分:64位和32位,当我们用VB6生成的exe可执行的程序后,进行操作注册表时发现某些项无法写入和读取,这是因为VB6生成的程序是32位的,可见用32位的程序去读写 ...

最新文章

  1. 只有ajax会跨域吗_ajax处理跨域有几种方式
  2. ArcEngine 添加字段
  3. Python Tricks(八)—— 斐波那契数列的另类实现
  4. 从零开始搭二维激光SLAM --- 基于gtsam的后端优化的代码实现
  5. php字符串长度获取_php哪个函数能取得字符串长度
  6. GD32F103与STM32F103的区别 2021.6.2
  7. 石头机器人拖地水量调节_拖地组件再评测:正式版 家有 石头科技T4 米家一代 水箱拖地组件...
  8. face_recognition库的使用
  9. 软件测试人员必备的7种思维方式
  10. R语言:判断身份证号码真伪的函数编写
  11. greenDao的使用教程
  12. 三维地图下载,3D地图下载,谷歌地球三维地形图查看
  13. oracle错误1327,问题简述:在oracle linux下安装oracle10g,多个文件报“Permission denied”错误...
  14. html5条件筛选jquery,jQuery实现多条件筛选
  15. 阿里云公共DNS安全传输服务介绍(DoH/DoT)
  16. 什么是硬件加密与软件加密,有什么区别?
  17. 解决飞鸽传书看不到自己想要找的好友
  18. rmxp4droid for 天敏电视盒子
  19. Python入门练习选择题
  20. Xcode真机调试(无需证书)详解

热门文章

  1. 指针和引用的不同之处?何时用用指针?何时用引用?
  2. 本地主机有网络虚拟机没有网络怎么办图文详解
  3. 第二届“强网”拟态防御国际精英挑战赛:背后的男人们!
  4. 【Ansible】Playbook剧本
  5. 从白百合看明星都出轨,该如何维护守护自己的爱情
  6. 1123: 4102 气球升起来
  7. BI家族又添新军 用户该如何选择??
  8. mongodb中cron定时任务
  9. Python面向对象(全套)
  10. [hiho 04]Trie图