吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2746|回复: 3
收起左侧

[C&C++ 转载] SSDT HOOK 实现保护记事本进程

[复制链接]
哥比彩砖还炫 发表于 2021-3-7 18:25
[C] 纯文本查看 复制代码
/*将系统服务表中的某个函数改成自己的函数,是任务管理器无法关闭它,只有点击自己的关闭按钮才可以额正
常关闭*/
#include <ntddk.h>
#include <ntstatus.h>
/*函数声明PsGetProcessImageFileName就可以使用了*/
NTKERNELAPI
UCHAR *
PsGetProcessImageFileName(
__in PEPROCESS Process
);

//定义一个宏,这个代表是NtTerminateProcess的服务号
#define NTTERMINATEPROCESS 0x101;
ULONG OldNtTerminateProcess;

typedef (*NTTERMINATE)(HANDLE ProcessHandle, NTSTATUS ExitStatus);
/*****************************************

***声明函数

*****************************************/
VOID PageProtectOn(VOID);
VOID PageProtectOff(VOID);
VOID HOOKNtTerminateProcess(VOID);
VOID UNHOOKNtTerminateProcess(VOID);
NTSTATUS NewNtTerminateProcess(HANDLE ProcessHandle, NTSTATUS ExitStatus);//保护记事本不被任务管理器关闭
/*****************************************

***SSDT表

*****************************************/
typedef struct _KSYSTEM_SERVICE_TABLE
{
	PULONG ServiceTableBase;
	PULONG ServiceCounterTableBase;
	ULONG NumberOfService;
	PULONG ParamTableBase;
}KSYSTEM_SERVICE_TABLE, *PKSYSTEM_SERVICE_TABLE;

typedef struct _KSERVICE_TABLE_DESCRIPTOR
{
	KSYSTEM_SERVICE_TABLE ntoskrnl;
	KSYSTEM_SERVICE_TABLE win32k;
	KSYSTEM_SERVICE_TABLE notUsed1;
	KSYSTEM_SERVICE_TABLE notUsed2;
}KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;

extern PKSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable;

VOID DriverLoad(PDRIVER_OBJECT pDriver)
{
	UNHOOKNtTerminateProcess();
	DbgPrint("驱动已经被卸载了!\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver,PUNICODE_STRING pReg)
{
	HOOKNtTerminateProcess();
	
	pDriver->DriverUnload = DriverLoad;
	return STATUS_SUCCESS;
}

VOID PageProtectOn(VOID)
{
	__asm
	{
		mov eax, cr0;
		or eax, 0x10000;
		mov cr0, eax;
		sti;
	}
}
VOID PageProtectOff(VOID)
{
	__asm
	{
		cli;
		mov eax, cr0;
		and eax, not 0x10000;
		mov cr0, eax;
	}

}
VOID HOOKNtTerminateProcess(VOID)
{
	PageProtectOff();
	OldNtTerminateProcess = KeServiceDescriptorTable->ntoskrnl.ServiceTableBase[0x101];
	KeServiceDescriptorTable->ntoskrnl.ServiceTableBase[0x101] = NewNtTerminateProcess;
	PageProtectOn();
}

VOID UNHOOKNtTerminateProcess(VOID)
{
	PageProtectOff();
	KeServiceDescriptorTable->ntoskrnl.ServiceTableBase[0x101] = OldNtTerminateProcess;
	PageProtectOn();
}
NTSTATUS NewNtTerminateProcess(HANDLE ProcessHandle, NTSTATUS ExitStatus)
{
	PEPROCESS pEprocess;
	NTSTATUS status;
	PCHAR ImageFileName;

	// 此API用法请看文档
	/*setokenobjecttype*/
	status = ObReferenceObjectByHandle(ProcessHandle, FILE_ANY_ACCESS, NULL, KernelMode, &pEprocess, NULL);
	if (!NT_SUCCESS(status))
	{
		return status;//失败了
	}
	// 根据镜像文件名判断是不是要保护的进程,字符串最大长度是16,超过就会截断,所以不用担心越界
	ImageFileName = (CHAR*)PsGetProcessImageFileName(pEprocess);//PsGetProcessImageFileName通过进程结构体获取进程的名字
	if (!strcmp(ImageFileName, "notepad.exe"))
	{
		if (pEprocess != PsGetCurrentProcess())
		{
			DbgPrint("关闭已经被拒绝!\n");
			return STATUS_ACCESS_DENIED;
		}
	
	}


	return ((NTTERMINATE)OldNtTerminateProcess)(ProcessHandle, ExitStatus);
}

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wangpaishi 发表于 2021-3-17 19:58
已收藏,正好能用上,平时都是开守护进程,感谢源码
JustAlone 发表于 2022-1-29 10:01
52iiikn 发表于 2022-7-31 18:52
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 03:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表