免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

EnumCallback

  1. #pragma once
  2. #include "common.h"

  3. #define PSP_MAX_CREATE_PROCESS_NOTIFY 8

  4. typedef
  5. VOID
  6. (*PCREATE_PROCESS_NOTIFY_ROUTINE)(
  7.                                   IN HANDLE ParentId,
  8.                                   IN HANDLE ProcessId,
  9.                                   IN BOOLEAN Create
  10.                                   );

  11. typedef PVOID
  12. (*PFN_ExReferenceCallBackBlock) (
  13.                           IN OUT PVOID CallBack
  14.                           );

  15. typedef PVOID
  16. (*PFN_ExGetCallBackBlockRoutine) (
  17.                            IN PVOID CallBackBlock
  18.                            );

  19. typedef PVOID
  20. (*PFN_ExDereferenceCallBackBlock) (
  21.                             IN OUT PVOID CallBack,
  22.                             IN PVOID CallBackBlock
  23.                             );

  24. ULONG GetPspCreateProcessNotifyRoutineAddr();

  25. ULONG GetExReferenceCallBackBlockAddr();

  26. ULONG GetExGetCallBackBlockRoutineAddr();

  27. ULONG GetExDereferenceCallBackBlockAddr();

  28. BOOLEAN EnumProcessCallBack();
