ring0 SSDTHook
SSDT 的全称是 System Services Descriptor Table,系统服务描述符表。
这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来。
SSDT 并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。
通过修改此表的函数地址可以对常用 Windows 函数及 API 进行 Hook,从而实现对一些关心的系统动作进行过滤、监控的目的。
一些 HIPS、防毒软件、系统监控、注册表监控软件往往会采用此接口来实现自己的监控模块。
在 NT 4.0 以上的 Windows 操作系统中,默认就存在两个系统服务描述表,这两个调度表对应了两类不同的系统服务,
这两个调度表为:KeServiceDescriptorTable 和 KeServiceDescriptorTableShadow,
其中 KeServiceDescriptorTable 主要是处理来自 Ring3 层得 Kernel32.dll 中的系统调用,
而 KeServiceDescriptorTableShadow 则主要处理来自 User32.dll 和 GDI32.dll 中的系统调用,
并且 KeServiceDescriptorTable 在 ntoskrnl.exe(Windows 操作系统内核文件,包括内核和执行体层)是导出的,
而 KeServiceDescriptorTableShadow 则是没有被 Windows 操作系统所导出,
而关于 SSDT 的全部内容则都是通过 KeServiceDescriptorTable 来完成的
win32下KeSystemDescriptorTable的地址已经由ntoskrnl.exe导出, extern PKSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable 即可获取SSDT的地址。
在win64下,KeSystemDescriptorTable的地址没有被导出,不能通过win32下的方法获取地址。
Win64下,我们可以通过msr寄存器获取 KiSystemCall64函数的地址,在这个函数开始地址向下搜索0x500字节左右,在通过特征码4c8d15,就能获取KeServiceDescriptorTable的地址。
Windbg下
kd>uf iSystemCall64
nt!KiSystemCall64:
fffff800`03e85640 0f01f8 swapgs
fffff800`03e85643 654889242510000000 mov qword ptr gs:[10h],rsp
fffff800`03e8564c 65488b2425a8010000 mov rsp,qword ptr gs:[1A8h]
fffff800`03e85655 6a2b push 2Bh
fffff800`03e85657 65ff342510000000 push qword ptr gs:[10h]
fffff800`03e8565f 4153 push r11
fffff800`03e85661 6a33 push 33h
。。。。。。。
fffff800`03e8575e 4889a3d8010000 mov qword ptr [rbx+1D8h],rsp
fffff800`03e85765 8bf8 mov edi,eax
fffff800`03e85767 c1ef07 shr edi,7
fffff800`03e8576a 83e720 and edi,20h
fffff800`03e8576d 25ff0f0000 and eax,0FFFh
nt!KiSystemServiceRepeat:
fffff800`03e85772 4c8d15c7202300 lea r10,[nt!KeServiceDescriptorTable (fffff800`040b7840)]
fffff800`03e85779 4c8d1d00212300 lea r11,[nt!KeServiceDescriptorTableShadow (fffff800`040b7880)]
fffff800`03e85780 f7830001000080000000 test dword ptr [rbx+100h],80h
fffff800`03e8578a 4d0f45d3 cmovne r10,r11
fffff800`03e8578e 423b441710 cmp eax,dword ptr [rdi+r10+10h]
fffff800`03e85793 0f83e9020000 jae nt!KiSystemServiceExit+0x1a7 (fffff800`03e85a82)
注意蓝色字节内容, KiSystemCall64的开始地址是fffff800`03e85640, 第二个蓝色标记处发现了KeServiceDescriptorTable,这条指令地址是fffff800`03e85772,对应的字节为4c8d15478c2300,Lea的对应字节为4c8d15,所以后边的字节478c2300为偏移地址,注意地址是反过来的,真正偏移地址是 00238c47,偏移地址是针对这条指令最后一个字节的地址的偏移,所以需要在加7字节,由此可得KeServiceDescriptorTable地址为:
fffff800`03e85772 + 00238c47 + 7 = fffff800`040b7840。
我们可以dd KeServiceDescriptorTable看一下地址
2: kd> dd KeServiceDescriptorTable
fffff800`040b7840 03e87300 fffff800 00000000 00000000
fffff800`040b7850 00000191 00000000 03e87f8c fffff800
fffff800`040b7860 00000000 00000000 00000000 00000000
fffff800`040b7870 00000000 00000000 00000000 00000000
fffff800`040b7880 03e87300 fffff800 00000000 00000000
fffff800`040b7890 00000191 00000000 03e87f8c fffff800
fffff800`040b78a0 00161f00 fffff960 00000000 00000000
fffff800`040b78b0 0000033b 00000000 00163c1c fffff960
可以看出上述计算是正确的。
ring0 SSDTHook的更多相关文章
- ring0 SSDTHook 实现x64/x86
#include "HookSSDT.h" #include <ntimage.h> #define SEC_IMAGE 0x001000000 ULONG32 __N ...
- ring0 关于SSDTHook使用的绕过页面写保护的原理与实现
原博:http://www.cnblogs.com/hongfei/archive/2013/06/18/3142162.html 为了安全起见,Windows XP及其以后的系统将一些重要的内存页设 ...
- ring0 恢复SSDTHook
原理: 用ZwQuerySystemInformation 功能号为11(SystemModuleInformation) 得到所有系统模块的地址 遍历搜索得到ntos模块的基地址 读Ntos模块到 ...
- SSDTHook实例--编写稳定的Hook过滤函数
解说怎样写Hook过滤函数,比方NewZwOpenProcess.打开进程. 非常多游戏保护都会对这个函数进行Hook. 因为我们没有游戏保护的代码,无法得知游戏公司是怎样编写这个过滤函数. 我看到非 ...
- Hook集合----SSDTHook(x86 Win7)
最近在学习Ring0层Hook的一些知识点,很久就写完SSDTHook的代码了,但是一直没有整理成笔记,最近有时间也就整理整理. 介绍: SSDTHook 实质是利用Ntoskrnl.exe 中全局导 ...
- 函数调用关于从Ring3转到Ring0 ESP堆栈变化
在ring0堆栈获取ring3堆栈方式 第一种方式 [esp+4] == [esp+参数个数*4+4] 如果这里不相等就需要用第二种方式 [[esp+参数个数*4+8]] 这里面的值就是Ring3的堆 ...
- ring0
Intel的x86处理器是通过Ring级别来进行访问控制的,级别共分4层,RING0,RING1,RING2,RING3.Windows只使用其中的两个级别RING0和RING3. RING0层拥有最 ...
- 对付ring0 inline hook
对付ring0 inline hook的基本思路是这样的,自己写一个替换的内核函数,以NtOpenProcess为例,就是MyNtOpenProcess.然后修改SSDT表,让系统服务进入自己的函数M ...
- ring0 与 ring3 层之间的交互
在进行Windows的ring0层开发时,必不可免的要与 ring3 层进行交互.进行数据间的相互传输.可用的方法有DeviceIoCntrol,ReadFile.我平常都是用的DeviceIoCon ...
随机推荐
- C语言抽象数据类型ADT
根据编程的问题匹配合适的数据类型.数据项连接构成了链表,定义了一个结构代表单独的项.设计了一些方法把一系列结构构成一个链表.本质上,我们使用C语言的功能设计了一种符合程序要求的新的数据类型.但是上述的 ...
- poj3728之离线LCA+dp思想/RMQ+LCA(非常好的题目)
题意很简单 给一个树(n < 5w) 每个点有个权值,代表商品价格 若干个询问(5w) 对每个询问,问的是从u点走到v点(简单路径),商人在这个路径中的某点买入商品,然后在某点再卖出商品, ...
- Codeforces Round #334(div.2) A
A. Uncowed Forces time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- javaEE 转发 和 重定向
转发 两种方法: 1,request.getRequestDispatcher(getServletContext().getContextPath() + "/path").fo ...
- Spring里的Ant Pattern
Spring里的Ant Pattern用于匹配URL 可以参考官网:https://docs.spring.io/spring/docs/current/javadoc-api/org/springf ...
- python3 杂记
python3 杂记 test001 --test001.py ( from test2.test002 import * def test1(): print('1') if __nam ...
- KS光盘制作 for rhel6.5 and rhel7.2
############################## RHEL6.5 KS光盘制作--1.复制光盘到本地mkdir -p /opt/rhel6mount /dev/cdrom /mediacp ...
- NETCORE openSUSE docker 安装
openSUSE docker 安装https://www.jianshu.com/p/c725a06447d5 zypper命令使用示例https://www.cnblogs.com/linuxpr ...
- java动态数组笔记
动态数组: 在java.lang.reflect包下提供了Array类,包括一系列static方法,通过这些方法可动态的创建数组.给元素赋值.取出元素值等等 //理解数组引用——下面定义的objs数组 ...
- Java学习笔记day03_引用数据类型
1.引用数据类型 步骤: 1. 导包 2. 创建引用类型变量 类型 变量名 = new 类型名(); 3. 使用数据类型的功能 变量名.功能名(); 如Scanner类: import jav ...