Этот сайт создан как клуб русификаторщиков. Для нас существуют три основных правила.
1. Мы никому и ничего не должны!
2.Один пришедший на сайт толковый русификаторщик дороже всех пользователей.
3. Мы делаем русификаторы для своего сайта, но в оригинале ими могут пользоваться все в интернете.
Сегодня я хочу вас познакомить с ещё одним вариантом замены изображений в ресурсах приложения. В отличии от опубликованных ранее способов, с которой мне пришлось недавно столкнуться по просьбе одного пользователя. Интерфейс этой программы состоит в основном из графических интерактивных элементов.
Извлечь все картинки из файла программы Fotor.exe не проблема. Это можно сделать, например, с помощью утилиты MultiExtractor:
Рисунок 2
или утилитой Exeinfo PE:
Рисунок 3
В обоих вариантах общее количество извлеченных изображений получится около 1500! Допустим, что перерисовать (сделать надписи на русском) нужно не все изображения, а только часть из них (мне пользователь на замену прислал 252 файла). Встает вопрос: Как их заменить?
Есть три варианта:
1) Вручную при помощи НЕХ-редактора. Хм, вам никакого терпения не хватит это сделать, тем более очень просто допустить ошибку. Файлов для замены очень много и этим вариантом можно воспользоваться, если нужно заменить два-три рисунка, но не более. 2) При помощи утилиты MultiExtractor, правда она позволяет это сделать только по одному рисунку. Представьте, вам 252 раза необходимо найти изображение, которое вы собрались заменить, потом открыть проводник, найти изображение, которым собрались выполнить замену, и после этого, собственно, выполнить операцию по замене. Из-за специфики наименования извлеченных файлов, после 4-5 десятков операций с заменой, у вас будет рябить в глазах, что, конечно же, снова приведет к ошибкам. А если рисунки действительно необходимо заменить все (1500)? 3) Пакетный режим, когда выполняется замена все рисунков одним махом (раз и готово). Вот этот вариант более интересен, его и рассмотрим.
Итак, нам необходим инструмент, который позволит выполнить пакетную замену изображений в ресурсах приложения. Оказывается есть такой, знакомьтесь: Ravioli Game Tools, автор Stefan Mayr. Последний релиз на сегодняшний день - v2.8 от 22 декабря 2013 года. Программа предназначена для исследования, анализа и извлечения файлов из архивов с игровыми ресурсами. Также позволяет заменить определенные типы данных (изображения, аудио, видео и т.д.), тем самым выполнив модификацию исходного файла. Содержит три инструмента:
Ravioli Explorer - просмотр и извлечение данных архивов; Ravioli Extractor - излечение данных архивов; Ravioli Scanner - сканер неизвестных форматов файлов.
]Внимание! Инструменты довольно специфичные и заточены под данные определенных игр. Список поддерживаемых игрушек и архивов с ресурсами довольно внушительный, но что такое исполняемый файл (ехе) программа не знает. Но её можно обмануть. Из этого набора воспользуемся утилитой Ravioli Scanner. Принцип работы в ней следующий. Загружаем исследуемый файл. Если в нем есть необходимы нам данные, то извлекаем их в отдельную папку. Затем редактируем необходимые файлы, оставив низменными оригинальные имена. Причем, размер отредактированных ресурсов должен быть или меньше оригинальных размеров, или быть равен исходным. Если размер будет больше, то замена выполнена не будет. После чего указываем утилите папку с извлеченными и изменёнными файлами и она выполнит соответствующую замену. Все просто, а на практике...
Для начала загрузим (кнопка "New scan..." на панели инструментов) в неё наш файл Fotor.exe. Программа выполнит его анализ и...
Рисунок 4
ничего не найдет. :( Но мы то знаем, что там полно изображений! Как же так?
Будем превращать исполняемый файл Fotor.exe в неопределенный набор данных. Идея состоит в том, чтобы с помощью НЕХ-редактора найти в теле файла адрес изображения, которое будет начальным для всех последующих изображений в массиве данных. После чего сохраняем оставшуюся часть данных в отдельный файл и загружаем его в утилиту Ravioli Scanner.
Небольшое отступление. Вы знаете, что самые распространенные форматы изображений BMP, GIF, JPG, PNG. Обычно эти форматы используются при разработке приложений. Чтобы узнать, есть ли в исследуемом файле хоть какое-то изображение, произведите в НЕХ-редакторе поиск сигнатуры соответствующего формата. Например, изображение в формате PNG можно найти по сигнатуре - 89504E47 (‰PNG). Причем, если далее вы видите наименования чанка IHDR, то знайте, что перед вами точно данные изображения PNG, т.к. он является обязательным для этого формата. Заканчивается блок с данными формата PNG сигнатурой - 49454E44AE426082 (IEND®B`‚). Сигнатуры других форматов вы можете узнать и изучить простым открытием файла изображения в НЕХ-редакторе.
Так вот, откроем файл Fotor.exe в НЕХ-редакторе и зададим поиск сигнатуры формата PNG:
Рисунок 5
Мы окажемся на первом найденном вхождении. Но это точно не рисунок в формате PNG, через несколько байт снова будет последовательность байт с сигнатурой PNG (второе вхождение). Нажмите клавишу [F3] (продолжить поиск) и редактор остановится на ней. Вот здесь уже есть наименование чанка IHDR, а через несколько десятков байт ниже есть сигнатура окончания данных PNG.
Рисунок 6
Но к сожалению, нам это место не подходит. Во-первых, сам рисунок очень мал (всего 103 байта) и редактировать там нечего. Можете для интереса сохранить весь блок (показан рисунке выше) в отдельный файл и посмотреть что там. Во-вторых, перед начальной сигнатурой PNG-данных должен быть указан размер всего изображения, значение 67h (103 байта), но этого нет. Нам необходимо найти полноценное изображение, поэтому продолжим поиск - [F3].
Перед нами третье найденное вхождение. Но это тоже не рисунок. Отсутствует имя чанка и размер изображения.
Рисунок 7
Идем далее - [F3]. Четвертое найденное вхождение. Случай аналогичный предыдущему.
Рисунок 8
Ведем поиск далее - [F3]. Пятое найденное вхождение. А вот это уже наш клиент! Посмотрите внимательно на данный участок байт. Есть размер изображения - 119Сh (281 байт), есть имя чанка IHDR, и конечно же есть конец данных PNG.
Рисунок 9
Итак, вы немного познакомились в данными формата PNG и теперь должны безошибочно их определять в массиве байт. Если бы изображение было одно, то прямо здесь же можно было выполнить его замену. Но перед нами другая задача, поэтому продолжим. Мы нашли первое полноценное изображение, значит далее, до конца файла, находятся все остальные. Сохраним эту часть файла Fotor.exe в отдельный файл. Я предлагаю начать не с самого рисунка, а с нулевой позиции для найденного смещения с данными PNG, т.е. с @007D2F20. Установите курсор на байт В0, затем щелкните правой кнопкой мышки и выберите в контекстном меню команду "Beginning of block" (можете воспользоваться горячими клавишами [Alt+1]). Так мы устанавливаем начало блока, который будет выделен.
Рисунок 10
Если перед этим вы ничего в редакторе не выделяли, то будут автоматически выделены все данные до конца файла. В противном случае, перейдите в конец файла, и на последнем байте установите метку конца блока (команда контекстного меню "End of block" или горячие клавиши [Alt+2]).
Рисунок 11
Теперь сохраним выделенный блок в отдельный файл. Для этого в меню программы "Edit" выберите команду "Copy Block" -> "Into New File" (копировать блок в новый файл):
Рисунок 12
При сохранении файла укажите имя Fotor.dat (расширение dat от англ. слова "data" (данные)). Для удобства можете поместить файл в отдельную папку. Редактор сохранит данные в файл и откроет его. Он нам пока здесь не нужен, поэтому закройте файл.
Вот теперь, полученный файл Fotor.dat можно загрузить в утилиту Ravioli Scanner. Но сначала выполните следующие настройки:обязательно отметьте параметр "Show Unknown Files Parts" (Показывать неизвестные части файлов):
Рисунок 13
После этого загрузите файл Fotor.dat. Программка выполнит его анализ и... покажет кучу найденных изображений! Здорово, что нам и требовалось.
Рисунок 14
Создайте в удобном месте на диске папку (например, "Image") и выполните в неё извлечение всех найденных ресурсов. Для этого воспользуйтесь кнопкой "Extract All..." на панели инструментов. Внимание! Будут также извлечены все неизвестные данные с именами Unkn0001.dat, Unkn0002.dat и т.д. Ни в коем случае не удаляйте их, не переименовывайте, не редактируйте. Иначе замена будет невозможна. Просто не обращайте на них внимание, работайте с опознанными ресурсами. Еще могут быть ошибочно определенные ресурсы, в этом случае к имени файла добавляется строка "-broken". Также не обращайте на них внимания и не пытайтесь с ними что-то сделать!
Рисунок 15
Готово. На всякий случай сделайте копию папки с извлеченными ресурсами и можете приступать к редактированию изображений. Самое главное не изменяйте наименование файлов, которые присвоил Ravioli Scanner, также не удаляйте их!
Рисунок 16
Так как изображений много и процесc их редактирования займет у вас определенное время, то рекомендую сохранить результаты сканирования в файл проекта (желательно в том же каталоге, где находится исследуемый файл), например Fotor.rsr. Позже вы выполните его загрузку и сможете продолжить работу в Ravioli Scanner.
Рисунок 17
Также ничего не делайте с исходным файлом, по которому выполнялся анализ и извлекались ресурсы (не изменяйте, не перемещайте, не удаляйте), иначе придется начинать все заново.
При редактировании изображений старайтесь сделать так, чтобы их размер получался меньше или, по крайней мере, был равен исходным размерам. Не рекомендуется использовать Photoshop. Он безбожно раздувает формат своими ватермарками и копирайтами. Отличным редактором, например, является Paint.Net, поверьте, в нем тоже можно создавать шедевры. Если же все таки размер файла получился больше, то воспользуйтесь утилитами по оптимизации графики, например Caesium и т.д.
Если ранее вы извлекли изображения при помощи утилиты MultiExtractor или Exeinfo PE, и уже отредактировали их, то вам необходимо выполнить их переименование согласно именам, которые создал Ravioli Scanner при извлечении. То есть вам необходимо будет сопоставить файлы между собой и выполнить соответствующее переименование. Не ошибитесь и будьте внимательны.
Ну вот, необходимые изображения отредактированы и лежат в папке извлечения, с которой работал Ravioli Scanner. Все готово для пересборки данных. Откроем программу и загрузим в неё файл проекта (в нашем случае файл Fotor.rsr). Для этого щелкните по кнопке "Results" на панели инструментов и выберите пункт "Load Scan Results...":
Рисунок 18
Данные будут загружены и теперь можно приступить к замене изображений. Щелкните на панели инструментов по кнопке "Combine...".
Рисунок 19
Откроется окно выбора папок с извлеченными данными. По умолчанию программа предложит папку, в которую было выполнено извлечение. Если это так, то нажите ОК. Если вдруг вы сделали копию этой папки и работали в ней, то тогда укажите её. Начнется процесс пересборки. При этом программа будет каждый раз спрашивать, что делать с тем или иным ресурсом из-за различий исходного и нового размеров того или иного файла.
Рисунок 20
В данном случае нужно ответить утвердительно (Да), чтобы утилита дополнила файл нулевыми байтами до оригинального размера. Если размер отредактированного файла будет равен оригинальному, то утилита молча выполнит его замену. Если размер нового файла окажется больше исходного, то вы получите сообщение, что размер такого-то файла больше оригинального и он будет пропущен. Вы должны запомнить или записать имя файла, чтобы проверить и оптимизировать его. После чего повторить пересборку.
Из недостатков утилиты можно отметить, что нет возможности указать подтверждение для всех файлов на дополнение до исходного размера в случае, если он меньше. Придется каждый раз щелкать "Да". Но согласитесь, это намного проще, чем корячиться с заменой вручную.
После того как вы прощелкаете все подтверждения, будет показан диалог сохранения файла. Рекомендую указать другое имя файла, дописав к имени тире (-) или подчеркивание (_). Также на забудьте указать расширение dat файла через точку, например Fotor-.dat. Наконец сохраните файл. Проверьте размер файла - он должен быть таким же, как у исходного файла. Вы сами прекрасно понимаете, что с первого раза никогда не получается. Или забыли оптимизировать изображение, чтобы уменьшить размер, или картинка в программе выглядит некачественно и требует доработки, или сделали опечатку в графическом тексте. В общем, выполняете обычный процесс отладки локализации. А так, вы потом в любой момент можете снова загрузить проект и сделать новую пересборку ресурсов, пока не получите удовлетворительный результат.
Ну вот, мы потратили на замену не более 5 минут. Получили новый файл с данными Fotor-.dat. Теперь вернем эти данные обратно в состав исполняемого файла Fotor.ехе. Предварительно сделайте его резервную копию. Возвращаемся в НЕХ-редактор. Открываем файлы Fotor.ехе и Fotor-.dat. На вкладке с файлом Fotor-.dat выделяем все данные - горячие клавиши [Ctrl+A] - и копируем их в буфер обмена как НЕХ-значения - горячие клавиши [Ctrl+Shift+C]. Эти же операции можно выполнить при помощи команд в меню редактора.
Рисунок 21
Рисунок 22
Переключаемся на вкладку с файлом Fotor.ехе и переходим на смещение @007D2F20 (если помните, именно с этого адреса мы отрезали часть данных в отдельный файл Fotor.dat) и устанавливаем на нем курсор. Теперь записываем содержимое буфера обмена - горячие клавиши [Ctrl+B] - по указанному адресу смещения. Обратите внимание, НЕ "вставляем", а именно записываем! Эту же операцию можно выполнить при помощи команд в меню редактора.
Рисунок 23
Сохраняем файл и проверяем, что его размер по сравнению с файлом резервной копиии не изменился. Если размер отличается, значит вы что-то сделали неправильно. Повторите описанные выше действия не спеша и осознанно. В результате вы будете вознаграждены полученным результатом.
Рисунок 24
Итоги: Прежде чем браться за локализацию, определитесь, какие ресурсы требуют редактирования, сколько их, выполните анализ и исследуйте файл. Наметьте последовательность действий и выберите необходимые инструменты.
Например, c программой Fotor, сначала можно поработать с изображениями и выполнить их замену. Потом заняться локализацией исполняемого файла, в котором изображения уже заменены (создать проект Radialix, подключить карту ссылок для жестко-закодированных строк и т.д.). Так будет легче ориентироваться в программе при отладке перевода (вы сразу будете видеть, какие строки еще нуждаются в переводе). А можно поступить наоборот, сначала локализовать файл, выполнить отладку перевода и уже в самом конце сделать замену изображений. Только в этом случае для извлечения изображений нужно работать уже с локализованным файлом, а не с исходным.
Возможно, чтобы подготовить для утилиты Ravioli Scanner данные, которые она сможет однозначно распознать, от вас потребуются определенные знания, навыки и умения. Например, вы можете попытаться извлечь из исследуемого файла данные секций и загрузить их по отдельности в Ravioli Scanner. Это намного быстрее, чем искать в НЕХ-редакторе приемлемую для утилиты часть данных. В общем, вариатны могут быть самые разнообразные. Ищите, и найдете.
Спасибо Leserg, все получилось как и написано. Споткнулся сперва на одном месте) В Нех строчку дописывали помните? Кнопка Cancel, вот я как вспомнил про нее так сразу и все сделал. Моя ошибка была в неправильном IEND®B`
P/S 1.Подмена ресурсов (картинок) 2. Полный (по возможности перевод в Radialix+Hex) 3. И заканчиваем в OllyDBG
В моем же случае все началось с подключения к проекту Radialix"а IDA и локализация файла. Зная теперь, что как и куда, я повторил шаги в описанном выше 3 пунктах, так грамотнее будет...
Сообщение отредактировал dinis124 12 сентября 2014 - 18:09
Небольшое дополнение к этой статье. Я упустил в настройках утилиты Ravioli Scanner один параметр - "Ask For Scan Range" (Указывать диапазон для анализа):
После запуска утилиты отметьте эту опцию, тогда при загрузке файла будет показан диалог, в котором можно указать диапазон сканирования. Это позволяет задать определенную часть файла для анализа, если по каким-то причинам утилита не может сделать анализ всего файла. В итоге, в НЕХ-редакторе не нужно разбивать исследуемый файл на части, а можно сделать это в самой утилите. По умолчанию предлагается выполнить анализ содержимого всего файла, т.е. от начала файла до конца:
Поэтому смело загружаем в программу исполняемый файл, в нашем примере это Fotor.exe и указываем начальное смещение @007D2F20, которое было найдено при помощи HEX-редактора, и нажимаем ОК:
Утилита выполнит анализ и найдет все изображения:
Далее поступаем так, как описано в основной статье.
В программе данной нет строк с мусором как понятно, строки вообще не видно в Radialix.
Гм...
Создал проект Radialix+IDA для исполняемого файла. Действительно, нету строки "Cancel" ни в каком виде, хотя в IDA строка отображается корректно и на неё есть ссылки в количестве 25 штук. Уникальный случай. Остается один вариант - вручную в отладчике или в НЕХ-редакторе.
Берешь окончательный вариант локализованного файла (я так понимаю, что это тот файл, на который ты мне давал ссылку) и работаешь с ним. Через НЕХ редактор у тебя пример уже есть, поэтому покажу через отладчик - [url=http://x64dbg.com/ target="_blank" rel="noopener external">x64dbg.
Открываешь в отладчике файл Fotor_RUS.exe. Для начала введем перевод строки "Cancel" в секции, которую создал Radialix. Эта секция называется .data и является последней. В отладчике перейди на вкладку "Memory Map", найди файл fotor_rus.exe. Щелкни по секции .data правой кнопкой мышки и выбери в контекстном меню пункт "Follow in Dump".
рис. 1
Вернись на вкладку "CPU" и перейди в панель дампа. Здесь опустись в самый низ данных, где заканчиваются строки и начинается пустая область:
рис. 2
При вводе ACSII строк, между ними необходимо оставлять промежуток размером не менее 1 байта. При вводе Unicode строк - не менее 2-х байт. Так как нам необходимо добавить всего лишь одну строку, то её можно записать в любом пустом месте, например, по адресу 2514A20. Начиная с этого адреса выдели 12 байт (кодировка UTF-8, на одну букву - 2 байта, в строке "Отмена" - 6 букв: итого 6х2=12). После этого нажми клавиши [Ctrl+E]. Откроется окно изменения данных. В поле НЕХ-значений введи байты D09ED182D0BCD0B5D0BDD0B0 (строка "Отмена", кодировка UTF-8):
рис. 3
Подтверди изменения, нажав кнопку ОК. Запомни или запиши в блокнотик адрес, по которому будет находится переведенная строка - 2514A20. Это виртуальный адрес (VA).
Теперь перейди в область кода (выше панели дампа), просто щелкни в любом месте кода левой кнопкой мышки, и задай поиск всех строк (на панели инструментов есть кнопка "Az"). По окончании поиска отфильтруй строку "Cancel".
рис. 4
Сделай двойной клик по строке и отладчик автоматически перекинет тебя на вкладку "CPU" в место вызова строки.
рис. 5
Как видно, по адресу 11E16E1 находится инструкция push fotor_rus.2315BB4, которая выполняет запись строки в стек. Сама же строка "Cancel" находится по адресу 2315BB4. Адрес 11E16E1 является ссылкой, т.е. по нему выполняется какая-то инструкция обращения к строке по адресу 2315BB4. И нам необходимо поменять этот адрес на адрес, по которому мы записали перевод строки. Если помнишь это был адрес - 2514A20. Но прежде чем выполнять замену адреса, необходимо найти все ссылки на оригинальную строку. Для этого щелкни правой кнопкой по инструкции и выбери в контекстном меню команду "Find references to -> Address: 2315BB4".
рис. 6
Отладчик выполнит поиск и покажет список ссылок:
рис. 7
Всего 25 ссылок. Вот по всем найденным ссылкам необходимо выполнит замену адреса 2315BB4 на адрес 2514A20.
Итак, по адресу 2315BB4 у нас находится оригинальная строка "Cancel", а по адресу 2514A20 мы ввели перевод этой строки. Соответственно, чтобы вместо строки "Cancel" в программе была использована строка "Отмена", нам и нужно выполнить замену адреса строки по всем ссылкам.
Делаем замену адреса. Сделай двойной щелчок по первой ссылке в списке. Отладчик перебросит тебя в код программы. Находясь на инструкции обращения к строке "Cancel", нажми клавишу [Space](Пробел). Откроется окно редактирования инструкции. Здесь вместо адреса 2315BB4 введи адрес 2514A20 (можно использовать команды Windows копировать/вставить) и подтверди изменения.
рис. 8
Вот как должно получится (см. рис 9). Теперь инструкция по адресу 11E16E1 будет обращаться к строке "Отмена", которая находится по адресу 2514A20. Обрати внимание как записаны байты адреса в инструкции вида НЕХ - задом наперед!
рис. 9
Подобным образом выполни замену адресов по всем остальным ссылкам, только будь внимательным.
Когда закончишь, сохрани сделанные изменения в новый файл, например, под именем Fotor_RUS_1.exe. Для этого воспользуйся инструментом "Patches":
рис. 10
После проверь программу в работе. Если сделал все правильно и не ошибся, то увидишь переведенный вариант строки.
Берешь окончательный вариант локализованного файла (я так понимаю, что это тот файл, на который ты мне давал ссылку) и работаешь с ним.
Да, это окончательный перевод. Осталось исправить только Cancel.
Первое на чем хотелось бы акцентировать внимание, почему открывая идентичный файл Fotor_RUS.exe в x32_dbg.exe я получаю отличные от ваших адреса.
P/S Четыре раза подряд открывал Fotor_Rus.exe в отладчике, все 4 раза адреса разные. Но это не столь проблематично нежели скриншот ниже. Почему так, не могу понять.
Теперь перейди в область кода (выше панели дампа), просто щелкни в любом месте кода левой кнопкой мышки, и задай поиск всех строк (на панели инструментов есть кнопка "Az"). По окончании поиска отфильтруй строку "Cancel".
Проблема решилась переходом в Memory Map
В процессе работы где то допустил ошибку, обе кнопки Cancel не содержат текста и просто голые)) Будем править.
Собственно на этом я и закончил изучение и повторение вашего урока. В качестве Module: подгружается не Fotor_Rus.exe а библиотека dll
P/S Проблема описанная выше с приведенным скриншотом решена.
Теперь перейди в область кода (выше панели дампа), просто щелкни в любом месте кода левой кнопкой мышки, и задай поиск всех строк (на панели инструментов есть кнопка "Az"). По окончании поиска отфильтруй строку "Cancel".
Проблема решилась переходом в Memory Map
В процессе работы где то допустил ошибку, обе кнопки Cancel не содержат текста и просто голые)) Будем править.
Но это не столь проблематично нежели скриншот ниже. Почему так, не могу понять.
Потому что в окно отладки у тебя загружен файл ntdll.dll, а не файл Fotor_RUS.exe.
Перейди на вкладку "Memory Map", найди там файл Fotor_RUS.exe, выдели секцию .text и отправь её в дизассемблер (клавиша Enter). После этого выполняй необходимые операции. На будущее нужно смотреть, какой именно модуль загружен в окно дизассемблера. Любая программа имеет зависимости от системных библиотек, и чтобы её можно было отлаживать отладчик загружает все файлы, от которых зависит работа исследуемой программы.
Leserg, Привет. Перевод завершен. Твое предположение что дело в win 7 оправдалось. Стоило начать работать в отладчике на windows XP как все встало на свои места. Файл корректно патчится и работает. Еще раз спасибо за помощь и знакомство с новым хорошим инструментом. В нем в разы меньше телодвижений чем в Оле.