复制代码
  1. #include "StdAfx.h"
  2. #include "EnumCallback.h"

  3. ULONG g_PspCreateProcessNotifyRoutine = NULL;
  4. ULONG g_ExReferenceCallBackBlock = NULL;
  5. ULONG g_ExGetCallBackBlockRoutine = NULL;
  6. ULONG g_ExDereferenceCallBackBlock = NULL;

  7. ULONG GetPspCreateProcessNotifyRoutineAddr()
  8. {
  9.     ULONG uPsSetCreateProcessNotifyRoutineAddr = (ULONG)PsSetCreateProcessNotifyRoutine;

  10.     //nt!PsSetCreateProcessNotifyRoutine:
  11.     //8062e77e 8bff            mov     edi,edi
  12.     //8062e780 55              push    ebp
  13.     //8062e781 8bec            mov     ebp,esp
  14.     //8062e783 53              push    ebx
  15.     //8062e784 33db            xor     ebx,ebx
  16.     //8062e786 385d0c          cmp     byte ptr [ebp+0Ch],bl
  17.     //8062e789 56              push    esi
  18.     //8062e78a 57              push    edi
  19.     //8062e78b 7465            je      nt!PsSetCreateProcessNotifyRoutine+0x74 (8062e7f2)
  20.     //8062e78d bfe0245680      mov     edi,offset nt!PspCreateProcessNotifyRoutine (805624e0)
  21.     //8062e792 57              push    edi
  22.     //8062e793 e8487d0100      call    nt!ExReferenceCallBackBlock (806464e0)
  23.     //8062e798 8bf0            mov     esi,eax
  24.     //8062e79a 85f6            test    esi,esi
  25.     PUCHAR pTemp = (PUCHAR)uPsSetCreateProcessNotifyRoutineAddr;

  26.     for (int i = 0; i < 0x50; i++)
  27.     {
  28.         if (*(pTemp-3) == 0x74 &&
  29.             *(pTemp-1) == 0xbf &&
  30.             *(pTemp+4) == 0x57 &&
  31.             *(pTemp+5) == 0xe8)
  32.         {
  33.             //DbgPrint("PspCreateProcessNotifyRoutine Addr: 0x%x\n", pTemp);
  34.             g_PspCreateProcessNotifyRoutine = *(PULONG)pTemp;
  35.             return *(PULONG)pTemp;
  36.         }

  37.         pTemp++;
  38.     }

  39.     return NULL;
  40. }

  41. ULONG GetExReferenceCallBackBlockAddr()
  42. {
  43.     //8062e78b 7465            je      nt!PsSetCreateProcessNotifyRoutine+0x74 (8062e7f2)
  44.     //8062e78d bfe0245680      mov     edi,offset nt!PspCreateProcessNotifyRoutine (805624e0)
  45.     //8062e792 57              push    edi
  46.     //8062e793 e8487d0100      call    nt!ExReferenceCallBackBlock (806464e0)
  47.     //8062e798 8bf0            mov     esi,eax
  48.     //8062e79a 85f6            test    esi,esi
  49.     //8062e79c 741f            je      nt!PsSetCreateProcessNotifyRoutine+0x3f (8062e7bd)
  50.     //8062e79e 56              push    esi

  51.     ULONG uPsSetCreateProcessNotifyRoutineAddr = (ULONG)PsSetCreateProcessNotifyRoutine;

  52.     PUCHAR pTemp = (PUCHAR)uPsSetCreateProcessNotifyRoutineAddr;

  53.     ULONG uAddr = NULL;

  54.     for (int i = 0; i < 0x50; i++)
  55.     {
  56.         if (*(pTemp-2) == 0x57 &&
  57.             *(pTemp-1) == 0xe8 &&
  58.             *(pTemp+4) == 0x8b &&
  59.             *(pTemp+5) == 0xf0)
  60.         {
  61.             uAddr = *(PULONG)pTemp + (ULONG)(pTemp-1) + 5;
  62.             g_ExReferenceCallBackBlock = uAddr;
  63.             DbgPrint("ExReferenceCallBackBlock Addr: 0x%x\n", uAddr);
  64.             return uAddr;
  65.         }

  66.         pTemp++;
  67.     }

  68.     return NULL;
  69. }


  70. ULONG GetExGetCallBackBlockRoutineAddr()
  71. {
  72.     //8062e798 8bf0            mov     esi,eax
  73.     //8062e79a 85f6            test    esi,esi
  74.     //8062e79c 741f            je      nt!PsSetCreateProcessNotifyRoutine+0x3f (8062e7bd)
  75.     //8062e79e 56              push    esi
  76.     //8062e79f e8ec7b0100      call    nt!IopGetRelationsTaggedCount (80646390)     ExGetCallBackBlockRoutine
  77.     //8062e7a4 3b4508          cmp     eax,dword ptr [ebp+8]
  78.     //8062e7a7 750d            jne     nt!PsSetCreateProcessNotifyRoutine+0x38 (8062e7b6)
  79.     //8062e7a9 56              push    esi
  80.     //8062e7aa 6a00            push    0
  81.     //8062e7ac 57              push    edi

  82.     ULONG uPsSetCreateProcessNotifyRoutineAddr = (ULONG)PsSetCreateProcessNotifyRoutine;

  83.     PUCHAR pTemp = (PUCHAR)uPsSetCreateProcessNotifyRoutineAddr;

  84.     ULONG uAddr = NULL;

  85.     for (int i = 0; i < 0x50; i++)
  86.     {
  87.         if (*(pTemp-2) == 0x56 &&
  88.             *(pTemp-1) == 0xe8 &&
  89.             *(pTemp+4) == 0x3b &&
  90.             *(pTemp+5) == 0x45 &&
  91.             *(pTemp+6) == 0x08)
  92.         {
  93.             uAddr = *(PULONG)pTemp + (ULONG)(pTemp-1) + 5;
  94.             g_ExGetCallBackBlockRoutine = uAddr;
  95.             DbgPrint("ExGetCallBackBlockRoutine Addr: 0x%x\n", uAddr);
  96.             return uAddr;
  97.         }

  98.         pTemp++;
  99.     }

  100.     return NULL;
  101. }




  102. ULONG GetExDereferenceCallBackBlockAddr()
  103. {
  104.     //8062e7cd b8ffffffff      mov     eax,0FFFFFFFFh
  105.     //8062e7d2 b900255680      mov     ecx,offset nt!PspCreateProcessNotifyRoutineCount (80562500)
  106.     //8062e7d7 0fc101          xadd    dword ptr [ecx],eax
  107.     //8062e7da 56              push    esi
  108.     //8062e7db 8d049de0245680  lea     eax,nt!PspCreateProcessNotifyRoutine (805624e0)[ebx*4]
  109.     //8062e7e2 50              push    eax
  110.     //8062e7e3 e82b7e0100      call    nt!ExDereferenceCallBackBlock (80646613)
  111.     //8062e7e8 56              push    esi
  112.     //8062e7e9 e8877b0100      call    nt!ExWaitForCallBacks (80646375)
  113.     //8062e7ee 33ff            xor     edi,edi

  114.     ULONG uPsSetCreateProcessNotifyRoutineAddr = (ULONG)PsSetCreateProcessNotifyRoutine;

  115.     PUCHAR pTemp = (PUCHAR)uPsSetCreateProcessNotifyRoutineAddr;

  116.     ULONG uAddr = NULL;

  117.     for (int i = 0; i < 0x100; i++)
  118.     {
  119.         if (*(pTemp-2) == 0x50 &&
  120.             *(pTemp-1) == 0xe8 &&
  121.             *(pTemp+4) == 0x56 &&
  122.             *(pTemp+5) == 0xe8)
  123.         {
  124.             uAddr = *(PULONG)pTemp + (ULONG)(pTemp-1) + 5;
  125.             g_ExDereferenceCallBackBlock = uAddr;
  126.             DbgPrint("ExGetCallBackBlockRoutine Addr: 0x%x\n", uAddr);
  127.             return uAddr;
  128.         }

  129.         pTemp++;
  130.     }

  131.     return NULL;
  132. }

  133. VOID InitNtFunction()
  134. {
  135.     if (NULL == g_ExReferenceCallBackBlock ||
  136.         NULL == g_ExGetCallBackBlockRoutine ||
  137.         NULL == g_ExDereferenceCallBackBlock ||
  138.         NULL == g_PspCreateProcessNotifyRoutine)
  139.     {
  140.         GetPspCreateProcessNotifyRoutineAddr();
  141.         GetExReferenceCallBackBlockAddr();
  142.         GetExGetCallBackBlockRoutineAddr();
  143.         GetExDereferenceCallBackBlockAddr();
  144.     }
  145. }

  146. BOOLEAN EnumProcessCallBack()
  147. {
  148.     InitNtFunction();

  149.     if (NULL == g_ExReferenceCallBackBlock ||
  150.         NULL == g_ExGetCallBackBlockRoutine ||
  151.         NULL == g_ExDereferenceCallBackBlock ||
  152.         NULL == g_PspCreateProcessNotifyRoutine)
  153.     {
  154.         return FALSE;
  155.     }

  156.     PVOID CallBack = NULL;
  157.     PVOID NotifyRoutine = NULL;

  158.     for (int i = 0; i < PSP_MAX_CREATE_PROCESS_NOTIFY; i++)
  159.     {

  160.         //
  161.         // Reference the callback so we can check its routine address.
  162.         //
  163.         CallBack = ((PFN_ExReferenceCallBackBlock)g_ExReferenceCallBackBlock) (&((PULONG)g_PspCreateProcessNotifyRoutine)[i]);

  164.         if (CallBack != NULL)
  165.         {
  166.             NotifyRoutine = ((PFN_ExGetCallBackBlockRoutine)g_ExGetCallBackBlockRoutine) (CallBack);

  167.             DbgPrint("ProcessCallBack Addr: 0x%x\n", NotifyRoutine);

  168.             ((PFN_ExDereferenceCallBackBlock)g_ExDereferenceCallBackBlock) (&((PULONG)g_PspCreateProcessNotifyRoutine)[i], CallBack);

  169.         }
  170.     }

  171.         return TRUE;
  172. }
复制代码

返回列表