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》,黑客防线驱动教程。

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

最新文章

  1. gen目录无法更新,或者gen目录下的R.JAVA文件无法生成
  2. NOIP2016题目整合
  3. LeetCode Database: Rank Scores
  4. 【boost】使用装饰者模式改造boost::thread_group
  5. Javascript常用正则表达式
  6. WAMP下定义wordpress固定连接出现文章页面404
  7. BAPI总的数据库提交和回滚
  8. java 异常处理机制及说明。
  9. 第二次作业之微信小程序
  10. C++_day7_继承
  11. ie的用户名密码输入框右侧提示去掉
  12. Android应用系列:值得收藏的ViewHolder工具类实现
  13. 【F12】chrome浏览器中 F12 功能的简单介绍
  14. sparse 稀疏函数的用法
  15. [luogu1967][货车运输]
  16. 《linux 文本处理》- sed/awk
  17. 从0开始搭建vue+webpack脚手架(四)
  18. robotframework·RIDE基础
  19. Python学习笔记第四周
  20. mongodb基础学习2-基本CRUD

热门文章

  1. vs2010安装svn插件
  2. Inno setup complier将文件添加注册表
  3. (二)Activity启动模式
  4. C#获取Excel Sheet名称,对特殊字符、重名进行了处理
  5. smarty的简单介绍
  6. 使用PDO执行SQL语句exec()、query()
  7. 各种语言中的urlencode方法
  8. DenyHosts安装及配置
  9. Windows 10开发基础——文件、文件夹和库(一)
  10. Android 禁止软键盘自动弹出