【SSDT】SSDT hook技术
SSDT:
SSDT全称: System Services Descriptor Table
即系统服务描述表
这个表将Ring3的Win32 API 和 Ring0 的内核 API联系起来。通过修改此表的函数地址可以对常用Windows函数及API进行Hook,从而实现对一些关心的系统动作进行过滤、监控等目的。
在NT4.0 以上的Windpws 操作系统中,默认存在两个系统服务描述表,两个调度表对应两类不同的系统服务。
分别为KeServiceDescriptorTable
和 KeServiceDescriptorTableShadow
其中KeServiceDescriptorTable
主要处理来自Ring3层Kernel32.dll中的系统调用。
而KeServiceDescriptorTableShadow
则主要处理来自User32.dll和GDI32.dll中的系统调用。
系统服务分发函数KiSystemService
场景:
例如进程保护(驱动)
端口隐藏
文件隐藏等
系统从Ring3 到 Ring0 的执行过程:
Hook前准备:
要Hook SSDT表,首选需要这个表是可写的,但是在XP之后的系统都是只读的,有三种方式修改内存保护机制。
- 更改注册表:
恢复页面保护:HKLM\SYSTEM\CurrentControlset\Control\Session Manger\Memory Management\EnforceWriteProtection=0
去掉页面保护:HKLM\SYSTEM\CurrentControlset\Control\Session Manger\Memory Management\DisablePagingExecutive=1
- 改变CR0寄存器的第1位
Windows对内存的分配,采用分页管理。其中有个CR0寄存器:
其中第1位叫做保护属性位,控制着页的读或写属性。如果为1,则可以读/写/执行;如果为0,则只能读/执行。
SSDT,IDT(中断描述符表)的页属性在默认情况下只读,可执行,但不能写。
//设置为不可写
void DisableWrite()
{__try{_asm{mov eax, cr0 or eax, 10000h mov cr0, eax sti }}__except(1){DbgPrint("DisableWrite执行失败!");}
}// 设置为可写
void EnableWrite()
{__try{_asm{climov eax,cr0and eax,not 10000h //and eax,0FFFEFFFFhmov cr0,eax}}__except(1){DbgPrint("EnableWrite执行失败!");}
}
- 通过Memory Descriptor List
如何获取SSDT中的函数地址
①获取指定服务的索引号:SYSCALL_INDEX
②获取指定服务的当前地址:SYSCALL_FUNCTION
SSDT hook 流程:
使用SSDT hook 实现进程保护:
#include <ntifs.h>//内核之SSDT-HOOK
//系统服务表
typedef struct _KSYSTEM_SERVICE_TABLE
{PULONG ServiceTableBase; //函数地址表的首地址PULONG ServiceCounterTableBase;//函数表中每个函数被调用的次数ULONG NumberOfService; //服务函数的个数ULONG ParamTableBase; //参数个数表首地址
}KSYSTEM_SERVICE_TABLE;//服务描述符
typedef struct _KSERVICE_TABLE_DESCRIPTOR
{KSYSTEM_SERVICE_TABLE ntoskrnl;//ntoskrnl.exe的服务函数,SSDTKSYSTEM_SERVICE_TABLE win32k; //win32k.sys的服务函数,ShadowSSDTKSYSTEM_SERVICE_TABLE notUsed1;//暂时没用1KSYSTEM_SERVICE_TABLE notUsed2;//暂时没用2
}KSERVICE_TABLE_DESCRIPTOR;//定义HOOK的函数的类型
typedef NTSTATUS (NTAPI*FuZwOpenProcess)(_Out_ PHANDLE ProcessHandle,_In_ ACCESS_MASK DesiredAccess,_In_ POBJECT_ATTRIBUTES ObjectAttributes,_In_opt_ PCLIENT_ID ClientId
);//自写的函数声明
NTSTATUS NTAPI MyZwOpenProcess(_Out_ PHANDLE ProcessHandle,_In_ ACCESS_MASK DesiredAccess,_In_ POBJECT_ATTRIBUTES ObjectAttributes,_In_opt_ PCLIENT_ID ClientId
);//记录系统的该函数
FuZwOpenProcess g_OldZwOpenProcess;
//服务描述符表指针
KSERVICE_TABLE_DESCRIPTOR* g_pServiceTable = NULL;
//要保护进程的ID
ULONG g_Pid = 9527;//安装钩子
void InstallHook();
//卸载钩子
void UninstallHook();
//关闭页写入保护
void ShutPageProtect();
//开启页写入保护
void OpenPageProtect();//卸载驱动
void OutLoad(DRIVER_OBJECT* obj);***驱动入口主函数***/
NTSTATUS DriverEntry(DRIVER_OBJECT* driver, UNICODE_STRING* path)
{path;KdPrint(("驱动启动成功!\n"));//DbgBreakPoint();//安装钩子InstallHook();driver->DriverUnload = OutLoad;return STATUS_SUCCESS;
}//卸载驱动
void OutLoad(DRIVER_OBJECT* obj)
{obj;//卸载钩子UninstallHook();
}//安装钩子
void InstallHook()
{//1.获取KTHREADPETHREAD pNowThread = PsGetCurrentThread();//2.获取ServiceTable表g_pServiceTable = (KSERVICE_TABLE_DESCRIPTOR*)(*(ULONG*)((ULONG)pNowThread + 0xbc));//3.保存旧的函数g_OldZwOpenProcess = (FuZwOpenProcess)g_pServiceTable->ntoskrnl.ServiceTableBase[0xbe];//4.关闭页只读保护ShutPageProtect();//5.写入自己的函数到SSDT表内g_pServiceTable->ntoskrnl.ServiceTableBase[0xbe]= (ULONG)MyZwOpenProcess;//6.开启页只读保护OpenPageProtect();
}//卸载钩子
void UninstallHook()
{//1.关闭页只读保护ShutPageProtect();//2.写入原来的函数到SSDT表内g_pServiceTable->ntoskrnl.ServiceTableBase[0xbe]= (ULONG)g_OldZwOpenProcess;//3.开启页只读保护OpenPageProtect();
}//关闭页只读保护
void _declspec(naked) ShutPageProtect()
{__asm{push eax;mov eax, cr0;and eax, ~0x10000;mov cr0, eax;pop eax;ret;}
}//开启页只读保护
void _declspec(naked) OpenPageProtect()
{__asm{push eax;mov eax, cr0;or eax, 0x10000;mov cr0, eax;pop eax;ret;}
}//自写的函数
NTSTATUS NTAPI MyZwOpenProcess(_Out_ PHANDLE ProcessHandle,_In_ ACCESS_MASK DesiredAccess,_In_ POBJECT_ATTRIBUTES ObjectAttributes,_In_opt_ PCLIENT_ID ClientId
)
{//当此进程为要保护的进程时if (ClientId->UniqueProcess == (HANDLE)g_Pid &&DesiredAccess == PROCESS_TERMINATE){//设为拒绝访问DesiredAccess = 0;}//调用原函数return g_OldZwOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);
}
参考文章
https://blog.csdn.net/flydragonhero/article/details/61193692
https://blog.csdn.net/php_fly/article/details/9180591
https://blog.csdn.net/php_fly/article/details/9202379
【SSDT】SSDT hook技术相关推荐
- 简单实现了下SSDT SHADOW HOOK
介绍: SSDT SHADOW HOOK可用于安全软件窗口保护.安全输入.截屏保护等.例如:挂钩NtUserFindWindowEx.NtUserGetForegroundWindow ...
- 黑客爱用的 HOOK 技术大揭秘
福利:网络安全重磅福利:入门&进阶全套282G学习资源包免费分享! 什么是 HOOK 技术? 病毒木马为何惨遭杀软拦截? 商业软件为何频遭免费破解? 系统漏洞为何能被补丁修复? 这一切的背后到 ...
- 黑客爱用的 HOOK 技术大揭秘!
黑客爱用的 HOOK 技术大揭秘! 什么是 HOOK 技术? 病毒木马为何惨遭杀软拦截? 商业软件为何频遭免费破解? 系统漏洞为何能被补丁修复? 这一切的背后到底是人性的扭曲,还是道德的沦丧,敬请收看 ...
- android hook技术教学视频,[科普向]hook技术简单介绍
首先 1. 这只是科普向,会介绍相关Hook技术及原理,但是不会给源码.源码请自行百度 2.请至少有一点Windows编程经验,知道系统API是什么...以免看科普内容给您带来不适 3.这里结合了一 ...
- x64内核HOOK技术之拦截
转:https://www.cnblogs.com/iBinary/p/8399312.html 截进程.拦截线程.拦截模块 一丶为什么讲解HOOK技术. 在32系统下, 例如我们要HOOK SSDT ...
- 黑客爱用的HOOK技术大揭秘!
什么是HOOK技术? 病毒木马为何惨遭杀软拦截? 商业软件为何频遭免费破解? 系统漏洞为何能被补丁修复? 这一切的背后到底是人性的扭曲,还是道德的沦丧,尽请收看今天的专题文章:<什么是HOOK技 ...
- 相关Hook技术及原理
首先要说下CPU权限...Intel把自家CPU指令分为四个等级,Ring0,Ring1,Ring2,Ring3,Windows操作系统只用了Ring0和Ring3两个权限.简称R0和R3好了 R0权 ...
- android socket_盘点Android常用Hook技术
Android平台开发测试过程中,Hook技术是每个开发人员都常用的技术.可以用于绕过系统限制.修改别人发布的代码.动态化.调用隐藏API.插件化.组件化.自动化测试.沙箱等等. Hook如果要跨进程 ...
- Hook技术之4 在自己的进程中注入一个Dll到别人的进程
与其说是一种技术,不如说是一种技术思想.它使用了前面讲的那些Hook手段,来达到自己的目的. 其应用环境是这样的,自己有一个进程在运行,这个进程是自己可以控制的,但由于业务的需要,自己又要执行另一个应 ...
- 【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
最新文章
- c语言实现定长顺序存储,c语言:定长顺序串的基本操作实实现
- 软件工程作业2.1:阐述对软件工程的理解,学完这门课自己能学到什么,学完后能做什么...
- 华硕飞行堡垒开启虚拟化
- PHP 标准AES加密算法类
- tzselect 设置时间
- albert使用的中文语料
- oracle有条件插入数据,Oracle有条件地插入数据
- 马库斯再谈AlphaGo Zero不是从零开始,AGI可能需要这十大先天机制
- 计算机一级幻灯片样式,PPT怎么设置单个幻灯片为背景样式4?网友:原来这么简单!...
- 如何用pe安装服务器系统安装系统教程视频,微pe安装系统教程视频
- HTML+CSS静态页面`西安旅游网站设计——西安旅游(7页) 大学生旅游网页作品 出行网页设计作业模板 学生游玩网页制作源代码下载
- 二维拉普拉斯方程的数值解法
- Android包管理机制(二)PackageInstaller安装APK
- 计算机网络的基础学习
- 你需要的iPhoneX适配
- SpringBoot单元测试RunWith注解无法解析
- GitHub 狂飙 30K+star 面试现场, 专为程序员面试打造, 现已开源可下载
- 电报被人胡乱拉群解决办法
- 计算机毕业设计(附源码)python游泳馆管理系统
- Genome Assembly as Shortest Superstring
热门文章
- linux里关于Tab/Ctrl/Shift/Insert的快捷键
- word文档中表格顶头怎么调整_word使用技巧之-Word文字处理技巧,学会不求人!...
- Django视图层模版层全面解析全网最细的教程
- 月播放量增长2300倍,品牌如何在B站迅速打造爆品?
- 每日新闻:腾讯与Line携手在日本提供移动支付服务;阿里组织架构调整 行癫任阿里云智能总裁;每周要工作80小时才有可能改变世界...
- Recoil - Facebook 官方 React 状态管理器
- Mac/Windows下如何使用安卓模拟器开发UniApp
- [Matlab] 删除三维/高维数组非零/零项
- 在线语音合成 Java SDK 文档(科大讯飞)
- open用法 vba_open方法读写文件