SSDT即System Service Dispath Table,它是一个表,这个表中有内核调用的函数地址。
KeServiceDescriptorTable:是由内核(Ntoskrnl.exe)导出的一个表,这个表是访问SSDT的关键,具体结构是
typedef struct ServiceDescriptorTable {
PVOID ServiceTableBase;
PVOID ServiceCounterTable(0);
unsigned int NumberOfServices;
PVOID ParamTableBase;
}

其中,
ServiceTableBase System Service Dispatch Table 的基地址。
NumberOfServices 由 ServiceTableBase 描述的服务的数目。
ServiceCounterTable 此域用于操作系统的 checked builds,包含着 SSDT 中每个服务被调用次数的计数器。这个计数器由 INT 2Eh 处理程序 (KiSystemService)更新。
ParamTableBase 包含每个系统服务参数字节数表的基地址。

CR0当中有一个写保护位,是保护内存不可写属性的,为了能够写入内核,只能把它的保护给咔嚓掉了,不过……如果做完了手脚但不还原写保护属性的话,极有可能会BOSD.

代码实例如下:

#include <NTDDK.h>

#pragma pack(1)
typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase; //Used only in checked build
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry;
#pragma pack()

_declspec(dllimport) ServiceDescriptorTableEntry

KeServiceDescriptorTable;

NTSYSAPI NTSTATUS ZwOpenProcess(OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId);

typedef NTSTATUS (*ZWOPENPROCESS)(OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId);

#define SYSTEMSERVICE(_function)

KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)_function + 1)]

ZWOPENPROCESS OldZwOpenProcess;

NTSTATUS MyZwOpenProcess(PHANDLE ProcessHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
PCLIENT_ID ClientId)
{
NTSTATUS ntStatus = STATUS_SUCCESS;

KdPrint(("MyZwOpenProcess\r\n"));

//调用原来的NtOpenProcess;
ntStatus = OldZwOpenProcess(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);

return ntStatus;
}

VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
__asm{//去掉内存保护
cli
mov  eax,cr0
and  eax,not 10000h
mov  cr0,eax
}

(ZWOPENPROCESS)SYSTEMSERVICE(ZwOpenProcess) = OldZwOpenProcess;//恢复HOOK SSDT

__asm{//恢复内存保护 
mov  eax,cr0
or   eax,10000h
mov  cr0,eax
sti
}

KdPrint(("驱动卸载完毕!\r\n"));
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING pRegistryPath)
{
NTSTATUS status = STATUS_SUCCESS;
KdPrint(("The driver begin loading.\r\n"));
DriverObject->DriverUnload = DriverUnload;
OldZwOpenProcess = (ZWOPENPROCESS)SYSTEMSERVICE(ZwOpenProcess);

__asm{//去掉内存保护
cli
mov  eax,cr0
and  eax,not 10000h
mov  cr0,eax
}

(ZWOPENPROCESS)SYSTEMSERVICE(ZwOpenProcess) = MyZwOpenProcess;

//HOOK SSDT

__asm{//恢复内存保护 
mov  eax,cr0
or   eax,10000h
mov  cr0,eax
sti
}
KdPrint(("The driver ends loading\r\n"));
return status;
}

转载于:https://www.cnblogs.com/vcerror/p/4289219.html

