MSI Lab - Форум по русификации

Основные форумы => RusMe - РусМи! => Тема начата: миха04 от 22 Апреля 2020, 14:08:21

Название: Смещение строк при переводе
Отправлено: миха04 от 22 Апреля 2020, 14:08:21
Всем здоровья! И опять я с очередным затыком от iZotop RX7 версия X64. С таким сталкиваюсь впервые. Оригинальное окно настроек (1) и после перевода (2). Строки смещаются со своего места влево вверх, независимо от кодировки и языка локали, даже если заменена одна буква. Часть кода со строкой Keyboard (3). При замене, например, буквы "b" на "B" у перехода jns меняется адрес, выводящий на строчку, начинающуюся с "Show commands containing" (4). Смена вызова строки с нового адреса приводит к одинаковому результату - смещение строки. В случае с кириллицей в UTF-8, видна только половина. Подскажите, если кто сталкивался с подобной заморочкой.
Название: Re: Смещение строк при переводе
Отправлено: leserg73 от 27 Апреля 2020, 20:58:45
И вам здоровья!

Обычно  такое происходит, когда разработчик приложения организует выбор вкладок не по индексу, а по имени. Имена вкладок являются ключевыми. Изменение имени вкладки буквально на одну букву, делает её неизвестной. В итоге программа добавляет её в качестве новой. Что вы и наблюдаете при попытке их перевода. В таких случаях нужно искать такие "ключи" по всему файлу программы. Если произвести поиск, например, строки-ключа "Keyboard", то она будет найдена в ресурсах программы, элементе с именем "IZRESEMBED -> RESTORATIONRESEMBED".

