- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
驱动保护War3.exe防止被任务管理器结束进程
举一反三后,其实可以实现很多类似游戏的xxx驱动保护。当然也可以反掉 xxx驱动保护。
相对来说 在驱动编程中这个是一个最精简的源码了,很多复杂的驱动钩子都是通过这个慢慢修改出来的。
用WINDDK黑色控制台编译通过,同样适合 VC6.0、VS2005 、VS2008等开发工具编译。
不过要用VC6.0等编译的话,需要设置下VC6.0,有点小麻烦。
#include <ntddk.h>
typedef struct _SystemServiceDescriptorTable
{
PVOID ServiceTableBase; //SSDT表的基地址
PULONG ServiceCounterTableBase; //指向另一个索引表,该表包含了每个服务表项被调用的次数
ULONG NumberOfService; //当前系统所支持的服务个数
ULONG ParamTableBase; //包含了每个服务所需的参数字节数
}SystemServiceDescriptorTable,*PSystemServiceDescriptorTable;
extern PSystemServiceDescriptorTable KeServiceDescriptorTable; //导出函数,DDK的头文件中并未声明
typedef NTSTATUS (*NTTERNIMATEPROCESS)( IN HANDLE ProcessHandle,
IN NTSTATUS ExitStatus ); //定义一个函数指针
NTTERNIMATEPROCESS pRealNtTerminateAddr;
ULONG RealServiceAddress; //接受被hook的函数地址
CHAR *TerminateName = "War3.exe"; //这里就是我们的记事本进程名
UCHAR* PsGetProcessImageFileName( IN PEPROCESS Process );
BOOLEAN IsProtect(CHAR *temp) //判断正在结束的进程是否是我们要保护的记事本进程
{
ULONG len = strcmp(TerminateName, temp);
if(!len)
return TRUE;
return FALSE;
}
NTSTATUS MyNtTerminateProcess(IN HANDLE ProcessHandle, IN NTSTATUS ExitStatus)//我们自己的NtTerminateProcess
{
PEPROCESS process; //接受通过ProcessHandle返回的进程
NTSTATUS status;
CHAR *pName; //接受进程的进程名
status = ObReferenceObjectByHandle(ProcessHandle,
FILE_READ_DATA,
0,
KernelMode,
&process,
NULL); //获取进程
if(!NT_SUCCESS(status))
return (NTSTATUS)(NTTERNIMATEPROCESS)pRealNtTerminateAddr(ProcessHandle, ExitStatus);
pName = (CHAR*)PsGetProcessImageFileName(process); //获取进程名
if(IsProtect(pName)) //判断是否是我们要保护的进程,是则返回权限不足,否则调用原函数结束进程
return STATUS_ACCESS_DENIED;
return (NTSTATUS)(NTTERNIMATEPROCESS)pRealNtTerminateAddr(ProcessHandle, ExitStatus);
}
NTSTATUS Hook()
{
ULONG Address;
Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x101 * 4;//0x101可以用windbg获得,或者查询debugman论坛里面SSDT表
RealServiceAddress = *(ULONG*)Address;
pRealNtTerminateAddr = (NTTERNIMATEPROCESS)RealServiceAddress;
//开启SSDT 表为可写
_asm
{
cli;
mov eax, cr0;
and eax, not 10000h;
mov cr0, eax;
}
*((ULONG*)Address) = (ULONG)MyNtTerminateProcess; //替换为我们自己的NtTerminateProcess函数
//设置SSDT表位只读
_asm
{
mov eax, cr0;
or eax, 10000h;
mov cr0, eax;
sti;
}
}
VOID UnHook()//把SSDT中的NtTerminateprocess函数还原
{
ULONG Address;
Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x101 * 4;
__asm
{
cli
mov eax, cr0;
and eax, not 10000h ;
mov cr0, eax ;
}
*((ULONG*)Address) = (ULONG)RealServiceAddress;
__asm
{
mov eax, cr0 ;
or eax, 10000h ;
mov cr0, eax ;
sti ;
}
}
VOID Unload(PDRIVER_OBJECT driver)
{
UNREFERENCED_PARAMETER(driver);
UnHook();
DbgPrint(("EXIT..."));
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING str)
{
NTSTATUS status;
UNREFERENCED_PARAMETER(str);
driver->DriverUnload = Unload;
status = Hook();
return STATUS_SUCCESS;
}
http://pan.baidu.com/share/link?shareid=511868&uk=3895950538 |
|