Работа с HEX-редактором на примере хака CocoonJS

Сообщение Работа с HEX-редактором на примере хака CocoonJS
» 10 мар 2013, 09:10

*использовалась версия CocoonJS от 10.03.2013

В моей статейке Экспорт на мобильные платформы при помощи CocoonJS я добавил хак библиотеки CocoonJS, который убирает их логотипы. После чего в личку стали поступать вопросы о том, как я это сделал и, как сказал один из: "Не собираюсь хакать, но мне просто интересно!". Ну, что ж... выходной день, времени полно, погода пасмурная, настроение сонное... почему бы и нет?

Все действия описанные ниже производились и поясняются только с общеобразовательного интереса! Если вы собираетесь покупать или распространять свои игры созданные на С2 и CocoonJS - оставляйте всё как есть и покупайте все необходимые лицензии.

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

И так, для работы нам понадобится простой текстовый редактор (Блокнот, да:) но я использую AkelPad и редактор в файловом менеджере FAR) и сам HEX-редактор. А что это такое вообще? Википедия вам в помощь!
Прежде чем я выбрал какой НЕХ-редактор использовать - я решил просто просмотреть файл libCocoonJSLib.so. Почему именно его? Да, к этому я пришел не сразу... ведь моя цель - убрать картинку с логотипом, а где она спрятана - неизвестно. После декомпиляции APK (о чем я описал в статье по первой ссылке), я просмотрел все файлы... ни в одном из читаемых файлов не было ни единой ссылки на какие-либо картинки, кроме моих собственных. Вывод очевиден - логотипы вшиты в какой-то из не читаемом (бинарном) файле. Но в каком? Благо, что таких файлов было не много и по логике вещей первым делом решил просмотреть именно libCocoonJSLib.so, просто потому, что он самый большой и потому, что в нем говорящее само за себя название "Библиотека CocoonJS". Открываю его в блокноте и вижу что-то типа того:
Изображение

Ага... интересно. А вдруг среди всего этого хаоса все таки есть картинка? Я был уверен, что формат у картинки именно PNG т.к. именно этот формат советовался для использования сплаш-скринов, поэтому первым делом я решил попробовать распознать именно его. Но как? Для начала надо бы узнать, как выглядит PNG в не читаемом виде (прошу прощения за не совсем крутые термины). Для этого я открыл блокнотом несколько PNG картинок.
Изображение
Изображение

Все они начинались и заканчивались одинаково! Обратите внимание на скриншоты... видите, в самом начале *закорючка* затем PNG, а потом уже пошел всякий шлак. Так вот *закорючка*PNG - это метка начала любого PNG - файла! А вот чем они заканчиваются:
Изображение
в конце всегда IEND и некий набор символов.

Возвратившись к файлу библиотеки CocoonJS я ввел в поиск эти символы и нашел аж 5 совпадений!!! Т.е. в нем явно вшито 5 тел PNG-изображений! А вдруг я ошибаюсь? Не может же быть так просто... ведь эти данные должны быть зашифрованы, ну, не знаю, я бы зашифровал. Нужно было убедиться наверняка, что это действительно изображения, причем в чистом виде! Как это сделать я знал сразу - нужно просто выделить тело одного из файлов и сохранить его отдельно, а затем получившийся файл открыть в просмотрщике изображений и если я прав - то увижу какое-то изображение, в лучшем случае и сам логотип!
Задача проста, вот только тело файлов очень большое... если делать это в текстовых редакторах. Представьте себе, что вам нужно выделить точно, от точки до точки, кусок из 3000 страниц какой-то книги, которая состоит из миллионов страниц. Как вы себе это представляете в текстовом редакторе?))) Да никак... регулярные выражения здесь тоже не помогут. Нужен хороший HEX-редактор, который работает с байтами, а не с текстовой информацией.

Я попробовал несколько редакторов - всё не то. В итоге мой выбар пал на Hex Editor Neo. Полнофункциональная версия доступна в течении 14 дней. Русский язык есть! Да и бесплатных функций нам хватит за глаза... Так что качаем его и ставим. Такие банальные вещи уже подсказывать не буду=)) Скажу только, что во время установки я выбрал режим Advanced User. Предположим у вас он уже стоит - едем дальше...

Открываем в нашем редакторе файл библиотеки.
Изображение

Жмем Ctrl+F и ищем начало первого графического файла:
Изображение
Помните закорючку (что-то вроде знака %) которая должна быть перед PNG? Вот ищем сочетание PNG до тех пор, пока не увидим перед PNG этот самый %. Т.е. то, что на скриншоте - это пример не нужного нам фрагмента, ищем дальше, нажимая F3. Для более точного совпадения я снял галочку перед опцией "Без регистра", чтобы он искал png только ВЕРХНЕМ регистре.

О! Что-то нашлось!
Изображение

