• Добро пожаловать на WYLEK.ru. Пожалуйста, войдите или зарегистрируйтесь.
 
101 гостей, 2 пользователей

avatar_Leserg

Анализ ресурсов программ от ArcSoft

Автор Leserg, 26 октября 2012, 10:39:00

« предыдущая - следующая »

LesergАвтор темы

Анализ ресурсов программ от ArcSoft

Удлиняем строки в пределах возможного

Скажу сразу, работа предстоит кропотливая, требующая внимательности и аккуратности. Шаляй-валяй не прокатит. Но за терпение и труд вы будете вознаграждены полученным результатом. Основные инструменты для работы я выбрал такие: текстовый редактор AkelPad и шестнадцатеричный редактор WinHex (пропатченная версия для поддержки кириллицы). Рекомендую сделать резервные копии файлов, над которыми вы будете работать. Это избавит вас от лишних операций по установке и удалению программы, если у вас что-то пойдет не так или вы допустите ошибку. Поехали...

Рассматриваем программу Войдите на сайт для перехода по ссылке. Я не стану описывать поиск строк и ресурсов для перевода. Думаю вы с этим справились без меня и уже знаете, что ресурсы программы находятся в файлах с расширением *.aui, которые лежат в папке UI каталога установки. К примеру, для исследования я взял файл MainFrame.aui. В этом файле находятся строки главного окна программы. Откроем файл в НЕХ-редакторе. Посмотрим внимательно на заголовок файла. Если вы когда-либо работали с редакторами ресурсов, то наверняка заметили, что все обычные ресурсы программы имеют схожую структуру: секция значков, секция изображений, секция диалогов, секция строк и т.д.). Когда я начал разбираться с этим форматом, то увидел здесь похожую структуру: в начале файла перечислены секции, из которых он состоит.

Извините, вам запрещён просмотр содержимого спойлеров.


Поиск строк показал, что все они находятся в секции text. Больше нигде в файле строки не встречаются. Перейдем в эту секцию. Это можно сделать задав в поиске название этой секции.

Извините, вам запрещён просмотр содержимого спойлеров.


Как вы можете видеть, сначала по адресу 000049Е0 идет название секции - text, затем, с адреса 000049F3, в виде таблицы перечисляются номера строк и соответствующее им смещения, и в конце с адреса 00004B40, последовательно друг за другом, идут сами строки, разделенные символом NUL [00]. Строки имеют формат Unicode, т.е. одному символу соответствует 2 байта. Таким образом для перевода на русский необходимо выполнить работу над этими строками. Так как формат *.aui нестандартный, то ни один из редакторов ресурсов вам не поможет. Делать все надо в НЕХ-редакторе. Огромный минус такого перевода: вы ограничены длиной строки на английском. Если, к примеру взять слово "Tools" (5 символов - в Unicode 10 байт), то на русском языке это будет "Инструменты" (11 символов - в Unicode 22 байта!). Переводчику приходится делать сокращение слова. В итоге интерфейс программы будет состоять из одних сокращений и ею будет неприятно пользоваться. Что же можно сделать?

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

Извините, вам запрещён просмотр содержимого спойлеров.


Если вы внимательно посмотрите на этот сегмент данных то легко увидите закономерность: это порядковое возрастание номеров в шестнадцатеричной системе счисления. На рисунке я уже показал вам нулевую строку [00] (отсчет строк начинается с нуля), за ней идет первая строка [01], потом вторая [02] и т.д. Это хорошо видно по цифрам. Также хорошо видно повторение одного и того же байта [01] через одинаковые интервалы, в которых находятся номера строк и смещения. Байтом [01], кто сталкивался с форматом хранения баз данных, обозначается столбец или строка (в данном случае строки). Имея воображение можно сразу представить перед собой простую таблицу:

[01]{NUL}<НОМЕР СТРОКИ 00>{NUL}<СМЕЩЕНИЕ>{NUL}
[01]{NUL}<НОМЕР СТРОКИ 01>{NUL}<СМЕЩЕНИЕ>{NUL}
[01]{NUL}<НОМЕР СТРОКИ 02>{NUL}<СМЕЩЕНИЕ>{NUL}
...
[01]{NUL}<НОМЕР СТРОКИ n>{NUL}<СМЕЩЕНИЕ>{NUL}

где {NUL} - это разделитель (байты [00]) между столбцами и далее между строками.

Надеюсь вы поняли принцип. На этом примере файла очень удачно оказалось размещение начальной позиции секции text, в результате чего просматриваются явные столбцы. Если секция будет на один байт смещена в одну или другую сторону, то симметрия будет нарушена и закономерность сложнее будет увидеть на глаз. Но это на первых порах. Позже глаза сами будут определять номера строк и соответствующие им смещения. Идем дальше.

