07简单进程保护
栏目: 数据库 · SQL Server · 发布时间: 7年前
内容简介:通过编写简单的进程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-多进程
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Windows API编程范例入门与提高
东方人华 / 清华大学出版社 / 2004-1-1 / 38.00
本书通过大量实用、经典的范例,以Visual Basic为开发平台由浅入深地介绍了Windows API编程的基本方法和大量的实用技巧。本书采用实例带动知识点的形式,使读者快速入门并逐步得到提高。本书每节即是一个实例,操作步骤详尽,所用到的源文件均可在网站下载。读者可以按照操作步骤完成每个实例的制作,并根据自己的喜好进行修改、举一反三。 本书内容翔实,凝结了作者多年的编程经验,既适合......一起来看看 《Windows API编程范例入门与提高》 这本书的介绍吧!