PC-меню: рядки, вшиті в EXE
Після перекладу ENGLISH.TXT частина меню лишилася англійською: «Quit to
Windows», «Video Settings», «Screen Resolution», «Shadows»… На одному екрані
стояли «Назад» і «Back». Ця сторінка пояснює, звідки беруться ці рядки і як
їх перекладено без зміни LEGOIndy.exe.
Звідки текст
Розділ «Звідки текст»Пошук фраз серед усіх розпакованих ресурсів гри (9 903 файли, 6,5 ГБ) не дав
жодного збігу. Рядки знайшлися в самому EXE: дві вбудовані таблиці по 38
записів (u32 id, u32 вказівник_на_рядок) із термінатором (38, 0).
Перевірена збірка — Steam, LEGOIndy.exe 7 847 936 байтів, SHA-256
c12f7348ec63aed61f56eb15d825f15b8340500668fa8c8dcf06c2f332e5e5fd,
image base 0x400000.
| Об’єкт | VA |
|---|---|
| Вихідні англійські таблиці | 0x921D10, 0x921E48 |
| Активний масив (38 вказівників, 152 байти) | 0x9D0C30 |
| Прапорець ініціалізації | 0x9D0CC8 |
| Ініціалізатор | 0x521230 |
| Гетери рядків | 0x4B1EF0, 0x620A10, 0x6960B0 |
Секція коду у Steam-файлі на диску не дизасемблюється напряму, тому адреси
й інструкції звірено з пам’яттю запущеного процесу (ReadProcessMemory,
без змін у пам’яті). Логіка гетерів спрощено така:
if (!pc_strings_initialized) initialize_pc_strings_from_embedded_language_table(); // 0x521230return pc_strings[id];Ініціалізатор обирає вбудовану таблицю за мовою гри, обнуляє активний масив
і копіює в нього вказівники. Жодного читання файлів тут немає, тому зміни
ENGLISH.TXT чи TRC.CSV на ці меню не впливають. Перемикання мови лише
обере іншу вбудовану таблицю; української серед них немає.
Ось чому одні й ті самі слова існують двічі: Back з ID 727 в ENGLISH.TXT
уже був «Назад», а Back з PC ID 10 — окремий рядок EXE.
| PC ID | Оригінал | Переклад |
|---|---|---|
| 1 | Quit to Windows | Вийти до Windows |
| 18 | Video Settings | Налаштування відео |
| 19 | Screen Resolution | Роздільність екрана |
| 29 | Effects Settings | Налаштування ефектів |
| 15 / 16 | On / Off | Увімк. / Вимк. |
FSAA: Edge AA складається з двох окремих рядків — назви й значення.
Усі 38 перекладів лежать у translations/pc_menu_ua.json.
Варіанти виправлення
Розділ «Варіанти виправлення»| Спосіб | EXE незмінний | Висновок |
|---|---|---|
| Лише TXT/CSV | так | не працює: інший шлях доступу до тексту |
| Патч EXE з новими рядками | ні | можливий, але змінює файл гри й обмежує довжину рядків |
| Модуль, що підміняє вказівники в пам’яті | так | обрано |
Як працює підміна
Розділ «Як працює підміна»Плагін тримає українські UTF-8-рядки у власній пам’яті й переписує вказівники:
- Перевіряє SHA-256 EXE та кожен запис обох англійських таблиць: ID, вказівник і сам англійський рядок.
- Переписує 76 вказівників (по 38 у кожній вихідній таблиці).
- Якщо активний масив уже заповнено, оновлює і його 38 вказівників. Якщо ні, гра сама скопіює вже українські адреси під час ініціалізації.
Наприклад, PC ID 19 спочатку вказує на Screen Resolution усередині EXE,
а після підміни — на «Роздільність екрана» в пам’яті плагіна. Рядок може бути
довшим за оригінал, бо має власне місце. Модуль мусить лишатися завантаженим
до кінця процесу: таблиці гри посилаються на його пам’ять.
У ранньому старті через ASI Loader сторінки таблиць мають атрибут
PAGE_WRITECOPY, пізніше — PAGE_READWRITE. Плагін приймає обидва після
повної перевірки записів; Windows сама створює приватну копію сторінки.
VirtualProtect для PC-сторінок не потрібен.
Спершу (0.1.4) це була окрема proxy-бібліотека dinput8.dll, яка передавала
виклики DirectInput справжній системній бібліотеці. З 0.1.6 рядки PC-меню
лежать у записі UKRAINIAN/PC_MENU.UTF8 пакета UAP (рядки, розділені нульовим
байтом), а з 0.1.8 підміну виконує ASI-плагін. Механізм лишився той самий.
Перевірки
Розділ «Перевірки»- Читання пам’яті запущеної гри: 76 вихідних і 38 активних вказівників, точний збіг українських UTF-8-рядків з JSON.
- Усі символи перекладу є в основному шрифті.
- Для іншого EXE плагін пропускає підміну, а гра лишається англійською.
- Автор перевірив у грі «Вийти до Windows», меню відео й ефектів і значення параметрів.
Не перевірялися всі можливі значення параметрів на всіх роздільностях і зміна мови під час гри.
Повні докази — в архіві досліджень автора.