Смещения, что это? Говоря простым языком - это адрес определенной строки относительно адреса нулевой строки. Вот смотрите - нулевая строка (User Center):

Извините, вам запрещён просмотр содержимого спойлеров.


Хорошо видно: порядковый номер - 00, смещение - это первая строка в массиве строк, поэтому количество байт [0000] (не забывайте про разделитель между номером строки и смещением). Таким образом полный вид получается [00 00 00 00]. Сама строка начинается по адресу 00004В40. Это начальный адрес для всех последующих строк в массиве. Запоминаем, количество байт до каждой последующей строки будет вестись именно от этого адреса. Еще не забывайте, что формат строк - Unicode (1 символ = 2 байта).

Смотрим следующую строку - "An update is available.". В таблице она записана как [01 00 00 18], т.е. первая строка и количество байт 18 до позиции, где она находится, относительно адреса нулевой строки.

Извините, вам запрещён просмотр содержимого спойлеров.


Еще раз внимательно. Нулевая строка начинается по адресу 00004B40. Первая строка начинается по адресу 00004B58. Выполняем простое арифметическое действие 00004B58 - 00004B40 = 18 (калькулятор Windows в инженерном режиме HEX). И именно это число указано в качестве смещения для первой строки - [01 00 00 18]. Также это смещение можно узнать с помощью самого НЕХ-редактора. Поставьте курсор на адрес 00004B40, удерживая левую кнопку нажатой начните вести мышку до адреса 00004B58. Редактор, в правом нижнем углу, покажет вам количество выделенных байт. Это и будет смещение до первой строки.

По этому принципу размещены строки (и остальные ресурсы) в данном формате файла: заголовок секции, размер секции, таблица с порядковыми номерами ресурсов и их смещениями и, наконец, массив ресурсов.

Эти знания позволяют нам сделать более-менее нормальный перевод, без сокращений (по возможности). Я написал "по возможности", т.к. мы еще ограничены размерами секции и размерами элементов управления форм программы. Мы не можем увеличить секции, так ка это повлечет за собой затирание и смещение последующих секций, а в итоге неработоспособность программы. Пока это маленькая победа на гоблином. За счет манипуляции строками внутри секции, можно добиться вполне приемлемого перевода. Например, первая строка "An update is available." содержит 23 символа, в юникоде это 46 байт. На русский эту фразу можно перевести как "Доступно обновление." - 20 символов или 40 байт. Экономия 3 символа или 6 байт. Так постепенно можно набрать недостающую длину строк для перевода на русский.

Чтобы не переводить текст в НЕХ-редакторе (это очень неудобно, тем более переводом вы будете затирать последующую строку), я предлагаю воспользоваться услугами обычного текстового редактора. В нем намного проще выполнить перевод строк и затем откорректировать их окончательный вид таким образом, чтобы суммарная длина всех символов или равнялась исходной длине оригинального текста, или была немного меньше.

Я использовал редактор AkelPad, т.к. он при выборе документа позволяет указать его кодировку.

Запустите редактор и откройте в нем файл MainFrame.aui, указав кодировку 1200 (UTF-16 LE) (в окне выбора файла снимите флажок с опции "Автовыбор" и из выпадающего списка выберите указанную кодировку). Программа может сообщить, что файл является бинарным. Ничего страшного, мы ничего с ним делать не будем, только скопируем строки. Итак открыли. Включите опцию автопереноса по словам и найдите участок с текстом. Можно воспользоваться поиском, указав к примеру слово "User" из нулевой строки.

Извините, вам запрещён просмотр содержимого спойлеров.


Создайте новый документ в той же самой кодировке и назовите его, например, mainframe_en.txt. В него мы скопируем текстовые строки из файла MainFrame.aui.
Выделите текстовую часть строк (на рисунке обведено красным), скопируйте их и вставьте в новый файл. Я не рекомендую переводить прямо в файле MainFrame.aui. Нам необходимо будет готовить новую таблицу смещений для каждой из строк, а это неудобно делать в исходном файле, к тому же очень отвлекает нагромождение лишних символов.

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

Извините, вам запрещён просмотр содержимого спойлеров.


Далее я сохранил полученный файл, а затем сохранил его под другим именем - mainframe_ru.txt, т.е. сделал копию. Здесь будем делать перевод на русский. Это необходимо для последующей подгонки суммарного количества символов перевода по оригинальному тексту. Откройте файл mainframe_en.txt с английским текстом, выделите весь текст и гляньте на суммарное количество символов - 943. На это число нам необходимо ориентироваться при переводе на русский:

Извините, вам запрещён просмотр содержимого спойлеров.


