Перейти до вмісту
EN

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(); // 0x521230
return 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-рядки у власній пам’яті й переписує вказівники:

  1. Перевіряє SHA-256 EXE та кожен запис обох англійських таблиць: ID, вказівник і сам англійський рядок.
  2. Переписує 76 вказівників (по 38 у кожній вихідній таблиці).
  3. Якщо активний масив уже заповнено, оновлює і його 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», меню відео й ефектів і значення параметрів.

Не перевірялися всі можливі значення параметрів на всіх роздільностях і зміна мови під час гри.

Повні докази — в архіві досліджень автора.