当前位置:网站首页>(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);
}
边栏推荐
- 【C# - 爬虫】使用Selenium实现爬虫,获取近七天天气信息(包含完整代码)
- Error occurred while trying to proxy request项目突然起不来了
- 反射与枚举
- 如何用matlab做高精度计算?【第一辑】
- Database Skills: Organize SQL Server's Very Practical Scripts
- 错误记录:TypeError: object() takes no parameters
- 西门子PLC1200与fanuc机器人进行profibus通讯
- 网络技巧:教你给路由器装上电池,断电照样可以上网!
- 无监督特征对齐的迁移学习理论框架
- MySQL复制表结构、表数据的方法
猜你喜欢

nacos 返回 403 unknown user 太他么坑了 源码解析

Software: Recommend a domestic and very easy-to-use efficiency software uTools to everyone

ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法
![[漏洞问题] log4j漏洞 关于2.17.0升级到2.18.0 方案](/img/f2/2052277ae440279b33248ae51a970f.png)
[漏洞问题] log4j漏洞 关于2.17.0升级到2.18.0 方案

Provide 和 Inject 的用法

C语言实现-华为太空人手表

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

西门子PLC1200与fanuc机器人进行profibus通讯

科研绘图图表类型种类繁多,本文告诉你如何选择!

Error occurred while trying to proxy request项目突然起不来了
随机推荐
Database Skills: Organize SQL Server's Very Practical Scripts
JVM 快速检测死锁
VMD结合ISSA优化LSSVM功率预测
JVM工具之 JPS
海康VisionMaster与西门子Smart 200进行S7通信
90多款matlab工具箱打包放送
Mac安装PHP开发环境
异步编程之promise,任务队列,事件循环
IoU, GIoU, DIoU and CIoU in target detection
VMD combined with ISSA to optimize LSSVM power prediction
力扣每日一题-第47天-15. 三数之和
代码小变化带来的大不同
舍不得花钱买1stOpt,不妨试试这款免费的拟合优化神器【openLU】
SENet detailed explanation and Keras reproduction code
花了近70美元入手的学生版MATLAB体验到底如何?
基于爬行动物搜索RSA优化LSTM的时间序列预测
搭建redis哨兵
Promise.all 使用方法
如何用matlab做高精度计算?【第三辑】(完)
电商系统PC商城模块介绍