Переводим строки в файле mainframe_ru.txt и стараемся уложиться в отведенные границы текста. Для данного примера я не сильно старался над переводом. Главное, чтобы вы поняли для чего все это делается. После перевода, выделите весь текст и посмотрите на суммарное количество символов. У меня получилось в окончательном варианте 940 символов:

Извините, вам запрещён просмотр содержимого спойлеров.


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

Идем дальше. Сохраните документ с переводом, а затем сохраните его под другим именем, я указал имя mainframe_ru_1string.txt. В файле mainframe_ru.txt мы позже будем делать таблицу смещений. А сейчас займемся файлом mainframe_ru_1string.txt. Если помните, то строки в файле MainFrame.aui размещаются последовательно через разделитель NUL [00] (в юникоде [00 00]). Поэтому наша задача свести строки перевода в одну строку через какой-нибудь разделитель. Потом, в НЕХ-редакторе, мы его заменим. Я выбрал в качестве разделителя символ "" (обратная косая черта). По началу я выбрал символ "=" (равно), но когда открыл файл в НЕХ-редакторе, то увидел (вы чуть ниже тоже увидите), что я поступил неверно, т.к. русские буквы шестнадцатеричного юникода это сплошные арифметические символы и знаки препинания. Лучшим разделителем в данном случае будет именно этот символ. После форматирования текста мы приводим его к такому виду:

Извините, вам запрещён просмотр содержимого спойлеров.


Для наглядности я выделил разделитель "". Сохраните изменения в файле. В итоге мы имеем:
1) файл mainframe_en.txt со строками на английском языке в виде списка;
2) файл mainframe_ru.txt с переводом на русский, строки в виде списка;
3) файл mainframe_ru_1string.txt, где все строки сведены в одну через разделитель "".
Все файлы в кодировке 1200 (UTF-16 LE).


Продолжим. Откройте файл mainframe_ru_1string.txt в редакторе HEX.

Извините, вам запрещён просмотр содержимого спойлеров.


Как видите знак "=" в качестве разделителя не подходит. В юникоде это часть русской буквы "н" (код [3D04]), а в кодировке ANSI ASCII байт 3D - это символ "=" (равно). :) Вот поэтому символ "" как раз отлично подходит. Теперь наша задача составить для новых строки таблицу смещений. Чтобы легче было ориентироваться по текстовой части, переключите отображение кодировки в НЕХ-редакторе на Unicode.

Извините, вам запрещён просмотр содержимого спойлеров.


Теперь, когда хорошо видно текст и разделитель "" между строками, можно легко составить таблицу смещений. Нулевая строка у нас "Информационный центр", а первая "Доступно обновление." Установите курсор на первую букву первой строки, т.е. 0000002А. Это и есть смещение на первую строку - 2A. Фактически для данного файла это является адресом строки.

Извините, вам запрещён просмотр содержимого спойлеров.


Откройте файл mainframe_ru.txt и для этой строки запишите смещение .

Вторая строка у нас "Инструменты". Установите курсор на первую букву и вы запишите смещение для этой строки - 54.

Извините, вам запрещён просмотр содержимого спойлеров.


Подобным образом запишите смещения для всех последующих строк. Символ слеша вам поможет быстро ориентироваться в текстовой части НЕХ-редактора. Созданный нами отдельный файл с переведенными строками, избавит нас от изнурительной работы по вычислению смещений. Именно поэтому требовалось провернуть всю эту работу. Я вас не заставляю поступать также, просто рассказываю свои действия и причину своих поступков. Если вы имеете другое мнение или опыт, поделитесь им.

В итоге, в файле mainframe_ru.txt у вас должна получиться такая табличка:

Извините, вам запрещён просмотр содержимого спойлеров.


После этого, в файле mainframe_ru_1string.txt, с помощью НЕХ-редатора можно выполнить замену нашего разделителя на тот, который используется в файле MainFrame.aui. Код символа обратного слеша - . Его меняем на код 00 (NUL).

Извините, вам запрещён просмотр содержимого спойлеров.


Получили вот такой файл:

Извините, вам запрещён просмотр содержимого спойлеров.


Теперь сделаем в файле MainFrame.aui замену блока строк на подготовленный нами. Откройте его также в НЕХ-редакторе. Перейдите на вкладку с файлом mainframe_ru_1string.txt и выделите все байты (кодировку редактора я снова переключил на ANSI ASCII):

Извините, вам запрещён просмотр содержимого спойлеров.


Обратите внимание на размер блока - 706 байт. Теперь скопируйте выделенные байты в буфер обмена, нажав клавиши [Ctrl+Shift+C]. Перейдите на вкладку с файлом MainFrame.aui выделите в нем текстовый блок с адреса 00004B40 по 0000524D включительно.

