Делаем простенький билдер на Delphi

Тема в разделе 'Delphi', создана пользователем XmP, 20 ноя 2011.

  1. XmP ADD ebx, 110h

    Всем доброго времени суток.На днях мне стукнуло пару тройку людей в асику с целью что бы я объяснил как делаются билдеры каких либо прог.На словах оно конечно не оч ясно,по этому я решил сделать микро-статейку.
    Билдер будет простой, для наглядности с 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.
    
    
    Вот собственно и все.Простенький билдер готов.
    ***Для просмотра ссылок необходимо войти или зарегистрироваться***
    (с) DooD
    Теги: билдер bulinder bulder на асме делфи Delphi как сделать пример кода подскажитене могу начать как соеденить два файла программа скачать пример

Поделиться этой страницей