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 ...
随机推荐
- mariaDB 远程连接不上
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; // %:表示从任何主机连接 ...
- Appium appium 基础之键盘处理
方法1 AppiumDriver实现了在上述功能,代码如下(java版本) driver.sendKeyEvent(66);方法2 HashMap keycode = new HashMap();ke ...
- spark 2.X 疑难问题汇总
当前spark任务都是运行在yarn上,所以不用启动长进程worker,也没有master的HA问题,所以主要的问题在任务执行层面. 作业故障分类故障主要分为版本,内存和权限三方面. - 各种版本不一 ...
- struts1学习
转载:https://blog.csdn.net/toyouheart/article/details/4509466
- centos7安装与卸载软件
安装 yum install 服务名 查看服务名 rpm -qa |grep -i aerospike 或者 yum list installed | grep aerospike 卸载 yum re ...
- VC6.0开发中一些链接错误的解决方法
(1)error LNK2001: unresolved external symbol _main 编号:LNK2001 直译:未解决的外部符号:_main. 错误分析:缺少main函数.看看mai ...
- java 静态变量生命周期(类生命周期)(转)
Static: 加载:java虚拟机在加载类的过程中为静态变量分配内存. 类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享 销毁:类被卸载时,静态变量被销毁,并释放 ...
- 性能测试工具LoadRunner12-LR之Virtual User Generator 脚本编写验证步骤以及LR常见错误处理方法
验证脚本比较好的流程: Generate:录制或开发脚本 SUSI(Single User Single Iteration,单用户单循环):运行录制生成的脚本,解决可能存在的关键问题 SUMI(Si ...
- aspx页面导出为word
aspx页面导出为word代码: System.IO.StringWriter sw = new System.IO.StringWriter(); System.Web.UI.HtmlTextWri ...
- eclipse中使用自带的git提交项目
1.自带git插件进行配置我们的用户名和密码,即是自己github注册用户.windows--perferences--Team--Git--Configuration 2.eclipse生成SSH2 ...