SSDT:

SSDT全称: System Services Descriptor Table 即系统服务描述表

这个表将Ring3的Win32 API 和 Ring0 的内核 API联系起来。通过修改此表的函数地址可以对常用Windows函数及API进行Hook,从而实现对一些关心的系统动作进行过滤、监控等目的。

在NT4.0 以上的Windpws 操作系统中,默认存在两个系统服务描述表,两个调度表对应两类不同的系统服务。
分别为KeServiceDescriptorTableKeServiceDescriptorTableShadow 其中KeServiceDescriptorTable 主要处理来自Ring3层Kernel32.dll中的系统调用。
KeServiceDescriptorTableShadow则主要处理来自User32.dll和GDI32.dll中的系统调用。

系统服务分发函数KiSystemService

场景:

例如进程保护(驱动)
端口隐藏
文件隐藏等

系统从Ring3 到 Ring0 的执行过程:

Hook前准备:

要Hook SSDT表,首选需要这个表是可写的,但是在XP之后的系统都是只读的,有三种方式修改内存保护机制。

  1. 更改注册表:
恢复页面保护:HKLM\SYSTEM\CurrentControlset\Control\Session Manger\Memory Management\EnforceWriteProtection=0
去掉页面保护:HKLM\SYSTEM\CurrentControlset\Control\Session Manger\Memory Management\DisablePagingExecutive=1
  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执行失败!");}
}
  1. 通过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技术相关推荐

  1. 简单实现了下SSDT SHADOW HOOK

    介绍:         SSDT SHADOW HOOK可用于安全软件窗口保护.安全输入.截屏保护等.例如:挂钩NtUserFindWindowEx.NtUserGetForegroundWindow ...

  2. 黑客爱用的 HOOK 技术大揭秘

    福利:网络安全重磅福利:入门&进阶全套282G学习资源包免费分享! 什么是 HOOK 技术? 病毒木马为何惨遭杀软拦截? 商业软件为何频遭免费破解? 系统漏洞为何能被补丁修复? 这一切的背后到 ...

  3. 黑客爱用的 HOOK 技术大揭秘!

    黑客爱用的 HOOK 技术大揭秘! 什么是 HOOK 技术? 病毒木马为何惨遭杀软拦截? 商业软件为何频遭免费破解? 系统漏洞为何能被补丁修复? 这一切的背后到底是人性的扭曲,还是道德的沦丧,敬请收看 ...

  4. android hook技术教学视频,[科普向]hook技术简单介绍

    首先 1.  这只是科普向,会介绍相关Hook技术及原理,但是不会给源码.源码请自行百度 2.请至少有一点Windows编程经验,知道系统API是什么...以免看科普内容给您带来不适 3.这里结合了一 ...

  5. x64内核HOOK技术之拦截

    转:https://www.cnblogs.com/iBinary/p/8399312.html 截进程.拦截线程.拦截模块 一丶为什么讲解HOOK技术. 在32系统下, 例如我们要HOOK SSDT ...

  6. 黑客爱用的HOOK技术大揭秘!

    什么是HOOK技术? 病毒木马为何惨遭杀软拦截? 商业软件为何频遭免费破解? 系统漏洞为何能被补丁修复? 这一切的背后到底是人性的扭曲,还是道德的沦丧,尽请收看今天的专题文章:<什么是HOOK技 ...

  7. 相关Hook技术及原理

    首先要说下CPU权限...Intel把自家CPU指令分为四个等级,Ring0,Ring1,Ring2,Ring3,Windows操作系统只用了Ring0和Ring3两个权限.简称R0和R3好了 R0权 ...

  8. android socket_盘点Android常用Hook技术

    Android平台开发测试过程中,Hook技术是每个开发人员都常用的技术.可以用于绕过系统限制.修改别人发布的代码.动态化.调用隐藏API.插件化.组件化.自动化测试.沙箱等等. Hook如果要跨进程 ...

  9. Hook技术之4 在自己的进程中注入一个Dll到别人的进程

    与其说是一种技术,不如说是一种技术思想.它使用了前面讲的那些Hook手段,来达到自己的目的. 其应用环境是这样的,自己有一个进程在运行,这个进程是自己可以控制的,但由于业务的需要,自己又要执行另一个应 ...

  10. 【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. c语言实现定长顺序存储,c语言:定长顺序串的基本操作实实现
  2. 软件工程作业2.1:阐述对软件工程的理解,学完这门课自己能学到什么,学完后能做什么...
  3. 华硕飞行堡垒开启虚拟化
  4. PHP 标准AES加密算法类
  5. tzselect 设置时间
  6. albert使用的中文语料
  7. oracle有条件插入数据,Oracle有条件地插入数据
  8. 马库斯再谈AlphaGo Zero不是从零开始,AGI可能需要这十大先天机制
  9. 计算机一级幻灯片样式,PPT怎么设置单个幻灯片为背景样式4?网友:原来这么简单!...
  10. 如何用pe安装服务器系统安装系统教程视频,微pe安装系统教程视频
  11. HTML+CSS静态页面`西安旅游网站设计——西安旅游(7页) 大学生旅游网页作品 出行网页设计作业模板 学生游玩网页制作源代码下载
  12. 二维拉普拉斯方程的数值解法
  13. Android包管理机制(二)PackageInstaller安装APK
  14. 计算机网络的基础学习
  15. 你需要的iPhoneX适配
  16. SpringBoot单元测试RunWith注解无法解析
  17. GitHub 狂飙 30K+star 面试现场, 专为程序员面试打造, 现已开源可下载
  18. 电报被人胡乱拉群解决办法
  19. 计算机毕业设计(附源码)python游泳馆管理系统
  20. Genome Assembly as Shortest Superstring

热门文章

  1. linux里关于Tab/Ctrl/Shift/Insert的快捷键
  2. word文档中表格顶头怎么调整_word使用技巧之-Word文字处理技巧,学会不求人!...
  3. Django视图层模版层全面解析全网最细的教程
  4. 月播放量增长2300倍,品牌如何在B站迅速打造爆品?
  5. 每日新闻:腾讯与Line携手在日本提供移动支付服务;阿里组织架构调整 行癫任阿里云智能总裁;每周要工作80小时才有可能改变世界...
  6. Recoil - Facebook 官方 React 状态管理器
  7. Mac/Windows下如何使用安卓模拟器开发UniApp
  8. [Matlab] 删除三维/高维数组非零/零项
  9. 在线语音合成 Java SDK 文档(科大讯飞)
  10. open用法 vba_open方法读写文件