Kernel下检测还原正确的SSDT

本文介绍了如何在内核级别修复Service Descriptor Table (SSDT)的过程。首先通过NtQuerySystemInformation获取ntkrnlpa.exe或ntoskrnl.exe基址,然后读取正确SSDT的偏移和长度。接着计算并更新SSDT中的调用地址,最后在禁用中断的情况下进行SSDT的内存复制。提供了RestoreServiceDescriptorTable函数的详细实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
步骤说明:
1)        用NtQuerySystemInformation取得内核模块ntkrnlpa.exe或ntoskrnl.exe的基址KernelBase,获取内核模块的文件名称,到底是ntkrnlpa.exe还是ntoskrnl.exe.
2)        读取ntkrnlpa.exe或ntoskrnl.exe的映象基址ImageBase,和.Text节中虚拟偏移Virtual Offset,实际偏移Real Offset.
3)        从ntkrnlpa.exe或ntoskrnl.exe读出正确的SSDT: 正确SSDT在ntkrnlpa.exe或ntoskrnl.exe文件中偏移 = *(PULONG)KeServiceDescriptorTable - KernelBase –Virtual Offset + Real Offset.读取长度 = KeServiceDescriptorTable->NumberOfService * 4.
4)        这里读出的内容每4字节就是一个调用的地址,但这样读出的内容还不是SSDT. 计算出正确的SSDT: 每4个字节 - ImageBase + KernelBase.
5)        禁用中断 -> memcpy写SSDT -> 启用中断.
以下是代码了,需要用到我前篇文章写的IrpFile.h,去复制就OK啦.
//RestoreSSDT_Kernel.c/
#include "IrpFile.h"
 
#define SystemModuleInformation 11
 
typedef struct _SYSTEM_MODULE_INFORMATION
{
     ULONG    Reserved[2];
     PVOID    Base;
     ULONG    Size;
     ULONG    Flags;
     USHORT   Index;
     USHORT   Unknown;
     USHORT   LoadCount;
     USHORT   ModuleNameOffset;
     CHAR ImageName[256];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
 
typedef struct
{
     ULONG                            NumberOfModules;
     SYSTEM_MODULE_INFORMATION   smi;
} MODULES, *PMODULES;
 
NTSYSAPI
NTSTATUS
NTAPI
NtQuerySystemInformation(
     IN ULONG SysInfoClass,
     IN OUT PVOID SystemInformation,
     IN ULONG SystemInformationLength,
     OUT PULONG Re

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值