![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
Siberian GRemlin |
![]() ![]()
Сообщение
#1
|
![]() Advanced Member ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 537 Регистрация: 4-February 08 Пользователь №: 2 Спасибо сказали: 222 раз(а) ![]() |
Уважаемые.
Добрался я до той ситуации, когда необходимо изменить длину строк в EXE, в частности под DOS. Как я понимаю, в бинарнике есть таблица с адресами и если мне нужно изменить длину первой строки (считаем от начала бинарника) на один символ (байт), то необходимо в таблице увеличить все значения адресов на единицу, кроме самого первого адреса (в смысле, адреса первой строки). Единственное, что мне пока неизвестно, где находится эта таблица в бинарнике и как там идёт индексация, а также адресация и есть ли где-то значение размера этой таблицы? Ещё в интернете ища информацию, натыкался на информацию о том, что существует прога для автоматического изменения текста с его длинной, ремаппингом и т.п., а также что люди сами писали подобные программы. Гипотетически это возможно, но как бы это выяснить... Может кто-от посоветует какие-нибудь статьи по данному вопросу (локализации текстовых констант в ЕХЕ) P.S.: Опытного человека, моё сообщение может показаться ламерским бредом... но хочется расти в творческом плане и в одиночку без глупых вопросов не обойтись. P.P.S.: Я доделываю русскую локализацию одной игры. |
![]() ![]() |
-=CHE@TER=- |
![]()
Сообщение
#2
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,373 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 320 раз(а) ![]() |
P.P.S.: Я доделываю русскую локализацию одной игры. Хех, я так понимаю Кирандию первую добиваешь? (*улыбается*)Тут, ИМХО, проблема такая, что без полной декомпиляции игры ты её не решишь. Понимаешь, строка, скажем так, вшита в .EXE файл. Ты можешь только: 1) уменьшить её (забить неиспользуемые символы в конце нулями, а лучше, пробелами) и 2) изменить её не меняя её длинны Всё. Увеличить длинну нельзя по одной простой причине: если ты увеличить строку на 1 байт - это значит, что ВСЕ конструкции-переходы (CALL, JMP, J*) в программе, которые ссылаются на адреса выше/ниже того места, где ты вставил байт, будут ссылаться на один байт раньше/позже того места, куда должны бы. Проблема в том, что все инструкции перехода записываются как инструкция и на_сколько_ ОТНОСИТЕЛЬНО_ТЕКУЩЕГО_АДРЕСА_перейти Например: jmp +5 // перейти на адрес на 5 байт после текущей инструкции call -60 // перейти на адрес на 60 байт выше данной инструкции Т.е. если ты всунул 1 байт между этими двумя командами, то: 1) jmp будет уже на +6 2) call будет уже -61 Я думаю, что писать дизассмеблер это муторно, да и отловить все такие ситуации очень и очень сложно. Это не просто изменить длинну строки - это, можно считать, переколбасить всю программу. Более того, я тут разобрал самый простой случий, без всяких структур (представь, что твоя строчка входила в структуру, или после неё стояла структура, адрес которой загружался при помощи команды lea). Моё скромное ИМХО: задача по удлинению строки, в общем случае, очень тяжёлая (если не сказать невыполнимая) и не факт, что после этого .EXE файл будет корректно работать. Если уж очень хочется, то можно сделать такой, малооправданный, трюк ушами (геммор, правда, чуть меньший, чем с правкой всех адресов в предыдущем способе): 1) Написать свой загрущик для оригинального .EXE-файла (типа виндового "запустить процесс спящим") 2) Выделить в загруженной программе дополнительную память, куда пихать свои, русские, строки 3) Перебить в памяти адреса, откуда берутся оригинальные строки, на те, где находятся загруженные соответствующие им русские 4) Дать оригинальной программе дальше работать (типа "ResumeThread") Хотя опять-таки, если строчка входила в структуру, то нужно менять и её размер... |
![]() ![]() |
Упрощённая версия | Сейчас: 9th May 2025 - 23:07 |