детект сканирования памяти процесса

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by sn0w, 25 Mar 2020.

  1. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    989
    Likes Received:
    1,109
    Reputations:
    327
    идея индея, да и крякми или что это было я хз.
    вообщем суть такова, - когда память вашего процесса ктото сканит, например читэнджина, в простом случае это можно задетектить (если там не через дрова режим), т.к. области памяти будут подгружаться в озу и соответственно попадать в список рабочего набора процесса, а если мы точно знаем что у нас есть такие, которых в этом списке быть не должно - значит ктото кудато не туда полез.

    Code:
    #include <windows.h>
    
    #pragma comment(linker, "/ENTRY:start")
    
    
    extern "C" __declspec(dllimport) NTSTATUS WINAPI ZwQueryInformationProcess(HANDLE,DWORD,PVOID,ULONG,PULONG);
    extern "C" __declspec(dllimport) NTSTATUS WINAPI ZwSetInformationProcess(HANDLE,DWORD,PVOID,ULONG);
    extern "C" __declspec(dllimport) NTSTATUS WINAPI ZwQueryVirtualMemory(HANDLE,PVOID,DWORD,PVOID,SIZE_T,PSIZE_T);
    
    
    LPVOID g_WSMemList[16384];   // .bss
    
    
    void initialize(void)
    {
       /*
        typedef struct _QUOTA_LIMITS {
           SIZE_T PagedPoolLimit;
           SIZE_T NonPagedPoolLimit;
           SIZE_T MinimumWorkingSetSize;
           SIZE_T MaximumWorkingSetSize;
           SIZE_T PagefileLimit;
           LARGE_INTEGER TimeLimit;
       } QUOTA_LIMITS, *PQUOTA_LIMITS;
       */
    
      NTSTATUS st;
      DWORD parambuf[8];
     
                        /* ProcessQuotaLimits */
      st = ZwQueryInformationProcess((HANDLE)-1, 1, parambuf, sizeof(parambuf), 0);
      if (st == 0) {
        parambuf[2] = 0xffffffff;
        parambuf[3] = 0xffffffff;
                        /* ProcessQuotaLimits */
        ZwSetInformationProcess((HANDLE)-1, 1, parambuf, sizeof(parambuf));
      }
      return;
    }
    
    
    bool find_address(LPVOID addr)
    {
      int cntr;
                                               /* MemoryWorkingSetList */
      if ( ZwQueryVirtualMemory((HANDLE)-1, 0, 1, g_WSMemList, sizeof(g_WSMemList), 0) )
        return false;
    
      cntr = (int)g_WSMemList[0];
      while ((SIZE_T)addr != ((SIZE_T)g_WSMemList[cntr] & 0xFFFFF000))
      {
        if ( !--cntr )
          return false;
      }
      return true;
    }
    
    
    void start()
    {
      LPVOID testalloc;
     
      AllocConsole();
      testalloc = (LPVOID)VirtualAlloc(0, sizeof(void*), 4096, 4); // вот это трогать нельзя, если оно попало список - значит ктото сюда обращался. а это палево.
     
      initialize();
     
      
      do
        Sleep(100);
      while ( !find_address(testalloc) );
    // сканер спалился
      MessageBoxA(0, "CYKA BLYAT!", 0, 0);
      ExitProcess(0);
    }
    
     
  2. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    531
    Likes Received:
    5,917
    Reputations:
    15
    А авер ? Он кстати читает нынче в контексте своего родного процесса или текущего ?
    Ибо ничто ему не мешает туда полезть посканить и подгрузить страницу вроде. Тоесть будет срабатывать чуть менее чем у всех сей детектор.
     
Loading...