// вы читаете...

Новости

Заметки о installer. Часть 2



done1:=mem.Read(buf,sizeof(buf));
blockwrite(f,buf,done1);
done:=done+done1;
end;
if i>done then begin
done1:=mem.Read(buf,i-done);
blockwrite(f,buf,done1);
end;
CloseFile(f);

mem.Free;
end.

Одним из самых простых и эффективных методов работы с .exe файлами являются потоки. Тут всё
просто. Сначала мы создаём поток, затем загружаем в него исполняемый файл. Далее следует очень
важная строчка:

mem.Seek(c,soFromBeginning);

Константа «с» является размером анпакера. Значение 117248 было получено эксперементальным путём.
Для этого компилим анпакер и смотрим его ТОЧНЫЙ (а не занимаемый) размер. Его-то и присвайваем «c».
Далее мы считываем размер первого файла. Затем циклом копируем его содержимое «Temp1». Аналогично
поступаем со вторым файлом. На выходе получаются два файла, которые мы дописали пакером в анпакер.
Чем хорош этот анпакер? Первое и самое главное это то, что весь файл загружается в ОЗУ и извлечение
происходит на максимальной скорости. Теперь чем он плох. Во первых размером. Поэтому его нельзя
использовать для распаковки трояна и какой-нибудь игрушки (код запуска обоих можно добавить в самый конец
(WinExec)). Так же, раз всё загружается в память, то её может не хватить (а то зашьешь в анпакер два файла
по 400 метров :).
Можно пойти другим путём — использовать стандартные Delphi’ковские FileOpen, FileRead and so on :).
Вот исходник:

program Unpacker;

uses
SysUtils;

const c=41984;

var h:integer;
mas:array[1..2048] of byte;
f:file;
i,done1:integer;
done:integer=0;

begin
h:=FileOpen(paramstr(0),fmOpenRead or fmShareDenyWrite);
FileSeek(h,c,0);
FileRead(h,i,sizeof(i));
assignfile(f,’temp1′);
rewrite(f,1);
while i>=done+2048 do begin
done1:=FileRead(h,mas,sizeof(mas));
blockwrite(f,mas,done1);
inc(done,done1);
end;
if i>done then begin
done1:=fileread(h,mas,i-done);
blockwrite(f,mas,done1);
end;
CloseFile(f);
done:=0;
FileRead(h,i,sizeof(i));
assignfile(f,’temp2′);
rewrite(f,1);
while i>=done+2048 do begin
done1:=FileRead(h,mas,sizeof(mas));
blockwrite(f,mas,done1);
inc(done,done1);
end;
if i>done then begin
done1:=fileread(h,mas,i-done);
blockwrite(f,mas,done1);

Страницы: 1 2 3

Обсуждене

Отзывов нет на «Заметки о installer. Часть 2»

Ваш отзыв

Рубрики