В этом замечательном редакторе есть возможность делать закладки! Давайте-как её сделаем, а затем поищем конец найденного фрагмента.

Выделяем начало фрагмента и создаем закладку:
Изображение

Ищем далее конец файла. Как он заканчивается, помните? IEND!
Изображение

Жмем снова на кнопку создания закладки и теперь у нас их две! Можно легко переключаться между фрагментами! В нашем случае между началом и концом! Круто, попробуйте;) Просто кликайте на них:
Изображение

Теперь нам нужно вытащить это тело и сохранить в новом файле! Для этого нам нужно выделить фрагмент от начала и до конца! Но, прежде чем мы это сделаем....
Изображение
Кликнем правым ухом в левый столбик и выберем опцию "Десятичный", для более лёгкого счета размера выделения! Запишите номер строки (хоть это и не правильно, но для лучшего восприятия будем называть это номерами строк), на которой находитесь. У меня это 5 653 812:
Изображение

Теперь идем к концу фрагмента (тыкаем на закладку №2) и записываем его строку:
Изображение
6 190 812

Далее открываем калькулятор и решаем: 6 190 812 - 5 653 812 = 537000
Зачем? Сейчас поймете.

Идем снова к началу файла (закладка №1) и теперь идем в меню "Выделение" и выбираем этот пункт:
Изображение
Выделить область.

Делаем все как у меня и жмем ОК:
Изображение
Здесь скажу лишь, что "Смещение" - это и есть "строка", но здесь имеется в виду смещение байта (о чем было описано в википедии). А то, что мы посчитали на калькуляторе - это размер выделения! Т.е. начиная от смещения 5 653 812 мы выделяем еще 537000 байт вниз.

В моем случае начало выделилось хорошо:
Изображение

А вот конец не до конца:
Изображение

Это потому, что я допустил ошибку... надо было брать на одно смещение больше=) Ну, ничего! В этом офигенски удобном редакторе можно дополнять выделения! Просто ткните мышкой в 00 и перетяните до 49 как показано на скриншоте:
Изображение
Если не получилось - не беда! Эти символы и дописать можно....

Ну, что ж... что же мы такое выделили? Давайте посмотрим! Жмем Файл - Новый файл или CTRL+N
Изображение

Переходим на закладку с нашим прошлым файлом, тыкаем правым ухом на наше выделение и жмем Копировать!
Изображение

Теперь идем к нашему новому файлу, тыкаем на первый байт правым ухом и теперь выбираем Вставить!
Изображение

Всё... теперь жмем Файл - Сохранить как... В появившемся окне жмем "Да" и сохраняем файл с расширением PNG!
Изображение

Поздравляю! Вы совершили самое настоящее хакерство=)))

А чтобы быть совсем уж крутыми, давайте заменим это изображение на свое?

Прежде чем начать - обратите внимание, что сразу же после окончания нашего файла, начинается другой файл!
Изображение
Это файл изображения для ландшафтной ориентации! Как его выделить и вытащить - вы уже знаете!

Для начала нам нужно создать или найти то изображение, на которое мы будем заменять логотипы. Можно создать изображение в пэинте... размеры изображения не важны, но не должны превышать 537 килобайт. Точнее... это возможно, но давайте не будем усложнять себе задачу=)

Я создал такое изображение:
http://j-p-g.net/if/2013/03/10/0250517001362895504.png

Что делаем дальше? Дальше всё просто... Выделяем фрагмент, который будем заменять. Например, тот же самый, что мы выдернули.
Жмем кнопку "Залить" делаем всё как у меня:
Изображение
Мы залили фрагмент нулями. Т.е. всё, на месте картинки уже ничего нет...

Теперь жмем Правка - Вставить файл.
Изображение
И выбираем, например, ту картинку, которую вы скачали по моей ссылке выше.

Всё! Теперь вы можете сохранить редактируемый файл, скомпилировать новый APK и проверить свою работу. Напоминаю, что статья про работу с APK-файлами лежит здесь: viewtopic.php?f=4&t=444

Теперь вы поняли, как в Зионе читают матрицу?;)
Последний раз редактировалось virusfun 19 апр 2013, 01:59, всего редактировалось 2 раз(а).
Большое спасибо всем, кто пишет мне респекты в ЛС! Очень рад, что до сих пор мои советы, примеры и уроки пользуются спросом... Но, к сожалению, я уже давно не занимаюсь разработкой игр и программированием вообще, поэтому я уже не лучший советчик в этом деле, да и времени совсем нет. Здесь на форуме я уже практически не бываю, но всегда открыт для общения в ВК: vk.com/virusfun
Но хоть меня здесь почти нет, мне все равно будут приятны ваши отзывы и плюсы [+]
Аватара пользователя

Игродел
Сообщений: 891
Я тут с 23 сен 2012, 14:51
Откуда: Хабаровск