Общее·количество·просмотров·страницы

воскресенье, 20 ноября 2011 г.

Билдер на delphi

Всем доброго времени суток.На днях мне стукнуло пару тройку людей в асику с целью что бы я объяснил как делаются билдеры каких либо прог.На словах оно конечно не оч ясно,по этому я решил сделать микро-статейку.
Билдер будет простой, для наглядности с messagebox-ом.
Приступим.
Напишем для начала наш билд.Писать можно на любом языке,я буду на масме.

.386
.model flat, stdcall
option casemap:none

include include\windows.inc
include include\kernel32.inc
include include\user32.inc
include include\shell32.inc

includelib lib\shell32.lib
includelib lib\user32.lib
includelib lib\kernel32.lib

.data
cap db 'MSG',0
msg db 'Hello!',0

start:
invoke MessageBox,0,addr msg,addr cap,0
invoke ExitProcess,0

end start

Билд есть.Суть билдера будет в том что бы изменять нужные данные (заголовок и сообщение) билда.Это будет делаться с помощью замены байтов.Как узнать нужные байты?Берем hiew или любой хекс редактор который Вам по душе и открываем в нем наш билд.Ищем выводимые строки.


записываем нужные байты.Теперь нам нужно сделать ресурс.Создаем новый текстовый файл с расширением *.rс в нем пишем например:FILE1 EXEFILE NEW.EXE
где new.exe- наш билд.Теперь нужно скомпилировать ресурс.Это можно сделать любым компилятором ресурсов,можно взять тот что в delphi brcc32.exe.
кидаем на него файл rс и получаем файл *.res. Данный ресурс мы прилинкуем в наш билдер (билдер пишем на делфи) таким образом:
{$R Res.res} вписав это перед implementation, где res.res- имя вашего файла ресурсов.Далее следует код билдера.Алгоритм создания билда таков:
1)Извлечь из ресурсов наш первоначальный билд
2)Пропатчить необходимые байты
3)Переименовать билд в заданное имя.
Итак код билдера:

var
  Form1: TForm1;
  m:array[1..6]of integer; // массив байтов сообщения
  c:array[1..3]of integer; // массив байтов заголовка
  
implementation

{$R *.dfm}
{$R res.res} // прилинкованный файл ресурсов
procedure TForm1.Button1Click(Sender: TObject);
var fn,msg,cap:string;
ch:byte;
BR:dword;
h:Thandle;
Res:TResourceStream;
begin

m[1]:=$404; // массив байтов заполняем нужными байтами
m[2]:=$405;
m[3]:=$406;
m[4]:=$407;
m[5]:=$408;
m[6]:=$409;

c[1]:=$400;
c[2]:=$401;
c[3]:=$402;

fn:=edit1.Text;  //тут имя билда
msg:=edit2.Text; //тут сообщение 
cap:=edit3.Text; // заголовок

Res:=TResourceStream.Create(HInstance,'FILE1','EXEFILE');
Res.SaveToFile(ExtractFilePath(Application.ExeName)+'new.exe');
Res.Free; // извлекаем файл из ресурсов

h:=fileopen('new.exe',fmopenwrite); // открываем на запись

ch:=ord(char(pchar(msg[1]))); // берем первый символ, преобразовавши его в его код.
setfilepointer(h,m[1],nil,0);  // указываем позицию в файле
writefile(h,ch,sizeof(ch),br,nil); // заменяем байт. т.д.

ch:=ord(char(pchar(msg[2])));
setfilepointer(h,m[2],nil,0);
writefile(h,ch,sizeof(ch),br,nil);

ch:=ord(char(pchar(msg[3])));
setfilepointer(h,m[3],nil,0);
writefile(h,ch,sizeof(ch),br,nil);

ch:=ord(char(pchar(msg[4])));
setfilepointer(h,m[4],nil,0);
writefile(h,ch,sizeof(ch),br,nil);

ch:=ord(char(pchar(msg[5])));
setfilepointer(h,m[5],nil,0);
writefile(h,ch,sizeof(ch),br,nil);

ch:=ord(char(pchar(msg[6])));
setfilepointer(h,m[6],nil,0);
writefile(h,ch,sizeof(ch),br,nil);

ch:=ord(char(pchar(cap[1])));
setfilepointer(h,c[1],nil,0);
writefile(h,ch,sizeof(ch),br,nil);

ch:=ord(char(pchar(cap[2])));
setfilepointer(h,c[2],nil,0);
writefile(h,ch,sizeof(ch),br,nil);

ch:=ord(char(pchar(cap[3])));
setfilepointer(h,c[3],nil,0);
writefile(h,ch,sizeof(ch),br,nil);

closehandle(h);
renamefile('new.exe',fn); // переименовуем файл.
end;

end.

Вот собсно и все.Простенький билдер готов.Сильно не пинайте.Взять все готовое мона тута: http://splashed.ucoz.ru/builder.rar спс за внимание.

2 комментария:

  1. В асм проге бы оставил больше места под данные, байт 512 хотя бы.

    просто объявив массив нулей.

    Листинг на delphi, для меня страшен :)

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

    ОтветитьУдалить