Полный мануал по патчу шаровар

Xakep, номер #039, стр. 039-075-2


В моем кряке две строки, два адреса и два байта, которые нужно исправить. Сколько строк, столько байтов нужно пропатчить.

Автоматический кряк

То, что ты смог пропатчить свою прогу вручную, - это хорошо. Теперь ты можешь сохранить где-нибудь пропатченный запускной файл и на случай переустановки окон и всего софта. Но что если ты патчишь не прогу, а игру? Мы постоянно даем тебе в игровой зоне коды для разных игр, которые так же надо править в любом шестнадцатеричном редакторе. Неужели ты после каждого запуска игры будешь заниматься рукоблудством, поправляя байтики вручную? Я думаю, что нет.

Раз уж мы продвинутые хакеры и не первый день занимаемся кодингом, давай создадим собственную утилу автоматического патча. Тем более, что это не так уж и сложно.

Утилу я опять буду писать на примере моего патча, ну а ты уже сможешь без проблем адаптировать ее под любые нужды. Даже если твоя нужда по большому :).

Шкодинг

Запусти Delphi. Можешь бросить на него любую картинку для создания приличного вида, но это уже на твой вкус. Главное - это установить кнопку. Что ты напишешь на ней, меня тоже не особо волнует.

Теперь приступим к кодингу. Дважды щелкни по созданной тобой кнопке, и Delphi создаст для нее обработчик события OnClick. В нем напиши содержимое врезки "Листинг Патча", а я расскажу, как происходит патч.

Где собака порылась?

Первое, что я сделал - объявил переменную F объектного типа TFileStream. Этот объект хорошо умеет работать с любыми файлами, читать из них информацию и записывать все что угодно.

В первой строке кода я инициализирую эту переменную (F:=TFileStream.Create), вызывая метод Create объекта TFileStream. У него есть два параметра:

1. Имя открываемого файла, или полный путь.

2. Способ открытия. Я указал fmOpenReadWrite, чтобы можно было одновременно и писать, и читать из файла.

После инициализации переменная F содержит указатель на объект с открытым файлом. Теперь мне надо перейти на нужную позицию и прочитать оттуда значение. Для перехода на нужное место в файле я использую метод Seek. У него тоже есть два параметра:

1. Число, указывающее на позицию, в которую надо перейти. Здесь тебе нужно поставить адрес, указанный в кряке.

2. Откуда надо двигаться. Я указал soFromBeginning, что означает двигаться от начала.

После выполнения F.Seek мы переместились на нужную позицию в файле. Теперь нужно проверить, какое там значение. Для этого нужно прочитать один байт с помощью метода Read. И снова у этого метода два параметра:

1. Переменная, в которую будет записан результат чтения.

2. Количество байт, которые надо прочитать.

После этого я делаю проверку прочитанного байта. Если все нормально, то можно записать на родину новое значение. Но перед записью нужно снова выставить указатель в файле на нужное место, потому что после чтения одного байта указатель сдвинулся на количество прочитанных байт. Поэтому я снова вызываю метод Seek.

Для записи я использую метод Write, у которого опять же два параметра:

1. Переменная, содержимое которой нужно записать. Я записываю содержимое переменной S, в которой уже находится нужное значение.

Назад на стр. 039-075-1  Содержание  Вперед на стр. 039-075-3