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

Анализ ресурсов программ от ArcSoftУдлиняем строки в пределах возможногоСкажу сразу, работа предстоит кропотливая, требующая внимательности
  1. Оффлайн

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 929

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1596

    Был: 2024-04-28 00:36

    Лайков: 140

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



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


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

    Рассматриваем программу MediaConverter 7.5. Я не стану описывать поиск строк и ресурсов для перевода. Думаю вы с этим справились без меня и уже знаете, что ресурсы программы находятся в файлах с расширением *.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
    Сообщение отредактировал WYLEK 29 января 2023 - 14:50

    Кто ищет, тот всегда найдет!

    26 октября 2012 - 10:39 / #1
  2. Оффлайн

    pp0312

    Звание: Бывалый

    Мастер

    Сообщений: 172

    Создано тем: 24

    Рейтинг: 4

    Репа: (30|30|0)

    Баллы: 51

    Страна: не указана!

    Был: 2024-05-03 17:11

    Лайков: 25



    Надо пробовать (опять этот страшный НЕХ )
    Сообщение отредактировал 1 сентября 2017 - 18:43
    26 октября 2012 - 11:39 / #2
  3. Оффлайн

    Xotabush

    Звание: Сталкер

    Участники

    Сообщений: 118

    Создано тем: 4

    Рейтинг: 3

    Репа: (1|1|0)

    Баллы: 66

    Страна: не указана!

    Был: 2024-03-29 14:30

    Лайков: 1

    Сразу всё и не запомниш.Надо пробывать всё по очереди :o.
    Сообщение отредактировал Xotabush 26 октября 2012 - 19:55
    26 октября 2012 - 19:12 / #3
  4. Оффлайн

    WYLEK

    Звание: Легенда

    Админ

    Сообщений: 2179

    Создано тем: 315

    Рейтинг: 10

    Репа: (245|245|0)

    Баллы: 3405

    Был: 2024-04-28 20:29

    Лайков: 196

    Ты все таки добил это расширение! Кстати, такое построение кода ресурсов я уже встречал с другим расширением вроде. Это был плагин какой то для фото. На стрельце сейчас перерыл все новости одного модера, но не нашел этой проги. Я тогда поцапался с ним из-за гоблинов в переводе этой проги. Начал было переводить этот плагин (пошел по такому же пути как ты), но, ресурсов много, и вручную лопатить желание пропало. А благодаря твоему толковому и подробному мануалу, возможно и найдется желающий положить на лопатки этих парней с ихним расширением! А может и сам сделаешь перевод этого конвертера.

    26 октября 2012 - 22:10 / #4
  5. Оффлайн

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 929

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1596

    Был: 2024-04-28 00:36

    Лайков: 140

    А может и сам сделаешь перевод этого конвертера.

    Нет, я не буду. Даю возможность сделать это другим. Тем более у этого разработчика довольно широкий арсенал программ. Перефразирую крылатое изречение: "Налетай, торопись, переводи ... живопись!".

    Кто ищет, тот всегда найдет!

    27 октября 2012 - 00:28 / #5
  6. Оффлайн

    ruslangxp

    Звание: Ветеран

    Администратор

    Сообщений: 1378

    Создано тем: 137

    Рейтинг: 8

    Репа: (220|220|0)

    Баллы: 9396

    Страна: не указана!

    Был: 2024-05-01 23:54

    Лайков: 207

    Да уж сложно все это запомнить а уж русифицировать подавно сложно

    @RuslangXP

    27 октября 2012 - 18:41 / #6
  7. Оффлайн

    ruslangxp

    Звание: Ветеран

    Администратор

    Сообщений: 1378

    Создано тем: 137

    Рейтинг: 8

    Репа: (220|220|0)

    Баллы: 9396

    Страна: не указана!

    Был: 2024-05-01 23:54

    Лайков: 207

    тут нашел одну старую прогу еще 2007 XP по локализации .aui AGE3D UI Editor Beta - попробовал в ней хоть один aiu так ни чего в ней не понял, кто знает тот может поимет

    @RuslangXP

    29 октября 2012 - 19:21 / #7
  8. Оффлайн

    WYLEK

    Звание: Легенда

    Админ

    Сообщений: 2179

    Создано тем: 315

    Рейтинг: 10

    Репа: (245|245|0)

    Баллы: 3405

    Был: 2024-04-28 20:29

    Лайков: 196

    тут нашел одну старую прогу еще 2007 XP по локализации .aui AGE3D UI Editor Beta - попробовал в ней хоть один aiu так ни чего в ней не понял, кто знает тот может поимет


    Это не тоsad

    >>Данная программа позволяет вам разрабатывать и составлять виджеты и окна, используя на экранные формы, используя такие же виджеты, которые будут использованы в вашем приложении. Компоненты созданные с UI Editor могут быть просмотрены, так что вы можете убедиться в том, что они выглядят так, как вам надо. Важной функцией является возможность интегрирования GUI в вашу графическую сцену и визуализация сцен в ваш GUI, (например: графические окна).

    Файловый формат .aui используется UI Editor как XML файл, который описывает все виджеты, добавленные к вашему проекту.<<

    29 октября 2012 - 22:13 / #8

Статистика форума, пользователей онлайн: 0 (за последние 20 минут)

---
Создано тем
1177
Всего сообщений
15352
Пользователей
17856
Новый участник
Daniel7375ysk