HOOK SwapContext 枚举隐藏进程(学习笔记4)(2)

下面是主要代码

 

01 DWORD gThreadsProcessOffset =0x220;    // ETHREAD 在 EPROCESS偏移
02 /*
03  
04 +0x218 TopLevelIrp      : Uint4B
05 +0x21c DeviceToVerify   : Ptr32 _DEVICE_OBJECT
06 +0x220 ThreadsProcess   : Ptr32 _EPROCESS
07 */
08  
09 ULONG ProcessNameOffset = 0x174;      // 进程对应的文件名 在 EPROCESS偏移
10 /*
11 +0x170 Session          : Ptr32 Void
12 +0x174 ImageFileName    : [16] UChar
13 +0x184 JobLinks         : _LIST_ENTRY
14 */
15  
16 PProcessList wLastItem = NULL;       
17 int BeTerminate = 0;                  //1 表示线程必须要停止  3表示线程不是PENDING状态  0表示线程可以正常运行
18  
19 void _stdcall CollectProcess(PEPROCESS pEPROCESS)  // 搜集EPROCESS
20 {
21   if (!IsAdded(wLastItem, pEPROCESS)) AddItem(&wLastItem, pEPROCESS);
22   return;
23 }
24  
25 void __stdcall ThreadCollect(PUCHAR pEthread)   //根据ETHREAD得到EPROCESS 并调用CollectProcess来搜集
26 {
27   PEPROCESS pEprocess = *(PEPROCESS *)(pEthread + gThreadsProcessOffset);
28   if (pEprocess) CollectProcess(pEprocess);
29   return;
30 }
31  
32  
33 DWORD outPEthread = 0;
34 void __stdcall ProcessData(DWORD pInEthread, DWORD pOutEthread)
35 {
36   DWORD pid, eprocess;
37   char * pname;
38   if (MmIsAddressValid(PVOID(pInEthread+0x220)) )   
1 // 这里以及下面要判断是不是一个真正的 Ethread 结构体 有时好像调用SwapContext传进来的不是 
001 //Ethread 结构体 然后就蓝屏 具体没有深究 加个判断就不蓝了~
002   {
003     eprocess = *(DWORD*)(pInEthread+0x220);
004      
005     if (MmIsAddressValid(PVOID(eprocess) ) )
006     {
007       ThreadCollect((PUCHAR)pInEthread);
008     }
009      
010   }
011 }
012  
013  
014  
015 PBYTE GoBackAddr = NULL;
016 PBYTE ChangAddr = NULL;
017  
018 DWORD CallContextOffset = 0;
019  
020 __declspec(nakedVOID HookSwap()
021 {
022  
023   _asm
024   {
025     pushad
026       pushfd
027       cli
028   }
029  
030   _asm
031   {
032        // EDI 是换出的线程上下文
033          push edi
034       //ESI 是换入的线程上下文
035       push esi
036       call ProcessData   //搜集进程
037   }
038    
039   _asm
040   
041     sti
042       popfd
043       popad
044   }
045   _asm jmp DWORD PTR[GoBackAddr]
046 }
047  
048 /*
049 得到SwapContext地址的原理是
050 用PsLookupThreadByThreadId得到Idle System的KTHREAD
051 res=(PCHAR)(Thread->Tcb.KernelStack);
052 SwapAddr=*(DWORD *)(res+0x08);
053 */
054 PCHAR GetSwapAddr()
055 {
056   PCHAR res = 0;
057   NTSTATUS  Status;
058   PETHREAD Thread;
059    
060   if (*NtBuildNumber <= 2195)
061     Status = PsLookupThreadByThreadId((PVOID)4, &(PETHREAD)Thread);
062   else
063     Status = PsLookupThreadByThreadId((PVOID)8, &(PETHREAD)Thread);
064    
065   if (NT_SUCCESS(Status))
066   {
067     if (MmIsAddressValid(Thread))
068     {
069       res = (PCHAR)(Thread->Tcb.KernelStack);
070  
071     }
072     if (MmIsAddressValid(res+8))
073     {
074       _asm
075       {
076         mov eax,res
077

你可能感兴趣的:(HOOK SwapContext 枚举隐藏进程(学习笔记4)(2))