当前位置:网站首页>(19)[系统调用]SSTD hook 阻止关闭
(19)[系统调用]SSTD hook 阻止关闭
2022-08-04 06:02:00 【一口一个橘子】

简单跟一下,看到TerminateProcess函数的服务号是 0x101
#include <ntddk.h>
#include <ntstatus.h>
// NtTerminateProcess 系统调用号
const int serviceID = 0x101;
DWORD32* pte, *pde;
DWORD32 writeBack_PTE, writeBack_PDE;
DWORD32 oldAddr; // 旧的函数地址
DWORD32 funcsTable;
// 系统服务表
typedef struct _KSYSTEM_SERVICE_TABLE
{
PULONG ServiceTableBase; // 函数地址表
PULONG ServiceCounterTableBase; // SSDT 函数被调用的次数
ULONG NumberOfService; // 函数个数
PULONG ParamTableBase; // 函数参数表
} KSYSTEM_SERVICE_TABLE, *PKSYSTEM_SERVICE_TABLE;
// SSDT
typedef struct _KSERVICE_TABLE_DESCRIPTOR
{
KSYSTEM_SERVICE_TABLE ntoskrnl; // 内核函数
KSYSTEM_SERVICE_TABLE win32k; // win32k.sys 函数
KSYSTEM_SERVICE_TABLE unUsed1;
KSYSTEM_SERVICE_TABLE unUsed2;
} KSERVICE_TABLE_DESCRIPTOR, * PKSERVICE_TABLE_DESCRIPTOR;
extern PKSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable; // 导出全局变量
NTSTATUS NtTerminateProcess_hooking(HANDLE ProcessHandle, NTSTATUS ExitStatus); //被hook的函数
void DriverUnload(PDRIVER_OBJECT pDriver);
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING reg_path);
void HookNtTerminateProcess();
void UnHookNtTerminateProcess();
typedef NTSTATUS(*Func_NtTerminateProcess) (HANDLE ProcessHandle, NTSTATUS ExitStatus);
// 驱动入口
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING reg_path) {
// 初始化函数地址表
funcsTable = (DWORD32)KeServiceDescriptorTable->ntoskrnl.ServiceTableBase;
// hook
HookNtTerminateProcess();
pDriver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
// 卸载驱动
void DriverUnload(PDRIVER_OBJECT pDriver) {
// unhook
UnHookNtTerminateProcess();
DbgPrint("Driver unloaded.\n");
}
// 其实这里根本不用去修改读写权限,本身是驱动,然后这里是可读可写的,刚好满足页属性
// 修改页权限,使其可读可写可执行
void changePagePrivilege(DWORD32 addr, DWORD32 privilege) {
如果不关中断的话,写到一半被别的进程调用这个函数会出问题
不关应该也问题不大,不是长期跑,不会那么倒霉的
//__asm cli; // 关闭中断
//pte = (DWORD32*)(((addr >> 9) & 0x7FFFF8) + 0xC0000000);
//pde = (DWORD32*)(((addr >> 18) & 0x3FF8) + 0xC0600000);
//
//writeBack_PDE = *pde;
//
如果PDE权限不对
//if (((*pde) & privilege) == 0) {
// *pde |= privilege;
//}
小页才需要修改,大页什么都不做,
//if ((*pde & 0x80) == 0) {
// writeBack_PTE = *pte; //如果是大页,则不存在pte,读了蓝屏
// *pte |= privilege;
//}
}
// 改回来
void restorePrivilege() {
//
//if (writeBack_PDE != *pde)
// *pde = writeBack_PDE;
//if ((*pde & 0x80) == 0) { //小页
// *pte = writeBack_PTE;
//}
//
//__asm sti; // 恢复中断
}
void HookNtTerminateProcess() {
_asm int 3;
changePagePrivilege(funcsTable, 2); // 2 : 10B 读写权限
oldAddr = ((DWORD32*)funcsTable)[serviceID];
((DWORD32*)funcsTable)[serviceID] = (ULONG)NtTerminateProcess_hooking;
restorePrivilege();
}
void UnHookNtTerminateProcess() {
changePagePrivilege(funcsTable, 2);
((DWORD32*)funcsTable)[serviceID] = oldAddr;
restorePrivilege();
}
//打印调用时的参数
#define MY_DEBUG
// hook中的函数
NTSTATUS NtTerminateProcess_hooking(HANDLE ProcessHandle, NTSTATUS ExitStatus) {
PEPROCESS pEprocess;
NTSTATUS status = ObReferenceObjectByHandle(ProcessHandle, FILE_ANY_ACCESS, *PsProcessType, KernelMode, &pEprocess, NULL);
if (!NT_SUCCESS(status)) {
DbgPrint("ObReferenceObjectByHandle function error!\tERROR CODE: %d\n", status);
return status;
}
//_EPROCESS.ImageFileName[16]
CHAR* ImageFileName = (CHAR*)pEprocess + 0x174;
if (strcmp(ImageFileName, "notepad.exe") == 0) {
if (ProcessHandle == (HANDLE)0xFFFFFFFF) {
// 通过notepad.exe右上角的x关闭
#ifdef MY_DEBUG
DbgPrint("关闭成功:%s: NtTerminateProcess(%x, %x)\n", ImageFileName, ProcessHandle, ExitStatus);
#endif // DEBUG
return ((Func_NtTerminateProcess)oldAddr)(ProcessHandle, ExitStatus);
}
else {
// 通过任务管理器关闭
#ifdef MY_DEBUG
DbgPrint("拒绝关闭:%s: NtTerminateProcess(%x, %x)\n", ImageFileName, ProcessHandle, ExitStatus);
#endif // DEBUG
return STATUS_ACCESS_DENIED;
}
}
return ((Func_NtTerminateProcess)oldAddr)(ProcessHandle, ExitStatus);
}
边栏推荐
猜你喜欢

窥探晶体世界的奥秘 —— 230种空间群晶体结构模型全在这里

从零开始单相在线式不间断电源(UPS)(硬件)

【C# - 爬虫】使用Selenium实现爬虫,获取近七天天气信息(包含完整代码)

数据特征预处理——缺失值的查看方式及处理

自适应迁移学习核极限学习机用于预测

如何用matlab做高精度计算?【第二辑】

舍不得花钱买1stOpt,不妨试试这款免费的拟合优化神器【openLU】

基于EEMD+GRU+MLR的时间序列预测

Interpretation of EfficientNet: Composite scaling method of neural network (based on tf-Kersa reproduction code)

Time Series Forecasting Based on Reptile Search RSA Optimized LSTM
随机推荐
子空间结构保持的多层极限学习机自编码器(ML-SELM-AE)
Interpretation of EfficientNet: Composite scaling method of neural network (based on tf-Kersa reproduction code)
设置el-table自动向下滑动(不多解释,直接代码实现)
基于EEMD+GRU+MLR的时间序列预测
专题讲座7 计算几何 学习心得
matlab科研绘图模板,直接奉上源代码!
Database knowledge: SQLServer creates non-sa user notes
A priori box (Anchor) in target detection
SENet detailed explanation and Keras reproduction code
Promise.all 使用方法
原型图总结规范
天鹰优化的半监督拉普拉斯深度核极限学习机用于分类
如何用matlab做高精度计算?【第二辑】
七夕专属程序员的浪漫
MySQL面试题大全(陆续更新)
字符串的一些方法
科研绘图图表类型种类繁多,本文告诉你如何选择!
窥探晶体世界的奥秘 —— 230种空间群晶体结构模型全在这里
用matlab打造的摩斯电码加解码器音频版,支持包括中文在内的任意字符
MySQL内存淘汰策略