这个也是我看教学视频有感而发 其实也没有做什么东西 就是做了一个exe 然后有四个功能
1. 保护进程
2.去掉保护
3.杀死进程
4.获取运行进程的信息
其实这四个 里面 第一个 第二个都是和驱动配合得出来的 然后 我先说第三个 第三个杀死进程其实 很简单
bool killprocess(int pid)
{
HANDLE hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,pid);
if(hProcess==NULL)
{
return false;
}
if(!TerminateProcess(hProcess,0))
return false;
return true;
}
杀死进程也就先打开进程 然后 获得进程的句柄 然后再用TerminateProcess 然后杀死进程 我们 可以从两点入手
第一点 直接hook OpenProcess 第二点 hook TerminateProcess 然后我们是 hook OpenProcess 直接句柄返回为空 具体的驱动 hook 是这样的
if (PID == MyPID)
{
KdPrint(("被保护进程 MyPID=%d \n", (int)MyPID));
//调试输出 类似C语言的 Printf
ProcessHandle = NULL; //这个是关键
rc = STATUS_ACCESS_DENIED; //这个返回值
//PsLookupProcessByProcessId((ULONG)PID,&EP);
EP = PsGetCurrentProcess();
KdPrint((" ACESS Process Name --:%s-- \n", (PTSTR)((ULONG)EP + 0x174)));
他是缓冲区 传递我们想保护的pid 然后得出 NtOpenProcess函数的地址 那么 我们可以把地址换成我们的地址 也可以为了保险 直接跳转到 KeServiceDescriptorTable 的地址 然后我们就可以 看出被hook 然后 这就可以了 至于枚举进程 其实r3 和r0 好像没有什么区别。。
BOOL bOk = Process32First(ToolHelpHandle, &ProcessEntry32);
while (bOk)
{
process_num[sum].pid=ProcessEntry32.th32ProcessID;
strcpy(process_num[sum].name,ProcessEntry32.szExeFile);
process_num[sum].flag=true;
sum++;
printf("PID:\t0x%X,", ProcessEntry32.th32ProcessID);
printf("\tName:\t%s\r\n", ProcessEntry32.szExeFile);
bOk = Process32Next(ToolHelpHandle, &ProcessEntry32);
}
CloseHandle(ToolHelpHandle);
ToolHelpHandle = INVALID_HANDLE_VALUE;
哦 对了 不要忘了 hook的时候去掉页面保护
__asm //去掉页面保护
{
cli
mov eax, cr0
and eax, not 10000h //and eax,0FFFEFFFFh
mov cr0, eax
}
__asm
{
mov eax, cr0
or eax, 10000h
mov cr0, eax
sti
}
代码 写的太乱了 也就不放代码了 就放一下 程序截图吧 控制台程序 哈哈哈