当前位置:网站首页>(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);
}
边栏推荐
猜你喜欢

【深度学习实践(二)】上手手写数字识别

网络技巧:教你给路由器装上电池,断电照样可以上网!

Database Skills: Organize SQL Server's Very Practical Scripts

fanuc机器人IO分配报警信号分配无效

用matlab打造的摩斯电码加解码器音频版,支持包括中文在内的任意字符

unicloud 腾讯云 上传文件 Have no access right to the storage uniapp

pycharm专业版使用

matlab的2DCNN、1DCNN、BP、SVM故障诊断与结果可视化

matlab让我的旧手机起死回生

unity webgl报 Uncaught SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON
随机推荐
基于时序模式注意力机制(TPA)的长短时记忆(LSTM)网络TPA-LSTM的多变量输入风电功率预测
pycharm专业版使用
ES6新语法:symbol,map容器
Activiti 工作流引擎 详解
有人试过用NPGsql驱动连接openGauss开发应用的吗?
七夕送礼,心愿直抵!
mysql锁机制
力扣每日一题-第47天-15. 三数之和
MySQL基础(DDL、DML、DQL)
[漏洞问题] log4j漏洞 关于2.17.0升级到2.18.0 方案
用手机也能轻松玩转MATLAB编程
科研绘图图表类型种类繁多,本文告诉你如何选择!
【深度学习实践(二)】上手手写数字识别
专属程序员的浪漫七夕
IoU, GIoU, DIoU and CIoU in target detection
如何用matlab做高精度计算?【第一辑】
搭建redis哨兵
ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法
MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
Network skills: teach you to install batteries on the router, you can still surf the Internet when the power is cut off!