Извините, вам запрещён просмотр содержимого спойлеров.


Смотрим размер блока - 70Е байт. Наш блок на 8 байт меньше исходного, поэтому можно смело выполнить его замену. Установите курсор на начало выделенной области в файле MainFrame.aui (адрес 00004B40) и нажмите на клавиатуре комбинацию [Ctrl+B] - запись бинарных данных из буфера обмена на место выделенных. Подтвердите операцию.

Теперь необходимо подкорректировать конец блока, который мы вставили. Опуститесь в конец секции text. По различию цвета хорошо видно, где записаны новые данные, а где остались старые. Как вы помните наш блок со строками на 8 байт меньше оригинального. Требуется отделить разделителем NUL [00] (в юникоде [00 00]) конец новой секции от старой, иначе в последней строке при работающей программе появится мусор.

Извините, вам запрещён просмотр содержимого спойлеров.


Вы видите у нас там остаток от старых данных в виде цепочки байт 6Е00740073002Е00. Два байта [6Е 00] меняем на [00 00]. Остальные можно оставить без изменений. Я не стал рисковать заменой оставшихся байт на нули, т.к. просмотрев весь файл и увидел, что разделение между секциями ресурсов составляет 5 байт. Как поведет себя программа, если оно будет другим, я не знаю.

Наконец осталось перенести таблицу с новыми смещениями строк. Открываем рядом с окном НЕХ-редактора текстовый документ mainframe_ru.txt и переносим значения смещений. Здесь необходимо быть очень внимательным. Порядок записи смещений прямой.

Извините, вам запрещён просмотр содержимого спойлеров.


Сохраняем изменения в файле MainFrame.aui, но файл пока не закрывайте, возможно придется делать исправления.

Проверяем что у нас получилось, запустив программу:

Извините, вам запрещён просмотр содержимого спойлеров.


Видно, что текст с описанием работы в программе не помещается в отведенных границах. Укорачивать его не сильно хочется. Можно глянуть секцию шрифтов. Если помните, она тоже имеется в файле и размещается сразу секцией с текстом, который мы переводили. Закрываем программу и возвращаемся в редактор НЕХ. Переходим в секцию шрифтов. Принцип примерно такой же. Посмотрите на следующий рисунок:

Извините, вам запрещён просмотр содержимого спойлеров.


Просмотрите всю секцию и попробуйте визуально оценить данные, характеризующие размер шрифта. Я, например, обратил внимание на следующее:

Извините, вам запрещён просмотр содержимого спойлеров.


В любом случае придется экспериментировать. Здесь, наиболее часто, для остальных строк со шрифтами используется размер 0D (13), вероятно что-то вроде стандарта. Поэтому я, не долго думая, заменил байт 0F по адресу 00005463 на байт 0D.

Извините, вам запрещён просмотр содержимого спойлеров.


Сохранил изменения и запустил программу.

Извините, вам запрещён просмотр содержимого спойлеров.


Угадал... :) Теперь совсем другое дело.

В общем, думаю по такой технологии можно нормально перевести продукцию этого разработчика. Может чего не доглядел или не учел. Первый опыт был блин комом. Это второй блин - говорят знакомым. За вами остается третий блин. Дерзайте!

Если смотреть этот формат файла дальше, на примере MainFrame.aui, то в секции lyr находятся изображения. Правда эти изображения не имеют заголовков, что затрудняет их идентификацию (начало - конец рисунка). Но это с моей колокольни. У меня мало опыта по расшифровке ресурсов. Так что есть еще где развернуться пытливым умам и любителям "хочу все знать". Принимайте эстафету! Хотя, может я и не открыл Америки, и мои потуги на этом поприще выглядят жалкими по сравнению с действиями профессионалов, но могу вам сказать точно, что в моем багаже прибыло и я перешел на следующий уровень.

Желаю вам успехов!
Leserg
Кто ищет, тот всегда найдет!

pp0312



Надо пробовать (опять этот страшный НЕХ )

* Ваши права на сайте

    TinyPortal

  • Вы не можете создавать статьи.
  • Вы не можете изменять свои статьи.
  • Вы не можете писать комментарии.
  • Вы не можете управлять статьями.
  • Вы не можете загружать файлы в TPdownloads.
  • Вы не можете управлять TPlistimages.

    Simple Machines

  • Вы не можете удалять темы.
  • Вы не можете создавать темы.
  • Вы не можете отвечать на сообщения.
  • Вы не можете прикреплять файлы.
  • Вы не можете изменять свои сообщения.
  • Вы не можете удалять свои сообщения.

 аталог@MAIL.RU - каталог ресурсов интернет Яндекс.Метрика