Рис. 1
(https://funkyimg.com/i/34mz5.png)

Он является бинарным (двоичным) и содержит графические и текстовые данные с описанием компоновки элементов интерфейса программы. Достанем его из файла, разберем и увидим, что в одном их файлов в формате XML, где встречается искомая строка "Keyboard", описана компоновка диалога с настройками приложения. Причем строка "Keyboard" встречается дважды и является частью строк вида "Keyboard OptionTab (Index 2) Button" и "Option Tab Keyboard". А эти строки в свою очередь являются именами элементов интерфейса. Аналогично и для других заголовков на вкладках.

Рис. 2
(https://funkyimg.com/i/34mz6.png)

На рисунке 2 я выделил цветом ключевые строки, строки, в которые эти ключевые строки входят, а также координаты и размеры кнопок, на которых размещаются ключевые строки. Это важно при локализации, т.к. переведенная строка может быть или длиннее или короче исходной, соответственно также нужно будет под неё корректировать размеры элемента управления. Ниже приведен пример перевода ключевых строк и изменения координат и положения кнопок.

Рис. 3
(https://funkyimg.com/i/34mz7.png)

Документ должен быть в кодировке UTF-8 без BOM (оригинальный документ имеет кодировку ANSI). Также следует добиться исходного размера документа после перевода, иначе вы не сможете выполнить его замену в двоичном ресурсе RESTORATIONRESEMBED.

После изменения документа и замены его в ресурсе приложения нужно перевести ключевые строки в коде программы. Вы уже знаете, что имена вкладок (ключевые строки) являются жестко-кодированными строками. Инструменты перевода жестких строк могут быть какими угодно, важно другое. Все эти ключевые строки имеют указатель длины. Например, строка-ключ "Keyboard" имеет длину 8 байт, что соответствует количеству символов в строке, и эта длина явно устанавливается в коде программе.

Рис. 4
(https://funkyimg.com/i/34mz8.png)

Я перевел эту строку-ключ как "Клавиатура". Длина строки 10 символов, но так как мы использовали кодировку UTF-8, то длина этой строки в байтах будет составлять 20 (или 14 в формате НЕХ). Вот это значение и следует указывать в коде.

Рис. 5
(https://funkyimg.com/i/34mz9.png)

Аналогичным образом необходимо подкорректировать длину строк в соответствии с переводом. По окончании модификации и сохранении результата в файл мы увидим в настройках приложения корректное положение переведенных вкладок.

Рис. 6
(https://funkyimg.com/i/34mza.png)

При работе над переводом вам следует обратить внимание на то, что многие строки интерфейса находятся в ресурсе  RESTORATIONRESEMBED в таких же документах XML. Для них, возможно, также могут быть применены "ключи" и указатели длин, поэтому вам предстоит быть предельно внимательным. Еще вы можете настраивать положение и размеры элементов управления, редактируя значения тегов "X",  "Y", "Width" и "Height".

Удачи!
Название: Re: Смещение строк при переводе
Отправлено: миха04 от 27 Апреля 2020, 22:03:39
Спасибо за информацию, а то уже всю голову сломал. Остался последний вопрос - как извлечь XML из ресурса и затем обратно вставить? Я пробовал, и у меня вышло большое количество файлов XML. Извлечь получилось, а вот вернуть - с этим проблема.
Название: Re: Смещение строк при переводе
Отправлено: leserg73 от 27 Апреля 2020, 22:47:21
Вставить обратно можно в НЕХ редакторе. После перевода в XML файле подгоните его размер в размер оригинального. Например, рассматриваемый нами файл  (см. рис. 2 из предыдущего поста) имеет исходный размер 24404 байта. После моих модификаций его размер получился уже 24489 байт. Я уменьшил его размер  до исходного размера за счет удаления символов пробелов, которые выполняет роль форматирования и показывают структуру документа. Это видно на рис. 3 по сравнению с рис. 2 (строки 1-18). После этого открываем файл программы iZotope RX 7 Audio Editor.exe и наш измененный XML файл в НЕХ редакторе, находим массив оригинальных данных файла и выполняем его замещение новыми данными.
Название: Re: Смещение строк при переводе
Отправлено: миха04 от 28 Апреля 2020, 07:15:35
Спасибо, буду пробовать.
Название: Re: Смещение строк при переводе
Отправлено: миха04 от 28 Апреля 2020, 11:11:11
Ещё один момент, в окне Find Similar, это раздел Measurements, есть строка Make selection to find similar events. Она длиной 37 байт, кириллица занимает примерно 39 байт и дальше обрез. Пытался воспользоваться примером выше, но неудачно. В этом случае где находится счётчик?
Название: Re: Смещение строк при переводе
Отправлено: миха04 от 28 Апреля 2020, 15:22:27
Разобрался, смотрел не туда   :umnik:
Название: Re: Смещение строк при переводе
Отправлено: leserg73 от 28 Апреля 2020, 22:34:10
Она длиной 37 байт, кириллица занимает примерно 39 байт и дальше обрез. В этом случае где находится счётчик?
В отладчике все значения представлены в шестнадцатеричном формате!  37 в десятичном формате, а в шестнадцатеричном - 25.  :yes:

Памятка, если не знаете:
(https://funkyimg.com/i/34oTd.png)

Разобрался, смотрел не туда
Это хорошо, что сами разобрались.  :up:

Название: Re: Смещение строк при переводе
Отправлено: миха04 от 29 Апреля 2020, 12:54:05
Странная вещь происходит в отладчике x64dbg. 64-битная версия отказывается сохранять изменения при добавлении строки на новый адрес. Места ещё много. На скрине сохранился 1 байт из 37 изменённых. Пробовал в WinHex, всё сохраняется, но отладчик x64dbg это сохранение видит лишь небольшим куском. Файл ограничен по размеру?
Название: Re: Смещение строк при переводе
Отправлено: leserg73 от 29 Апреля 2020, 22:28:10
Места ещё много. На скрине сохранился 1 байт из 37 изменённых. Пробовал в WinHex, всё сохраняется, но отладчик x64dbg это сохранение видит лишь небольшим куском. Файл ограничен по размеру?
Вы ошибаетесь. Там где вы пытаетесь записать свои данные, места как раз-то уже и нет. Если вы перейдете по тому адресу в НЕХ редактор, то увидите, что пытаетесь записать свои данные поверх существующих. В характеристиках секций любого РЕ-файла определены виртуальные границы, куда будут спроецированы данные программы при загрузке её в память. Вот отладчик вам и показывает виртуальную область памяти с кучей пустого места. На самом деле, на физическом уровне, этого пустого места в файле нет. Вы можете сами в этом удостовериться.

Вот смотрите, берем адрес 00000001421289FA,  с которого у вас отладчик отказывается записывать данные патча. Обратите внимание на информационную область под окном дизассемблированного кода. Там отображается физическое смещение в файле по выбранному адресу. Это смещение - 2126BFA.

(https://funkyimg.com/i/34rrr.png)

Переходим по этому смещению в НЕХ редактор, открыв в нем файла программы. Что вы видите?

(https://funkyimg.com/i/34rs2.png)

Вы находитесь уже перед началом следующей секции в файле. Это секция .data, которая начинается со смещения 2126C00.

(https://funkyimg.com/i/34rsj.png)

Обратите внимание на параметры секций "Raw Size" (физический размер) и "Virtual Size" (виртуальный размер). Виртуальный размер обычно всегда больше. Это тот размер, который вы видите в отладчике.

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

(https://funkyimg.com/i/34rt7.png)

Вот поэтому отладчик отбрасывает байты, которые выходят за границы физического размера секции. Или вы хотите получить заведомо неработоспособный файл программы?
Название: Re: Смещение строк при переводе
Отправлено: миха04 от 29 Апреля 2020, 22:46:17
Ясно. Грустная история. И можно ли как-то всё это побороть?
Название: Re: Смещение строк при переводе
Отправлено: leserg73 от 29 Апреля 2020, 23:14:59
И можно ли как-то всё это побороть?
Можно. Добавить в конце файла новую секцию и все строки сносить туда. Так, например, делает шаблонный редактор Radialix, когда перевод касается жестко закодированных строк.
Название: Re: Смещение строк при переводе
Отправлено: миха04 от 29 Апреля 2020, 23:38:22
Хорошо. Спасибо за советы. Буду теперь знать.
Название: Re: Смещение строк при переводе
Отправлено: миха04 от 30 Апреля 2020, 19:54:36
Не нашёл в Radialix как это сделать. По другим примерам, из сети, тоже ничего. Файл не рабочий. Честно говоря, внятных пояснений, кроме ваших, я не нашёл. Такое впечатление, что люди объясняют сами себе. На Wilek вопросы задавать не могу, такие правила.
Название: Re: Смещение строк при переводе
Отправлено: миха04 от 01 Мая 2020, 17:36:35
Добавил новую секцию через LordPE. В неё можно попасть через Карту памяти. Что нужно сделать, чтобы секцию было видно не таким путём?
Название: Re: Смещение строк при переводе
Отправлено: leserg73 от 01 Мая 2020, 18:35:28
Не нашёл в Radialix как это сделать.
Radialix делает это на автомате, когда переводите в нем жестко закодированные строки.  Отдельной функции для добавления новой секции в нем нет. Для создания секций в файлах формата PE необходимо использовать соответствующие утилиты и инструменты, например, PETools, PE-Bear, CFF Explorer, Stud-Pe и другие им подобные. На практике я использую CFF Explorer. 

Добавил новую секцию через LordPE. В неё можно попасть через Карту памяти. Что нужно сделать, чтобы секцию было видно не таким путём?
Не уверен, что LordPE умеет работать с 64-бит программами. Очень древняя разработка. Проверьте файл другими PE инструментами.

Немного не понял.
В отладчике любую секцию можно открыть на одной из 5-ти вкладок панели дампа памяти.
Поясните "чтобы секцию было видно не таким путём". Видно где и каким путем?

А в чем проблема при переводе в Radialix? Если строк много, то замучаетесь вручную их переносить. Да и с поддержкой локализации последующих версий приложения будете страдать. Локализованный файл получается нерабочий? Разобраться не пробовали почему? Бывает Radialix портачит файлы. Попробуйте использовать другую версию редактора. Я по большей части использую 2 версию (последнюю), но если что-то не идет, пробую в 3 версии (также последней версии). Также бывает, что не получается рабочий файл программы, тогда смотрю оригинальный и локализованный в РE редакторах, сравниваю заголовки. А бывает достаточно пересохранить локализованный файл из PE редактора в новый файл и он становится рабочим. В большинстве случаев PE редактор автоматом исправляет заголовок, если с ним было что-то не так. Есть и тяжелые случаи, когда ничего не помогает.  Тогда приходится искать альтернативы.

Название: Re: Смещение строк при переводе
Отправлено: миха04 от 01 Мая 2020, 19:59:19
Для захода в секцию мне нужно вводить её адреса или через вкладку Карта памяти (x64dbg), я это имел ввиду. В Radialix часть строк обрезается наполовину из-за UTF-8. х64 поддерживается LordPE Deluxe by yoda.
Название: Re: Смещение строк при переводе
Отправлено: leserg73 от 01 Мая 2020, 20:56:37
В Radialix часть строк обрезается наполовину из-за UTF-8.
Конечно будут обрезаться, он то ничего не знает про указатели длин, прописанные в коде для строк. Вы можете в Radialix сделать локализованный файл, а потом в отладчике поправить значения длин. Это намного проще, чем в отладчике вводить строки. Плюс у вас будет проект, который потом легко обновить с выходом новой версии программы. В последствии вы можете потом сделать патч, который будет автоматом исправлять эти значения длин. Первопроходцем быть сложно, зато потом процесс можно автоматизировать.

х64 поддерживается LordPE Deluxe by yoda.
Спасибо, буду иметь ввиду.  :thanks:

Для захода в секцию мне нужно вводить её адреса или через вкладку Карта памяти (x64dbg), я это имел ввиду.
Да откройте её на одной из вкладок Дампа памяти.

Название: Re: Смещение строк при переводе
Отправлено: миха04 от 01 Мая 2020, 22:17:36
Спасибо. Последую вашим рекомендациям.