当前位置:网站首页>(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);
}
边栏推荐
猜你喜欢
随机推荐
IDEA中创建编写JSP
MATLAB 的ICEEMDAN分解代码实现
Provide 和 Inject 的用法
Database Skills: Organize SQL Server's Very Practical Scripts
如何用matlab做高精度计算?【第三辑】(完)
CSRF和SSRF漏洞
nacos 返回 403 unknown user 太他么坑了 源码解析
this关键字,构造函数
元素的增删克隆以及利用增删来显示数据到页面上
【愚公系列】2022年07月 Go教学课程 027-深拷贝和浅拷贝
unicloud 腾讯云 上传文件 Have no access right to the storage uniapp
什么是多态。
误差指标分析计算之matlab实现【开源1.0.0版】
核心价值观编码器【matlab版】
力扣每日一题-第47天-15. 三数之和
Base64编码原理
Interpretation of EfficientNet: Composite scaling method of neural network (based on tf-Kersa reproduction code)
科研绘图图表类型种类繁多,本文告诉你如何选择!
Implementation of ICEEMDAN Decomposition Code in MATLAB
Mac安装PHP开发环境