Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Exe joiner 
:(
    Опции темы
mysteriouskiller
Дата 20.4.2006, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.1.2006

Репутация: нет
Всего: нет



Собственно, сабж: может кто знает где взять сорцы или владеет таким добром ? Поделитесь пожалуйста! Очень нужно.. 
PM MAIL   Вверх
Snowy
Дата 20.4.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Берешь код: http://forum.vingrad.ru/index.php?showtopi...st&p=558855
Создаешь программу.
Запихиваешь ей в ресурсы нужные ехешники.
Запускаешь эти ресурсы при помощи данного кода. 
PM MAIL   Вверх
mysteriouskiller
Дата 20.4.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.1.2006

Репутация: нет
Всего: нет



проблема собственно вот в чем smile
я так понимаю здесь ресурсы создаются с помощью brcc32.exe
а мне нужно чтобы сама моя программа имела процедурку для самозаписи в PE файл..
т.е. таскать за собой brcc32.exe конечно не хочется 
в общем все выглядит так - программа ищет в папке .exe файлы и вшивается в них..

 
PM MAIL   Вверх
Snowy
Дата 20.4.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(mysteriouskiller @  20.4.2006,  14:21 Найти цитируемый пост)
я так понимаю здесь ресурсы создаются с помощью brcc32.exe
Не обязательно. Можно вставлять в уже готовый exe: http://forum.vingrad.ru/index.php?showtopi...st&p=145090 
PM MAIL   Вверх
Rouse_
Дата 20.4.2006, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



А смысл? Ну поместишь ты свою программу в ресурсы стороннего ПО, а куда будешь код ложить чтобы извлекал ее из ресурса и запускал?
Помещение в ресурс делается вот так: 

Код

  procedure ExportData(Path, AName, AType: String; Data: TFileStream); overload;
  var
    hFile: HWND;
    Buf: array of Byte;
  begin
    hFile := BeginUpdateResource(PChar(Path), False);
    try
      if hFile = 0 then
      begin
        RaiseLastOSError;
      end;
      SetLength(Buf, Data.Size);
      Data.Position := 0;
      Data.Read(Buf[0], Data.Size);
      if not UpdateResource(hFile, PChar(AType), PChar(AName),
        0, @Buf[0], Data.Size) then RaiseLastOSError;    
      Finalize(Buf);
    finally
      EndUpdateResource(hFile, False);
    end;
  end;


Пример вызова: 

Код

          Data := TFileStream.Create('c:\1.txt', fmOpenRead);
          try
            ExportData('c:\test.exe', 'test', 'sometype', Data);
          finally
            Data.Free;
          end;


 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
mysteriouskiller
Дата 20.4.2006, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.1.2006

Репутация: нет
Всего: нет



Нет-нет ребятки, вы меня не поняли (а, это я виноват, криво объясняю)  smile 
Мне нужно чтобы после записи в целевой екзе, при его запуске запускались обе программы,
и которая там была изначально, и которую я прикрепил _самостоятельно_
Это вообще реально ? А то я немного почитал про PE файлы и огорчился - неужели придется таскать за собой компилер.. 
PM MAIL   Вверх
Poseidon
Дата 20.4.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Что-то это не добра попахтвает

Цитата(mysteriouskiller @  20.4.2006,  13:21 Найти цитируемый пост)
программа ищет в папке .exe файлы и вшивается в них

Цитата(mysteriouskiller @  20.4.2006,  14:55 Найти цитируемый пост)
Мне нужно чтобы после записи в целевой екзе, при его запуске запускались обе программы,


Ну раз модераторы не против этой темы, то чтож сделать, держи. 

Присоединённый файл ( Кол-во скачиваний: 119 )
Присоединённый файл  Joiner.rar 9,79 Kb


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Snowy
Дата 20.4.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



1. Тебе нужно собрать EXE, который будет доставать из своих ресурсов файлы и запускать их при помощи кода по первой ссылке.
2. Делается вторая программа в которую первый ехе запихивается при компиляции. Она:
 - Сохраняет первый ехе из ресурсов на диск.
- При помощи кода по второму линку, запихивает ему в ресурсы нужные ехешники.
 
PM MAIL   Вверх
mysteriouskiller
Дата 20.4.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.1.2006

Репутация: нет
Всего: нет



Цитата

2. Делается вторая программа в которую первый ехе запихивается при компиляции. Она:


Вот!  smile  А без компиляции ? Без компилера это можно сделать ? Просто программно открыть .exe и записать туда еще один екзе. И чтобы потом всё запустилось. 
PM MAIL   Вверх
RA
Дата 20.4.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Заходиш на torry.net и ищеш там слово "MultiBinder" джойнеры отдыхают smile 
PM   Вверх
mysteriouskiller
Дата 20.4.2006, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.1.2006

Репутация: нет
Всего: нет



Radmin
smile 
 smile 
Спасибо, дружище!
 
PM MAIL   Вверх
Nickel
Дата 23.4.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 7.2.2006

Репутация: 2
Всего: 4



Вот немного черновая версия моей статьи, коментарии желательны:
Код

Пишем склеиватель на делфи
Склеиватель, он же joiner, он же binder – программа позволяющая соединить 2 или более файлов в 1 обычно для маскировки какого-либо из них.
В состав виндовского исполняемого файла  может входить часть незагружаемая в память, которая называется оверлеем. Оверлей располагается в конце исполняемого файла. Именно этот оверлей мы и будем использовать чтобы, чтобы «склеить файлы». Результат нашего склеивания будет выглядеть примерно так:
Stub, отклеивающий от себя файлы
0 – показывающий что дальше идёт stub.
1-ый приклеенный файл
Размер 1-ого приклеенного файла

n-ый приклеенный файл
Размер n-ого приклеенного файла
Дабы было удобнее расклеивать, начинать мы будем с конца, т.е. сначала читаем размер n-ого файла, распаковываем его  и т.д. пока не встретим 0.
Чтобы уменьшить размер получаемого stub’а, нам придётся отказать от такой удобной вещи как TFileStream и вспомнить страрые добрые паскалевские процедуры:
AssignFile - Назначает имя внешнего файла  для файловой переменной, для работы с ним
BlockRead - Читает одну или более записей из нетипизированного файла
BlockWrite - Пишет одну или более записей в нетипизированный файл
CloseFile - Закрывает открытый файл
Reset - Открывает существующий файл
Rewrite - Создает и открывает существующий файл
Seek - Перемещается к указанной записи в типизированном или нетипизированном файле
FileSize - Возвращает размер файла
Приступим к изготовлению binder’а. Для этого нам потребуются 3 кнопки (RunBtn, AddBtn и DelBtn), Edit, Listbox, SaveDialog и OpenDialog. При нажатии AddBtn будем добавлять файлы для склеивания в Listbox:
begin
if opendialog.Execute then
  begin
  listbox.Items.Add(opendialog.FileName);
  end;
end;
При нажатии DelBtn удалять их оттуда:
begin
ListBox.DeleteSelected;
end;
Рассмотрим процедуру сохранения файла оверлеем:
procedure SaveToFile(const FromFileName,ToFileName: string);
var
  FromF, ToF: file;
  NumRead, NumWritten,Size: LongInt;
  Buf: array[1..2048] of Byte;
begin
  try
    {Открываем файлы на чтение и запись с размером записи 1 байт}
    AssignFile(FromF,FromFileName);
    Reset(FromF, 1);
    AssignFile(ToF,ToFileName);
    Reset(ToF, 1);
    Size:=filesize(FromF); //Получаем размер приклеиваемого файла 
    Seek(ToF,filesize(ToF)); //Перемещаемся в конец файла, к которому приклеиваем
{ Записываем приклееваемый файл оверлеем}
      repeat
        BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
        BlockWrite(ToF, Buf, NumRead, NumWritten);
      until (NumRead = 0) or (NumWritten <> NumRead);
{и записываем его размер}
    blockwrite(ToF,Size,sizeof(longint));
  finally
{Закрываем файлы}
    CloseFile(FromF);
    CloseFile(ToF);
  end;
end;
И наконец, принажатии на RunBtn приклеиваем все файлы из ListBox’а к stub’у в edit’е:
var i:longint;
    f:file;
begin
if savedialog.Execute then
  begin
    {копируем stub}
    copyfile(PChar(edit.Text),PChar(savedialog.FileName),False);
    {Приписываем 0 означающий, что дальше идёт stub}
    i:=0;
    assignfile(F,savedialog.FileName);
    reset(F,1);
    seek(F,filesize(F));
    blockwrite(F,i,4);
    closefile(f);
   {Клеим}
    for i:=0 to listbox.Items.Count-1 do
      savetofile(listbox.Items.Strings[i], savedialog.FileName);
  end;
end;
Теперь займёмся stub’ом. Чтобы максимально уменьшить размер stub’а будем использовать только модуль Windows, поэтому нам необходимо скопировать некоторые функции из модулей Math и SysUtils. Основная часть стуба выглядит следующим образом:

function LoadFromFile(const FromFileName, ToFileName: string;
 StartPos: Longint; var EndPos: Longint): Boolean;
var
 FromF, ToF: file;
 NumRead, NumWritten, Size, i: LongInt;
 Buf: array[1..2048] of Byte;
begin
 Result := False;
 try
   AssignFile(FromF, FromFileName); //связываем файловую переменную с файлом
   ReSet(FromF, 1);                 //открываем файл, из которого будем читать
   Seek(FromF, StartPos - 4);       //ищём размер последнего склееного файла
   BlockRead(FromF, Size, 4);       //считываем этот размер
   if Size = 0 then                 //если дальше stub
   begin
     Result := True;                //то сообщаем об удачности функции
     Exit;                          //и выходим
   end;
   AssignFile(ToF, ToFileName);     //связываем файловую переменную с файлом
   ReWrite(ToF, 1);                 //создаём новый файл и открываем его
   EndPos := StartPos - 4 - Size;   //начало файла
   Seek(FromF, EndPos);             //(или конец с обратной стороны :)
   for i := 1 to Ceil(Size/SizeOf(Buf)) do      //копируем
   begin
     BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
     BlockWrite(ToF, Buf, NumRead, NumWritten);
   end;
   Seek(ToF,Size);
   Truncate(ToF);                   //лишнее обрезаем
 finally
   CloseFile(FromF);                //закрываем файлы
   CloseFile(ToF);
 end;
end;
var Pos,l: Longint;
 F: file;
 Temp, TempFile:  string;
 Buffer: array[0..255] of Char;
 Stop: Boolean;
begin
 l:=0;                                //на всякий случай послушаемся компилятор :)
 GetTempPath(SizeOf(Buffer), Buffer); //ищём путь к директории Temp, обычно это
 Temp := Buffer;                      //C:\Documents and Settings\имя пользователя\Local Settings\Temp
 Temp:=Temp+'\';                      //добавляем бэкслеш
 TempFile := Temp + 'Temp.~exe';      //временный файл, который будем расклеивать
 CopyFile(PChar(paramstr(0)),         //скопируем себя любимого в этот файл
     PChar(TempFile), false);         //в Temp'е
 AssignFile(F, TempFile);             //связываем файловую переменную с файлом
 ReSet(F, 1);                         //открываем файл
 Pos := FileSize(F);                  //узнаём его размер
 CloseFile(F);                        //закрываем файл
 repeat
   l:=l+1;
   Stop:=LoadFromFile(TempFile, Temp +   //"отклееваем"
        IntToStr(l) + '.exe', Pos, Pos);
   if not stop then WinExec(PChar(Temp + //"отклеенный" извлечённый файл
       IntToStr(l) + '.exe'), SW_NORMAL);
 until Stop;                             //пока размер следующего
                                         //файла не станет равным 0
 DeleteFile(PChar(TempFile));            //удалим временный файл
end.

 
PM   Вверх
Poseidon
Дата 23.4.2006, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Nickel, оформи получше. Читать трудно 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Nickel
Дата 24.4.2006, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 7.2.2006

Репутация: 2
Всего: 4



Поместил на сайт друга http://senselogic.jino-net.ru/coding/delph...=joiner.php.htm Тока сайтик ещё немнога недоделан...
offtop: если кто-нибудь захочет присоединиться к нам или поместить статью милости просим. 
PM   Вверх
epoul
Дата 25.4.2006, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 25.4.2006

Репутация: нет
Всего: нет



А у меня другая проблема. Можно ли сформировать ЕХЕ-шник в память и оттуда запустить его. Например, из prog.exe делается unit   prog.pas, он добавлятся в другой проект, компилится, допустим в prog1.exe.  При запуске prog1.exe из него формируется prog.exe, но не на диск, а в память, и запускается на выполнение.  Такое вообще возможно?   
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1140 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.