Rootkit之SSDT hook(通过CR0)相关推荐

  1. 也谈SSDT Hook(二)

    一.实战篇 本不想摘代码,既然实战,就不多讲废话了,还是贴上吧,谁都有违背原则的时候:). 代码一:经典案例,替换NtQuerySystemInformation,列取所有查询到的进程名,我使用修改C ...

  2. SSDT Hook的妙用-对抗ring0 inline hook

    ******************************************************* *标题:[原创]SSDT Hook的妙用-对抗ring0 inline hook  * ...

  3. (52)系统调用阶段测试——基于 SSDT HOOK 的 FindWindowA 监视器

    一.项目说明 SSDT HOOK 内核函数我们已经会了,请看这两篇博客: SSDT HOOK 实现进程保护 补充内容:SSDT HOOK 模板 此次考试和 hook NtOpenProcess 或 N ...

  4. (51)SSDT HOOK 实现进程保护

    一.回顾 在前面的课程里,我们逆向分析了 KiSystemService / KiFastCallEntry 的部分代码,我们发现这两个函数找系统服务表 SystemServiceTable 的方法是 ...

  5. (50)补充内容:SSDT HOOK 模板

    代码 下面的驱动代码ssdt hook了NtOpenProcess函数,可以监视打开进程的操作. #include <ntddk.h> #include <ntstatus.h> ...

  6. Windows驱动开发学习笔记(五)—— SSDT HOOK

    Windows驱动开发学习笔记(五)-- SSDT HOOK 系统服务表 系统服务描述符表 实验一:通过代码获取SSDT表地址 通过页表基址修改页属性 方法1:修改页属性 方法2:修改CR0寄存器 实 ...

  7. 进程隐藏与进程保护(SSDT Hook 实现)(二)

    文章目录: 1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ring0 实现进程保护: 6. 隐藏进 ...

  8. 进程隐藏与进程保护(SSDT Hook 实现)(一)

    文章目录: 1. 引子 – Hook 技术: 2. SSDT 简介: 3. 应用层调用 Win32 API 的完整执行流程: 4. 详解 SSDT: 5. SSDT  Hook 原理: 6. 小结: ...

  9. SSDT—Hook和MDL

    SSDT HOOK 首先要明白SSDTHOOK就是自己再写一份函数,替换了SSDT表中的地址替换掉 如何访问系统服务表呢? SSDT 的全称是 System Services Descriptor T ...

最新文章

  1. Chrome 浏览器扩展 - Night Eye
  2. matlab cell
  3. java逻辑编程题_用Java编程解决一道逻辑推理题
  4. 前端开发和设计必备的Chrome插件
  5. paip.-Djava.library.path -Djava.ext.dirs= 的区别
  6. 2022年(第八届)全国大学生统计建模大赛
  7. qq for android 4.6能视频吗,安卓qq4.6使用评测
  8. biosrecovery什么意思_卡刷和线刷手机什么意思 Recovery使用方法
  9. 2021美团校招(一)
  10. 给定字符串 s 和 t ,判断 s 是否为 t 的子序列
  11. 百度网盘完美不限速下载,60MB/s,卢本伟修改!
  12. 小学计算机打字基础知识教案绿色圃,小学信息技术《键盘操作再加强—认识特殊键》教案...
  13. unity3d音频系统
  14. KaTex公式居左对齐
  15. spyder和Python有什么联系?spyder有哪些功能?
  16. 分支定界算法在中学排课问题中的应用
  17. 索引失效的情况及解决(超详细)
  18. qq邮箱做php邮箱发送,PHP中利用PHPMailer发送QQ邮件
  19. Google Chrome Extensions 最新精彩插件推荐
  20. 一卡通系统软件测试,公共交通一卡通互联互通测试平台的研究

热门文章

  1. 网站性能越来越差怎么办?
  2. 以实例说明如何使用C#从数据库中提取数据,按要求自动生成定制的Excel表格
  3. 【Qt】Qt再学习(一):Application Example
  4. centos7镜像加速_虚拟机 Linux CentOS7 安装Docker 详解:使用 阿里云Yum源;附加云镜像加速器...
  5. linux系统发送信号的系统调用是,linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction...
  6. java 重载与覆盖_Java重载与覆盖
  7. 自己动手写cpu pdf_自己动手写 Promise
  8. python潜力开源项目_比较了1000多个Python开源项目,精选出这34个
  9. 吴恩达深度学习ppt_【深度学习】吴恩达谈深度学习:数据科学家需要知道这些...
  10. spark编程基础--5.3数据读写