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编写可能部分有不完美之处,控制台可参考
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
集创思维设计矩阵
慈思远 / 电子工业出版社 / 2017-4 / 72.00元
《集创思维设计矩阵——写给互联网人的设计指南》总结了作者从业7年以来的设计经历,在大量企业所面对的设计问题基础上,提出了枪型思维,即如何给产品更准确的定位。 在定位准确的基础上加以设计,提出了设计中高维度融合低维度的设计思维,即设计者可以从商业逻辑推演到设计逻辑,让设计更加精确;又提出了设计和计算的博弈,指出在每一步创新的基础上,设计者一定要清晰地评判设计的代价。这样设计后的产品才是可以和企......一起来看看 《集创思维设计矩阵》 这本书的介绍吧!
Markdown 在线编辑器
Markdown 在线编辑器
RGB CMYK 转换工具
RGB CMYK 互转工具