1
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
Приветствуем вас,Гость, на форуме IFUD.WS. Обязательно рекомендуется к прочтению правила форума http://ifud.ws/threads/obnovleno-pravila-foruma.7759

Создание Build'a/Patch'a (1 вариант)

Тема в разделе "Программирование", создана пользователем Walentinka, 16 фев 2013.

  1. TopicStarter Overlay
    Walentinka

    Walentinka

    Регистрация:
    29 янв 2013
    Сообщения:
    96
    Симпатии:
    47
    Доброго времени суток форумчане!
    Сегодня освежу ваши знания по поводу создания Build'a/Patch'a, кто как называет.
    По вашей просьбе напишу небольшой материал...

    В качестве примера расмотрю программу о которой писал раньше,топик с ней : Please login or register to view links

    Функционал прост.Ждем появление флешки,проверяем на ней заданный файл, если отсутствует,копируем на неё любой файл.

    Код таймера:
    Код:
    procedure TForm1.tmr1Timer(Sender: TObject);
    var
    count,i:Integer;
    A:string;
    begin
    GetDrives;
    count:=lst1.Items.Count; //Считаем кол-во логических дисков
    If count<>0 then
    begin
      for i:=0 to count-1 do
      begin
      a:=lst1.Items;
      if FileExists(a+'^^^^^^^^^^^^^^^^^^^^')=False then
        begin
        CopyFile( '!!!!!!!!!!!!!!!!!!!!', PChar(a+'????????????????????'), True);
        end;
        end;
      lst1.Items.Clear;
    end;
    end;


    Специально выделил нужные места спец.символами чтоб их можно было найти.
    ^^^^^^^^^^^^^^^^^^^^ - Файл который ищем на флешке (1236548.txt Пример)
    !!!!!!!!!!!!!!!!!!!! - Путь до любого файла который будем копировать (D:\Program\1.exe)
    ???????????????????? - Как файл сохраниться на флешке (setup.exe)

    Метод который мы будем использовать имеет как свои плюсы так и свои минусы.
    + Заменяю строку 20 символов на 14 символьную программа будет успешно работать
    - Не удобная настройка

    Алгоритм прост:
    1.Открываем файл
    2."По байтово" заменяем символы на нужные нам.

    Чтобы узнать нужные нам байты воспользуемся WinHex'ом найти его можно на Please login or register to view links .

    После скачивания,открываем программу,в MainMenu нажимаем на Заголовок Menu,выбираем
    вкладку Open , указываем путь до скомпилированного нами '.exe' .
    Нажатием комбинации CTRL+F вбиваем ^^^^^^^^^^^^^^^^ и находим эту строку.
    Нужные три строки я сделал длиной 20 символов,их можно заменить на длину,любую,но не длинее чем ваша строка (в нашем случае 20 символов),если хотите длинее сделаете изменяемый параметр/строку на ту длину которая вас устроит.

    И так,мы нашли строку смотрим ее "код"...

    [​IMG]

    Нужная строка начинается с $53A38 до $53A4B.Запоминаем,кто не силен в этом записывает в txt файлик.Повторяем процедуру для строк !!!!! и ????.Тем кто не понял пример,подскажу,нас интересуют строки с $53A70 до $53A83, и с $53A58 до $53A6B.

    Теперь пишем сам Билдер/Патч.
    Добавляем 4 edita,1 button,4 caption.
    В едиты мы будем записывать: Имя exe которого будем изменять, строки которые заменят ^^^,!!!,???.

    Процедура для изменения/патча.

    Код:
    procedure Patching(fileName,Text:String; byte1,byte2,byte3,byte4,byte5,byte6,byte7,byte8,byte9,byte10,byte11,byte12,byte13,byte14,byte15,byte16,byte17,byte18,byte19,byte20:integer); //процедура для пропатчивания 10 байтов в файле с именем fileName, посимвольно на Text
    var f:integer;
        BytesRead:DWORD;
        c:byte;
    begin
    f:=fileopen(fileName,fmOpenReadWrite);
     
    c:=ord(char(pchar(Text[1])));
    SetFilePointer(f, byte1, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[2])));
    SetFilePointer(f, byte2, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[3])));
    SetFilePointer(f, byte3, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[4])));
    SetFilePointer(f, byte4, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[5])));
    SetFilePointer(f, byte5, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[6])));
    SetFilePointer(f, byte6, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[7])));
    SetFilePointer(f, byte7, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[8])));
    SetFilePointer(f, byte8, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[9])));
    SetFilePointer(f, byte9, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[10])));
    SetFilePointer(f, byte10, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[11])));
    SetFilePointer(f, byte11, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[12])));
    SetFilePointer(f, byte12, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[13])));
    SetFilePointer(f, byte13, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[14])));
    SetFilePointer(f, byte14, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[15])));
    SetFilePointer(f, byte15, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[16])));
    SetFilePointer(f, byte16, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[17])));
    SetFilePointer(f, byte17, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[18])));
    SetFilePointer(f, byte18, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[19])));
    SetFilePointer(f, byte19, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[20])));
    SetFilePointer(f, byte20, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    fileclose(F);
    end;
    Сразу скажу,что код "индийский",можно было написать цикл чтобы не повторять одни и те же строки,считайте это "домашним заданием"/"собственной работой" ,кто справиться напишите ниже в топике...

    Все же программа должна иметь некоторую последовательность,логичность,законченость...

    Опишу некоторый строки,если кто не понимает их значение.

    Код:
    f:=fileopen(fileName,fmOpenReadWrite);  //открываем файл с именем fileName
    Код:
    c:=ord(char(pchar(Text[1]))); // в переменную 'c' присваиваем код первого символа новой строки
    Код:
    SetFilePointer(f, byte1, nil, 0); // переходим на byte1 ($53A48 и т.д.)
    Код:
    WriteFile(f, c, SizeOf(c), BytesRead, nil);//заменяем байт на нужный нам
    Это процедура патча.Добавляем ее три раза "на кнопку" button.

    Добавляю туда записанные нами ранее "байты" которые нужно заменить.

    Выглядит это так.

    Код:
    procedure TForm1.btn1Click(Sender: TObject);
    begin
    try
    Patching(edit2.Text, edit5.Text, $53A38, $53A39, $53A3A, $53A3B, $53A3C, $53A3D, $53A3E, $53A3F, $53A40, $53A41,
                                        $53A42, $53A43, $53A44, $53A45, $53A46, $53A47, $53A48, $53A49, $53A4A, $53A4B);
     
    Patching(edit2.Text, edit4.Text, $53A70, $53A71, $53A72, $53A73, $53A74, $53A75, $53A76, $53A77, $53A78, $53A79,
                                        $53A7A, $53A7B, $53A7C, $53A7D, $53A7E, $53A7F, $53A80, $53A81, $53A82, $53A83);
     
    Patching(edit2.Text, edit3.Text, $53A58, $53A59, $53A5A, $53A5B, $53A5C, $53A5D, $53A5E, $53A5F, $53A60, $53A61,
                                        $53A62, $53A63, $53A64, $53A65, $53A66, $53A67, $53A68, $53A69, $53A6A, $53A6B);
     
    except MessageBox(0, nil, 'ErroR!', MB_ICONERROR); exit; end; // Проверяем ошибки
    ShowMessage('Файл ' + edit2.Text + ' успешно скомпилирован');
    end;
    Первый раз процедура заменяет строку с ^^^^,это файл который ищется на флешке.
    Второй раз процедура заменяет строку с !!!!.это путь до файла который будем копировать.
    Третий раз процедура заменяет строку с ????,это как будет называться наш файл на флешке


    И того...Для тех кто был не внимателен,конечный код.

    Код:
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, XPMan;
     
    type
      TForm1 = class(TForm)
        btn1: TButton;
        edit4: TEdit;
        edit5: TEdit;
        edit2: TEdit;
        lbl1: TLabel;
        lbl2: TLabel;
        lbl3: TLabel;
        lbl4: TLabel;
        edit3: TEdit;
        procedure btn1Click(Sender: TObject);
      private
     
    public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
     
    implementation
     
    {$R *.dfm}
     
    procedure Patching(fileName,Text:String; byte1,byte2,byte3,byte4,byte5,byte6,byte7,byte8,byte9,byte10,byte11,byte12,byte13,byte14,byte15,byte16,byte17,byte18,byte19,byte20:integer); //процедура для пропатчивания 10 байтов в файле с именем fileName, посимвольно на Text
    var f:integer;
        BytesRead:DWORD;
        c:byte;
    begin
    f:=fileopen(fileName,fmOpenReadWrite);
     
    c:=ord(char(pchar(Text[1])));
    SetFilePointer(f, byte1, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[2])));
    SetFilePointer(f, byte2, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[3])));
    SetFilePointer(f, byte3, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[4])));
    SetFilePointer(f, byte4, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[5])));
    SetFilePointer(f, byte5, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[6])));
    SetFilePointer(f, byte6, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[7])));
    SetFilePointer(f, byte7, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[8])));
    SetFilePointer(f, byte8, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[9])));
    SetFilePointer(f, byte9, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[10])));
    SetFilePointer(f, byte10, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[11])));
    SetFilePointer(f, byte11, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[12])));
    SetFilePointer(f, byte12, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[13])));
    SetFilePointer(f, byte13, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[14])));
    SetFilePointer(f, byte14, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[15])));
    SetFilePointer(f, byte15, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[16])));
    SetFilePointer(f, byte16, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[17])));
    SetFilePointer(f, byte17, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[18])));
    SetFilePointer(f, byte18, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[19])));
    SetFilePointer(f, byte19, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    c:=ord(char(pchar(Text[20])));
    SetFilePointer(f, byte20, nil, 0);
    WriteFile(f, c, SizeOf(c), BytesRead, nil);
     
    fileclose(F);
    end;
     
    procedure TForm1.btn1Click(Sender: TObject);
    begin
    try
    Patching(edit2.Text, edit5.Text, $53A38, $53A39, $53A3A, $53A3B, $53A3C, $53A3D, $53A3E, $53A3F, $53A40, $53A41,
                                        $53A42, $53A43, $53A44, $53A45, $53A46, $53A47, $53A48, $53A49, $53A4A, $53A4B);
     
    Patching(edit2.Text, edit4.Text, $53A70, $53A71, $53A72, $53A73, $53A74, $53A75, $53A76, $53A77, $53A78, $53A79,
                                        $53A7A, $53A7B, $53A7C, $53A7D, $53A7E, $53A7F, $53A80, $53A81, $53A82, $53A83);
     
    Patching(edit2.Text, edit3.Text, $53A58, $53A59, $53A5A, $53A5B, $53A5C, $53A5D, $53A5E, $53A5F, $53A60, $53A61,
                                        $53A62, $53A63, $53A64, $53A65, $53A66, $53A67, $53A68, $53A69, $53A6A, $53A6B);
     
    except MessageBox(0, nil, 'ErroR!', MB_ICONERROR); exit; end;
    ShowMessage('Файл ' + edit2.Text + ' успешно скомпилирован');
    end;
     
    end.
    Вот собственно и все.Ниже приложу исходник распространения файла на флешки,чтоб вы сами смогли попробывать и проконтролировать процесс.И конечно билдер,ради него все и писалось.

    Метод не нов,описан на большинстве форумов.
    Сам пример взял отсюда Please login or register to view links (Хм,не могу найти ссылку).

    Существуют другие методы Patch'a/Build'a, о них мы поговорим в следующий раз.
    На этом все,пишите свои вопросы,отвечу,я или кто то другой.
    Удачи в програмирование! ;)

    P.S.
    Автор не несет никакой ответственности за любое использование этого материала.
     

    Вложения:

    • Like Like x 3
    Метки:
  2. }{OTT@BY4

    }{OTT@BY4 Гость

    БАЯН!
     
  3. Ltybcrf

    Ltybcrf Гость

    БОЛЬШОЕ СПАСИБО! ++++
     
    • Like Like x 1
  4. TopicStarter Overlay
    Walentinka

    Walentinka

    Регистрация:
    29 янв 2013
    Сообщения:
    96
    Симпатии:
    47
    Да,этот метод придуман и был актуален очень давно.

    В свою защиту скажу

    Я никогда не сталкивался с задачей создания билдера,потому,для меня,этот материал в новинку, как может и еще для кого-то.
    Как верно заметил Ltybcrf,хороших статей с описанием нет.Так почему бы не сделать более менее внятное описание,сам разбирался не один час...
    Я не претендую на "создание" метода.Но считаю,что материал может быть полезен! (Как минимум мне ;) )
     
    • Like Like x 1
  5. deep_fox

    deep_fox Гость

    Сорри за поднятие старой темы, но, товарищи, не выдержал.
    На будущее: есть такая штука... map-файл называется. В Dephi, например, включается так: Project Options (Ctrl+Shift+F11) -> Linker -> Compiler -> Map file.
     
  6. TopicStarter Overlay
    Walentinka

    Walentinka

    Регистрация:
    29 янв 2013
    Сообщения:
    96
    Симпатии:
    47

    И что это штука дает? Я к сожалению с ней не знаком...
     
  7. deep_fox

    deep_fox Гость

    Включите да загляните в него что ли. :)
    Map file и есть "карта файла", то бишь адреса всего чего только можно - в нем, генерится он автоматически. После значительного изменения программы не придется руками искать нужный адрес той или иной строки или функции, ведь в map-файле пропишутся новые адреса. Только не забывайте учитывать смещение, перед использованием - читайте описание формата.
    Некоторые протекторы (VMProtect тот же) имеют функцию защиты разных функций разными методами, достаточно скормить им map-файл.
     

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

Загрузка...