SSDT表详解

SSDT(system service dispatch table) 系统服务分派表

SSPT(system service parameter table) 系统服务参数表

#pragma pack(1)     //SSDT表的结构

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()

函数调用过程分析:

(1)用户调用kenel32.dll中的ReadFile,kenel32.dll中都是包装函数,kenel32.dll会用这些包装函数完成参数的有效性检查,将所有东西转换为unicode,接着锁定NTDLL.dll中的NtReadFile函数。

(2)NTDLL.dll中的都是服务的包装函数,当调用其中的NtReadFile时,这些服务包装函数将所需的Servcie ID送入EAX寄存器,将参数堆栈帧的指针送入EDX寄存器,然后发出INT 2e中断。这条指令会将处理器切换到内核模式。INT 2e对应的处理程序是由windows NT 的 executive(估计是内核)建立的,它将参数从用户模式的堆栈拷贝到内核模式的堆栈。堆栈帧的基址为EDX寄存器的值。而这个中断程序被称为KiSystemService()

(3)接着进入内核态,NTOSKRNL.exe开始工作,由它进行系统服务的最终调用,它的系统服务的用户接口是以包装函数(wrapper functions)的形式提供的。这些函数都在一个叫做NTDLL.DLL的dll里。NTOSKNL.EXE先初始化,初始化的过程中,先为NTOSKRNL提供的不同服务创建一个函数表即SSDT,表中的每一项都指定了Service ID所需函数的地址,每个函数代码都位于内核之中。类似的,SSPT也开始创建。

图解如下:

下面是两个表的结构:

SSDT HOOK讲解:SSDT HOOK就是通过修改SSDT表的函数地址来实现的,以下是三个相关操作的宏,直接使用

//取函数在SSDT中的位置,下面的为固定计算方法
#define SYSTEMSERVICE(_function)  KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]

//取函数的索引,固定模式
#define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)

//修改函数的地址
#define HOOK_SYSCALL(_Function, _Hook, _Orig ) _Orig = (PVOID) InterlockedExchange( (PLONG) &m_Mapped[SYSCALL_INDEX(_Function)], (LONG) _Hook)

其他操作就是驱动编写了,原理就是通过修改SSDT表,用自己的函数代替原有函数以实现进程保护或其他目的

参考:《Undocumented Windows NT》,《黑客防线杂志2010.9》,黑客防线驱动教程。

大家如果要详细了解,就看上面的东东吧,基本都可以在网上搜到

时间: 2024-10-11 08:12:37

SSDT表详解的相关文章

[转]PostgreSQL教程:系统表详解

这篇文章主要介绍了PostgreSQL教程(十五):系统表详解,本文讲解了pg_class.pg_attribute.pg_attrdef.pg_authid.pg_auth_members.pg_constraint.pg_tablespace.pg_namespace.pg_database等表的作用和字段介绍,需要的朋友可以参考下 一.pg_class: 该系统表记录了数据表.索引(仍然需要参阅pg_index).序列.视图.复合类型和一些特殊关系类型的元数据.注意:不是所有字段对所有对象

oracle中的dual表详解

oracle中的dual表详解 1.DUAL表的用途 Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中 --查看当前连接用户 SQL> select user from dual; USER ------------------------------ SYSTEM --查看当前日期.时间 SQL> select sysdate from dual; SYSDATE ----------- 2007-1-24 1 SQL> sele

Oracle外部表详解(转载)

(外部表创建主要注意创建目录访问权限问题.目录路径格式无空格等不相关字符,即必须是当前表访问用户可以访问:关于表中行数的限制问题,如果不加限制注意添加reject limit unlimited:表中数据格式与创建表时access parameters中的定义需保持同步,适当用skip=1) 外部表概述 外部表只能在Oracle 9i之后来使用.简单地说,外部表,是指不存在于数据库中的表.通过向Oracle提供描述外部表的元数据,我们可以把一个操作系统文件当成一个只读的数据库表,就像这些数据存储

ecmall数据库表详解 二次开发必备

文章分类表ecm_acategory 字段 类型 Null 默认 注释 cate_id int(10) 否   自增ID号,分类ID号 cate_name varchar(100) 否   分类的名称 parent_id int(10) 否   分类的父级ID sort_order Tinyint(3) 否   分类排序数字标识 code varchar(10) 否   分类的代码标识 用户地址表(ecm_address) 字段 类型 Null 默认 注释 addr_id int(10) 否  

ABAP 内表 详解

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4293475.html 老式的内表类型定义... 214 基于基本类型内表类型... 214 基于结构体类型内表类型... 215 老式的内表对象创建... 215 参照现有内表类型或内表对象来创建... 215 参照现有结构类型或结构对象来

wordpress数据库表详解

表名:wp_categories 用于保存分类相关信息的表.包括了5个字段,分别是: 字段 注释 cat_ID 每个分类唯一的ID号,为一个bigint(20)值,且带有附加属性auto_increment. cat_name 某个分类的名称,为一个varchar(55)值. category_nicename 指定给分类的一个便于记住的名字,也就是所谓的slug,这是一个varchar(200)值 category_description 某个分类的详细说明,longtext型值. categ

MySQL user表详解

Host: 10-4-13-72 User: Password: Select_priv: N Insert_priv: N Update_priv: N Delete_priv: N Create_priv: N Drop_priv: N Reload_priv: N 重新加载权限表 Shutdown_priv: N Process_priv: N 服务器管理 File_priv: N 加载服务器上的文件 Grant_priv: N References_priv: N Index_priv:

哈希表详解

最近在做负荷分担的优化,将数据流均匀分到八条流中,学习点哈希算法 什么是哈希表?     哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表.说白了哈希表的原理其实就是通过空间换取时间的做法..     哈希表的做法其实很简单,就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长

万象数据库表详解

万象数据库表wx2004数据库的用户表有tActCard.tAdd.tBackFileNames.tBackPlan.tBook.tDebt.tDiffer.tEvents.tExchange.tExport.tFilling.tFreeze.tGoodsTmp.tTtems.tLogin.tLogs.tempStatistic tOtherFee.tPort.TRet.tSales.tShift.tStat.tStock.tSyncStock.tTmpAdd.tTmpCard.tUsers总共