Всем доброго времени суток.На днях мне стукнуло пару тройку людей в асику с целью что бы я объяснил как делаются билдеры каких либо прог.На словах оно конечно не оч ясно,по этому я решил сделать микро-статейку.
Билдер будет простой, для наглядности с messagebox-ом.
Приступим.
Напишем для начала наш билд.Писать можно на любом языке,я буду на масме.
Билд есть.Суть билдера будет в том что бы изменять нужные данные (заголовок и сообщение) билда.Это будет делаться с помощью замены байтов.Как узнать нужные байты?Берем hiew или любой хекс редактор который Вам по душе и открываем в нем наш билд.Ищем выводимые строки.
записываем нужные байты.Теперь нам нужно сделать ресурс.Создаем новый текстовый файл с расширением *.rс в нем пишем например:FILE1 EXEFILE NEW.EXE
где new.exe- наш билд.Теперь нужно скомпилировать ресурс.Это можно сделать любым компилятором ресурсов,можно взять тот что в delphi brcc32.exe.
кидаем на него файл rс и получаем файл *.res. Данный ресурс мы прилинкуем в наш билдер (билдер пишем на делфи) таким образом:
{$R Res.res} вписав это перед implementation, где res.res- имя вашего файла ресурсов.Далее следует код билдера.Алгоритм создания билда таков:
1)Извлечь из ресурсов наш первоначальный билд
2)Пропатчить необходимые байты
3)Переименовать билд в заданное имя.
Итак код билдера:
Вот собсно и все.Простенький билдер готов.Сильно не пинайте.Взять все готовое мона тута: http://splashed.ucoz.ru/builder.rar спс за внимание.
Билдер будет простой, для наглядности с 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 спс за внимание.
В асм проге бы оставил больше места под данные, байт 512 хотя бы.
ОтветитьУдалитьпросто объявив массив нулей.
Листинг на delphi, для меня страшен :)
можно было через ресурсы.я чутка поизвращался:)
ОтветитьУдалить