Автор Тема: PCem - проверка CRC32?  (Прочитано 55144 раз)

Оффлайн Kirill Borisenko

  • Постоялец
  • ***
  • Сообщений: 177
    • http://
PCem - проверка CRC32?
« : 28 Октября 2023, 12:08:50 »
Добрый день, коллеги.

Есть такая программка PCem, которая эмулирует почти любое компьютерное железо.
https://pcem-emulator.co.uk/index.html

Является по сути мастером по настройке плагинов, так что строк там немного.

Но для последней версии нет русифиактора (для предыдущих - есть).
И появляется предположение, - почему.

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

Кто бы мог проверить это предположение?

Оффлайн leserg73

  • Постоялец
  • ***
  • Сообщений: 105
    • Wylek.ru
Re: PCem - проверка CRC32?
« Ответ #1 : 13 Ноября 2023, 01:09:20 »
Приветствую!

Программа не имеет каких-либо проверок исполняемого файла.

Создал проект перевода в Radialix, перевел несколько строк, создал локализованный файл - все работает и запускается.

Скрин 1


Скрин 2


Единственное, нужно быть аккуратным со встроенным ресурсом XRC (XML-формат).
Во-первых, переведенные строки должны быть в кодировке UTF-8. Во-вторых, его исходный размер и местоположение в файле должно остаться неизменным.
Т.е. напрямую в Radialix'е переводить его нельзя, т.к. он будет перенесен в конец файла. Поэтому с помощью Radialix его можно извлечь и необходимые строки перевести в текстовом редакторе, например Notepad++.



Исходный размер этого ресурса можно подогнать удалением пробелов форматирования (благо их там достаточно).
Затем при помощи НЕХ-редактора записать в файле поверх исходного ресурса.

Это можно сделать как ДО создания проекта перевода, так и ПОСЛЕ создания локализованного файла.

Оффлайн leserg73

  • Постоялец
  • ***
  • Сообщений: 105
    • Wylek.ru
Re: PCem - проверка CRC32?
« Ответ #2 : 13 Ноября 2023, 12:41:49 »
Продолжение...

Если умеете работать в отладчике, то тогда нет необходимости подгонять размер локализованного XRC-ресурса под размер исходного и не нужно использовать НЕХ-редактор.

Примерная последовательность необходимых действий будет следующей:

1) Извлекаем XRC-ресурс в проекте Radialix (контекстное меню "Сервис - Сохранить").


2) С помощью текстового редактора (например, Notepad++) переводим строки в тегах "title", "label" и "tooltip".
   Можно также для этого ресурса создать проект перевода в Radialix и переводить в нём. В общем этот шаг на ваше усмотрение.

3) Полученный локализованный файл ресурса в проекте перевода файла вставляем на место русского перевода (контекстное меню "Сервис - Загрузить").
   Только убедитесь, что файл ресурса не содержит метки BOM. Также в колонке "Исходная кодировка" для этого ресурса укажите кодировку UTF-8.

4) Создаем локализованный файл программы (не пытайтесь его запустить - он не будет работать).

5) Открываем полученный файл в отладчике (например, x64Dbg) и переходим на адрес ссылки XRC-ресурса, который можно узнать из Radialix (смотрите в колонке "Ссылки" соответственно для XRC-ресурса).

6) В коде программы выше команды обращения к XRC-ресурсу идет команда записи с размером этого ресурса. Это значение необходимо изменить на новое, которое соответствует размеру локализованного XRC-ресурса.


7) Сохраняем сделанные изменения в новый файл и проверяем его работу. Если все сделано без ошибок, программа запустится.

Оффлайн Kirill Borisenko

  • Постоялец
  • ***
  • Сообщений: 177
    • http://
Re: PCem - проверка CRC32?
« Ответ #3 : 14 Ноября 2023, 21:37:54 »


5) Открываем полученный файл в отладчике (например, x64Dbg) и переходим на адрес ссылки XRC-ресурса, который можно узнать из Radialix (смотрите в колонке "Ссылки" соответственно для XRC-ресурса).

На картинке в примере адреса ссылок немного разные. Ссылка должна быть +/- как в Radialix или точной?

6) В коде программы выше команды обращения к XRC-ресурсу идет команда записи с размером этого ресурса. Это значение необходимо изменить на новое, которое соответствует размеру локализованного XRC-ресурса.

Размер должен указываться в количестве байт текстового файла, указанном в шестнадцатеричном формате, или вычисляться исходя из количества символов, видимого в Radialix?

Оффлайн leserg73

  • Постоялец
  • ***
  • Сообщений: 105
    • Wylek.ru
Re: PCem - проверка CRC32?
« Ответ #4 : 15 Ноября 2023, 00:44:04 »
На картинке в примере адреса ссылок немного разные. Ссылка должна быть +/- как в Radialix или точной?
Здесь все точно, без каких-либо допусков.
Radialix показывает адреса ссылок, а отладчик показывает адреса инструкций.
Инструкция со ссылкой находится по адресу 00460F66.
Размер инструкции mov dword ptr ss:[esp+4] составляет 4 байта (байты C7 44 24 04).
Остальные 4 байта (вторая часть инструкции) - ссылка на ресурс.
Тогда адрес этой ссылки будет 00460F66 + 4 = 00460F6A, что и показывает Radialix.



Размер должен указываться в количестве байт текстового файла, указанном в шестнадцатеричном формате, или вычисляться исходя из количества символов, видимого в Radialix?
Radialix отображает длину строк в символах. И если для кодировок ANSI длина строк в символах и в байтах будет одинаковой, то в кодировке UTF-8 для кириллицы длина строки в символах и в байтах будет различной, так как на один символ кириллицы приходится уже 2 байта. В отладчике необходимо указать физический размер ресурса, т.е. не в символах, а в байтах. Поэтому в данном случае из Radilaix можно воспользоваться только оригинальной длиной ресурса (значение 142917) для ориентировки в отладчике. В шестнадцатеричном формате это будет значение 22E45, что и видно в отладчике (см. скриншот выше). А вот после перевода ресурса берём уже значение размера файла, который это ресурс занимает. Он в любом случае будет больше исходного. Также обратите внимание, что XRC-ресурс имеет Unix-формат конца строк (хотя, возможно, это не принципиально).