Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Патч на делфи


Автор: Hedrox 11.3.2005, 16:12
Люди кто знает как в делфи можно поменять в файле пару байт по указанному
адресу, мне нужно поменять je на jne или jnz. Дело в том что есть одна программа
которая требует 39 у.е. за регистрацию, ну, вручную я её сломал, теперь же и патч для народа
сделать нужно. Помогите пожалуйста.

Автор: Snowy 11.3.2005, 17:15
Эх, где мои 15 лет...
Допустим, что нужный нам байтик располагается в файле по адресу 5E4.
Тогда:
Код

var
  f: file of byte;
  b: byte;
begin
  AssignFile(f,'file.exe');
  {$R-} Reset(f);{$R+}
  if IOResult=0 then begin
    Reset(f); Seek(f,$5E4);
    Read(f,b);
    if b=$74 then begin
      Seek(f,$5E4);
      b:=$75;
      Write(f,b);
    end;
    CloseFile(f);
  end;
end.

$74 = je
$75 = jne

Автор: Петрович 11.3.2005, 18:15
Можно гораздо проще - надо воспользоваться специальными программами для создания патчей.
Я например пользуюсь CodeFusion Wizard который можно взять http://kobik.videodot.net/

Автор: Hedrox 11.3.2005, 20:44
Цитата
Можно гораздо проще - надо воспользоваться специальными программами для создания патчей.
Я например пользуюсь CodeFusion Wizard который можно взять http://kobik.videodot.net/

Та не, своими руками приятней smile
Добавлено @ 20:45
2Showy, благодарю smile

Автор: Hedrox 11.3.2005, 21:13
2Snowy:

Не тут то было =(. Вылезает исключение "... raised exception class EInOutError with
message 'Read beyond end of file'... Чё тут не так? Код вставлял такой же как ты и написал.
Останавливается на Read(f,b); Буду благодарен если для каждой строчки напишеш комментарий,
особенно интересно {$R-} и {$R+}

З.Ы. Делфи - 6, винда - 2003 enterprise

Автор: Петрович 11.3.2005, 22:15
Цитата(Hedrox @ 11.3.2005, 21:44)
Та не, своими руками приятней 

Бывает smile
Цитата(Hedrox @ 11.3.2005, 22:13)
Не тут то было =(. Вылезает исключение "... raised exception class EInOutError with
message 'Read beyond end of file'... Чё тут не так?

Попытка чтения за концом файла.
Просто ты наверное сделал Seek на позицию превышающую размер твоего файла.

Автор: Hedrox 11.3.2005, 22:20
Я ж говорю, останавливается на Read(f,b), до Seek даже не доходит

Автор: Alex 11.3.2005, 22:21
Перенесено из раздела Дельфи

Автор: Hedrox 11.3.2005, 23:30
Решил попробовать хоть с помощью CodeFusion.
Выбираю Find & Replace, выбираю адрес (00422194),
данные для поиска - 74 05 (je) данные для замены
75 05 (jnz), создаю екзешник, а вот файл не патчится,
File was NOT patched! [0 bytes written]. В чём проблема?
Адрес узнавал с помощью OllyDebuger.

Автор: Medved 12.3.2005, 00:12
Цитата(Hedrox @ 12.3.2005, 02:30)
Решил попробовать хоть с помощью CodeFusion.


Дык своими руками же приятней? smile

Автор: RA 12.3.2005, 03:26
Есть уже готовая тема "Updater & UpdateMaker " от Владимира Кладова
(естесно с исходниками делфи)

найти можно тут http://bonanzas.rinet.ru

Автор: Hedrox 12.3.2005, 11:21
Цитата(Pegas @ 12.3.2005, 00:12)
Цитата(Hedrox @ 12.3.2005, )
Решил попробовать хоть с помощью CodeFusion.


Дык своими руками же приятней? smile
$ля smile я полюбому сделаю своими руками, пользоваться чужим не по моему вкусу smile



З.Ы. Спасибо, твой ответ мне очень помог smile

Автор: Петрович 12.3.2005, 22:43
Цитата(Hedrox @ 11.3.2005, 23:20)
Я ж говорю, останавливается на Read(f,b), до Seek даже не доходит


Цитата(Snowy @ 11.3.2005, 18:15)
    Reset(f); Seek(f,$5E4);
    Read(f,b);


Интересно, это как же можно остановиться на Read(f,b); что бы при этом до Seek не доходило?

Автор: Hedrox 12.3.2005, 23:07
Мдя, запарился, я выяснил что так происходит потому что я указываю виртуальный адрес, а нужно адрес в файле, буду разбираться, спасибо всем кто помог.

Автор: Hedrox 13.3.2005, 12:48
smile Всё, всё получилось, надо было оффсет указывать, а я VA smile Snowy в эбауте не забуду smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)