07简单进程保护

栏目: 数据库 · SQL Server · 发布时间: 6年前

内容简介:通过编写简单的进程hook保护驱动并运行,分析如何解除驱动保护1、通过编写简单的进程hook保护驱动并运行,用以保护记事本进程2、分析如何过保护

通过编写简单的进程hook保护驱动并运行,分析如何解除驱动保护

设计思路分析

1、通过编写简单的进程hook保护驱动并运行,用以保护记事本进程

2、分析如何过保护

对象分析

07简单进程保护

运行自写程序HookProcess.exe选择要保护的进程(记事本),自动加载同目录下的驱动hook.sys并进行驱动保护

主要函数介绍

NtOpenProcess

驱动层函数,用于打开进程,原型参考如下

NTSTATUS ZwOpenProcess(

Out PHANDLE ProcessHandle, //句柄指针

In ACCESS_MASK DesiredAccess, //渴望得到的访问权限(标志)

In POBJECT_ATTRIBUTES ObjectAttributes, //属性结构指针

In_opt PCLIENT_ID ClientId //进程标示符结构指针

);

编写测试效果

07简单进程保护

07简单进程保护

运行保护程序保护记事本,使用CE(非内核模式)无法打开记事本,OD(无插件)也检测不到记事本进程

07简单进程保护

工具 检测SSDT发现NtOpenProcess确实被HOOK了
07简单进程保护

这时选择被HOOK内核函数NtOpenProcess把它恢复就可以了

07简单进程保护

也可以反汇编当前被HOOK地址,让他跳回正常内核函数NtOpenProcess原地址

07简单进程保护 07简单进程保护

恢复后CE能扫描,且OD也能检测到进程了

// 自定义的NtOpenProcess函数MyNtOpenProcess
extern "C" NTSTATUS __stdcall MyNtOpenProcess(OUT PHANDLE ProcessHandle, IN  ACCESS_MASK DesiredAccess, IN  POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId ) { 
	NTSTATUS rc; 
	HANDLE PID; 
	KdPrint(("进入了MyNtOpenProcess"));  	
	if(ClientId != NULL) { 
		PID = ClientId->UniqueProcess; 	 
		KdPrint(( "进程PID=%d\n",(int*)PID ));
		if(PID == hookPID) {			//判断是否为需要保护的进程pid
			KdPrint(("%d是被保护进程 hookPID=%d \n",(int)PID, (int)hookPID));
			KdPrint(("进程正在保护,NtOpenProcess失败!!!!!\n"));
			ProcessHandle = NULL;
			rc = STATUS_ACCESS_DENIED;	//拒绝访问
			EP = PsGetCurrentProcess();	//也可使用PsLookupProcessByProcessId((ULONG)PID,&EP);		 
			KdPrint(("进程名:%s\n",(PTSTR)((ULONG)EP+0x174)));
		} else {
			KdPrint(("%d不是被保护进程 hookPID=%d \n",(int)PID, (int)hookPID));
			rc = (NTSTATUS)RealNtOpenProcess(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId); 
		}
	} 
	return rc; 
}
// HOOK 函数构建
VOID HookNtOpenProcess() { 
	ssdthook_flag=true;
 	LONG PSSDT_Addr, *PNtOpenProcessr_Addr, NtOpenProcessr_Addr; 

	PSSDT_Addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;
	PNtOpenProcessr_Addr=(PLONG)(PSSDT_Addr+0x7A*4);
	NtOpenProcessr_Addr=*PNtOpenProcessr_Addr;	 
	RealNtOpenAddress = *PNtOpenProcessr_Addr; 
	RealNtOpenProcess = (NTOPENPROCESS *)RealNtOpenAddress; 

	KdPrint(("真实的NtOpenProcess地址: %x\n",(int)RealNtOpenAddress)); 
	KdPrint(("伪造NTOpenProcess地址: %x\n", (int)MyNtOpenProcess));  
	__asm
	{
		 cli
			mov eax,cr0
			and eax,not 10000h
			mov cr0,eax
	}

	// 修改SSDT 
	*PNtOpenProcessr_Addr= (ULONG)MyNtOpenProcess; 
	KdPrint(("UnHook修改NTOpenProcess OK \n")); 
		
	__asm 
	{ 
		  mov  eax, cr0 
		  or  eax, 10000h 
		  mov  cr0, eax 
		  sti 
	}   
	return;
} 

//UnHook函数构建
VOID UnHookNtOpenProcess() { 
	ULONG PNtOpenProcessr_Addr; 
	PNtOpenProcessr_Addr = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4; 
	if (ssdthook_flag) {
		ssdthook_flag=false;
		__asm 
		{ 
			cli 
			mov  eax, cr0 
			and  eax, not 10000h 
			mov  cr0, eax 
		} 

		// 还原SSDT 
		*((ULONG*)PNtOpenProcessr_Addr) = (ULONG)RealNtOpenAddress; 
		KdPrint(("UnHook还原NTOpenProcess OK \n")); 
		
		__asm 
		{ 
			mov  eax, cr0 
			or  eax, 10000h 
			mov  cr0, eax 
			sti 
		} 
	}
	return;
}

总体评价

本驱动保护比较简单,很容易就会被OD插件解除,仅用于学习原理,在windowsXP下测试成功,EXE由MFC编写可能部分有不完美之处,控制台可参考

本文链接地址: https://www.dbgpro.com/archives/4830.html

——版权声明——


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Open Scene Graph3.0三维视景仿真技术开发详解

Open Scene Graph3.0三维视景仿真技术开发详解

国防工业出版社 / 2012-7-1 / 46.00元

OpenSceneGraph 3.0三维视景仿真技术开发详解,ISBN:9787118081411,作者:杨化斌 著 杨化斌 编一起来看看 《Open Scene Graph3.0三维视景仿真技术开发详解》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具