07简单进程保护
栏目: 数据库 · SQL Server · 发布时间: 6年前
内容简介:通过编写简单的进程hook保护驱动并运行,分析如何解除驱动保护1、通过编写简单的进程hook保护驱动并运行,用以保护记事本进程2、分析如何过保护
通过编写简单的进程hook保护驱动并运行,分析如何解除驱动保护
设计思路分析
1、通过编写简单的进程hook保护驱动并运行,用以保护记事本进程
2、分析如何过保护
对象分析
运行自写程序HookProcess.exe选择要保护的进程(记事本),自动加载同目录下的驱动hook.sys并进行驱动保护
主要函数介绍
NtOpenProcess
驱动层函数,用于打开进程,原型参考如下
NTSTATUS ZwOpenProcess(
Out PHANDLE ProcessHandle, //句柄指针
In ACCESS_MASK DesiredAccess, //渴望得到的访问权限(标志)
In POBJECT_ATTRIBUTES ObjectAttributes, //属性结构指针
In_opt PCLIENT_ID ClientId //进程标示符结构指针
);
编写测试效果
运行保护程序保护记事本,使用CE(非内核模式)无法打开记事本,OD(无插件)也检测不到记事本进程
用 工具 检测SSDT发现NtOpenProcess确实被HOOK了
这时选择被HOOK内核函数NtOpenProcess把它恢复就可以了
也可以反汇编当前被HOOK地址,让他跳回正常内核函数NtOpenProcess原地址
恢复后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编写可能部分有不完美之处,控制台可参考
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 进程:进程生命周期
- Python 知识巩固:通过主进程带起多个子进程实现多进程执行逻辑
- Python 中子进程与父进程
- 某游戏DLL保护分析,以及偷学一点Unity代码保护思路
- 什么是僵尸进程,如何找到并杀掉僵尸进程?
- Python第十二章-多进程和多线程01-多进程
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Agile Web Development with Rails, Third Edition
Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2009-03-17 / USD 43.95
Rails just keeps on changing. Rails 2, released in 2008, brings hundreds of improvements, including new support for RESTful applications, new generator options, and so on. And, as importantly, we’ve a......一起来看看 《Agile Web Development with Rails, Third Edition》 这本书的介绍吧!