Сейчас на форуме: zds (+5 невидимых) |
![]() |
eXeL@B —› Программирование —› Патчинг ехе |
Посл.ответ | Сообщение |
|
Создано: 10 марта 2014 13:49 · Личное сообщение · #1 Здравствуйте! Появилась необходимость отредактировать некий ехе файл, тобиш открыть его, найти необходимую мне строку ( в программе она используется в чистом виде в функции MessageBox ) и заменить эту строку на свою. Делаю я это так: Code:
Заменяет все безупречно, проблема не в этом, а в том что заменять можно строкой не длиньше оригинальной, если сделать длиньше то она перейдет уже на следующий параметр функции MessageBox. Думал я думал что же с этим можно сделать, придумал разделять файл на 2 части и собирать в 1, тобиш копируем память от начала файла до конечного байта того чем мы заменили, дальше копируем от конечного байта оригинальной строки и сохраняем в конце концов, ну что то в этом роде: Code:
Вроде бы все замечательно, но в результате чего получаемый файл не запускается. Понял что так изменить память не получится и на этом мои идеи закончились . Подскажите пожалуйста что можно с этим сделать, может можно как то создать переменную, в нее записать строку и MessageBox-у втюхать ее? ![]() |
|
Создано: 10 марта 2014 14:45 · Поправил: Runtime_err0r · Личное сообщение · #2 |
|
Создано: 10 марта 2014 15:00 · Личное сообщение · #3 |
|
Создано: 10 марта 2014 15:16 · Поправил: kid · Личное сообщение · #4 DarkSmile пишет: но как передать параметр MessageBox что бы он не считал его за строку? взорвало мозг Code:
Вы передаете указатель , а что будет находиться по данному указателю - решать вам ![]() |
|
Создано: 10 марта 2014 16:02 · Личное сообщение · #5 |
|
Создано: 10 марта 2014 16:05 · Личное сообщение · #6 |
|
Создано: 10 марта 2014 16:21 · Личное сообщение · #7 DarkSmile пишет: Дак указатель то куда передавать??? код вызова будет таким (или почти таким) Code:
![]() |
|
Создано: 30 марта 2014 12:06 · Личное сообщение · #8 Привет! Решил не создавать новую тему, так как название этой идеально подходит. У меня вопрос чуть посложнее. Вот такой: <<Я модифицирую одну старую игру начала 90х, и в общем-то основная цель уже выполнена, но я перфекционист и захотел изменить начальное интро таким образом, чтобы в нем отразить все изменения в программе, которые были сделаны с ее создания. Изначально там есть строка о том, что она "Programmed in 1992 on AT .286 12MHz", я хотел добавить строку "Cracked in 1993 on some old junk" и "Unpassworded in 2014 on PB DOTS 1.5GHz", а также явно указать имя начального разработчика, взломщика и себя. Так вот, первая строка уже содержится в секции данных в файле. Я нашел очевидно неиспользуемую функцию вывода еще нескольких строк с именами разработчиков, которая почему-то в игре нигде не используется. Изменил функцию интро, добавив в нее прыжок на неиспользуемую, там изменил смещения на строки и прыжок на первую функцию. В самом конце файла, там, где, в общем-то, на первый взгляд одни данные, добавил новые строки. Изменил заголовок: Pages in file: B2, Bytes on last page: 1A0 -> Pages in file: B3, Bytes on last page: 0 соответственно новому размеру. Смещения на новые строки я вычислил теоретически верно: выяснил базу, отняв от адреса одной из старых строк в файле смещение, по которому к ней обращались и отняв эту базу от адреса новой строки. Все инструкции работают, но вместо строк рисуются непечатные блоки, то есть очевидно что программа не видит новых строк. Вопрос: чего я не учел?>> ![]() |
|
Создано: 30 марта 2014 12:37 · Личное сообщение · #9 |
|
Создано: 30 марта 2014 12:53 · Личное сообщение · #10 Sou ka. Это верно. Функция, рисующая интро, начинается по адресу 2808. Новые строки в конце файла. ![]() ![]() |
|
Создано: 30 марта 2014 16:34 · Поправил: ajax · Личное сообщение · #11 senyuki это MZ-файл Pages in file: B2, Bytes on last page: 1A0 -> Pages in file: B3, Bytes on last page: 0 как пример корректного размера: Bytes on last page: 01A0 Pages in file: 0015 14*512t+1a0 = 10656 (размер файла) и там оверлей щас "нарисовался" из-за корявого исправления два - 0А03 похоже на сегмент данных, вроде как он всегда в коде с релоками. без оффсета в файле, где и что правилось - я хз, как угадать ![]() ----- От многой мудрости много скорби, и умножающий знание умножает печаль ![]() |
|
Создано: 30 марта 2014 16:40 · Поправил: senyuki · Личное сообщение · #12 Pages in file: B2, Bytes on last page: 000001A0 в Pages in file: B3, Bytes on last page: 00000000 Разве что мискликнул случайно? "надо нулями добивать, или еще что." А... в этом плане. Все, с таблицей вроде суть ухватил Что-то странное, редактирую заголовок, и при нажатии F3 на поле Bytes on last page автоматически изменяется поле Pages in file с В3 на В2... Проверил физ. размер файла... посчитал на калькуляторе... ты гляди... и правда В2, а не В3. Неужели где-то раньше я накосячил с размером... Исправил - оверлей убрался. Но строки по прежнему не рисуются (и судя чисто по поведению, что блоки рисуются как бы на протяжении пары секунд, то явно программа пытается их рисовать откуда-то из code segment c непечатными символами, которых нет в используемом шрифте, до первого 00, который встречается далеко не скоро... однако почему? ведь буквально за несколько инструкций до того берутся имеющиеся строки, ds не меняется... придется медитировать дальше) ![]() |
|
Создано: 03 апреля 2014 00:25 · Личное сообщение · #13 |
|
Создано: 03 апреля 2014 05:50 · Личное сообщение · #14 |
|
Создано: 04 апреля 2014 02:41 · Поправил: senyuki · Личное сообщение · #15 Я тоже так думал, но скорее это остатки какой-то хитрой защиты господина Змиро. В cracktro от 93 года Гибриды жаловались на хитроболтовость защиты конкретно этой игры. Конечно, по тем временам... Вообще хитро как-то, по крайней мере, пока что это выходит за пределы ясного понимания. http://cs540106.vk.me/c616125/v616125788/8fdc/yMKf8MBj2NY.jpg Скопировал этот блок в отдельный файл. Вот его заголовок: http://cs540106.vk.me/c616125/v616125788/8fcc/QOD-Ivj-hkg.jpg Для сравнения заголовок основного: http://cs540106.vk.me/c616125/v616125788/8fd4/r6Z-R1T42PI.jpg В этом блоке встречаются искаженные строки из основного файла. http://cs540106.vk.me/c616125/v616125788/8fe4/VTBT_K8366Y.jpg BEGINN - BEGINNER, EXP - EXPERT, COD - CODE, [[ - [[[[, служебная строка... Даже то, что выглядит как ONT, это, похоже, остаток от ENTER. Проверил дамп - ничем не запакован, хоть и все указывает на то... Соль в том, что если каким-либо образом нарушить целостность этого блока или вовсе убрать его - в некоторых ситуациях игра вместо того, чтобы выдать экран Game over или выйти в главное меню - выдает Uknown error. Reboot requested и Dosbox на этом вылетает. Собственно, думаю, что это Dosbox и выдает. Мыслей пока нет, в чем же тут суть, буду пока думать ![]() ![]() |
![]() |
eXeL@B —› Программирование —› Патчинг ехе |