当前位置:网站首页>(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);
}
边栏推荐
- MySQL - Row size too large (> 8126). Changing some columns to TEXT or BLOB
- 指定区域内随机填充圆之matlab实现
- Network skills: teach you to install batteries on the router, you can still surf the Internet when the power is cut off!
- 误差指标分析计算之matlab实现【开源1.0.0版】
- MATLAB 的ICEEMDAN分解代码实现
- SystemVerilog-条件(三元)运算符
- “需求370解决解决爬取章节之后主题讨论评论消失问题”工作总结
- MAML principle explanation and code implementation
- CSRF和SSRF漏洞
- 自适应迁移学习核极限学习机用于预测
猜你喜欢

matlab科研绘图模板,直接奉上源代码!

小猫爪:AWR294x学习笔记02-AWR294x之DPM&IPC

HbuilderX 启动微信小程序 无法打开项目

误差指标分析计算之matlab实现【开源1.0.0版】

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

VMD combined with ISSA to optimize LSSVM power prediction

Mac安装PHP开发环境

Error ER_NOT_SUPPORTED_AUTH_MODE Client does not support authentication protocol requested by serv

有趣的USB接口和颜色分类

拒绝碰运气,导师人品这样了解!
随机推荐
零分贝超静音无线鼠标!数量有限!!先到先得!!!【元旦专享】
【C# - 方法封装】数据转换
MMDeploy部署实战系列【第四章】:onnx,tensorrt模型推理
Online public account article content to audio file practical gadget
字符串的一些方法
无监督特征对齐的迁移学习理论框架
JVM调优实践
unicloud 腾讯云 上传文件 Have no access right to the storage uniapp
ES6新语法:symbol,map容器
数组的一些方法
SystemVerilog-条件(三元)运算符
【C# - 爬虫】使用Selenium实现爬虫,获取近七天天气信息(包含完整代码)
likeshop外卖点餐系统开源啦100%开源无加密
更改mysql数据库默认的字符集(mysql 存储 emoji表情)
海康VisionMaster与西门子Smart 200进行S7通信
详解CAN总线:常用CAN连接器的使用方法
网络技巧:教你给路由器装上电池,断电照样可以上网!
Verilog“七宗罪”
Database document generation tool V1.0
有人试过用NPGsql驱动连接openGauss开发应用的吗?