Обратная разработка позволяет не только разобраться в существующих приложениях, но и модифицировать их. В этом смысле приложения на Android — клад для начинающего хакера и настоящий аттракцион для любителя. Сегодня мы разберем несколько приложений, чтобы потренироваться в реверс-инжиниринге и узнать о подлинных возможностях твоего смартфона.Какое приложение мы будем препарировать?
Я выбрал для своих целей VK Admin — программу для управления сообществами «ВКонтакте» со смартфона. В нем не предусмотрена темная тема, поэтому мы с тобой попробуем эту тему добавить.
Собираем и разбираем
Сначала извлечем все ресурсы приложения, используя утилиту apktool — она распаковывает и запаковывает файлы пакетов APK, которые хранятся в сжатом, бинарном виде, и дизассемблирует программный код, заключенный в них.Чтобы получить установочный пакет, можно воспользоваться Android Debugging Bridge — системой для отладки программ на устройстве. В *nix-подобных системах ADB ставится стандартно, с помощью пакетного менеджера, а в Windows — идет в составе Android Studio или Android SDK Platform Tools.В первую очередь установим приложение из Google Play Store на смартфон, подключим его к компьютеру с помощью USB, затем воспользуемся ADB для переноса пакета приложения на компьютер и извлечем его содержимое.
Как пользоваться IDA PRO. Как найти оффсеты в любой игре
Для создания подписи в первый раз нужно воспользоваться утилитой keytool (входит в Java Development Kit ):
Меняем цветовые схемы
Цвета в приложении можно настроить несколькими способами:
Все эти способы жизнеспособны и постоянно используются.
colors.xml
Цветовая палитра приложения содержится в файле com.vk.admin/res/values/colors.xml . Структура файла выглядит так:
styles.xml
В файле com.vk.admin/res/values/styles.xml заданы цвета, но только некоторые. Этот файл используется самими разработчиками, когда они хотят сделать несколько цветовых схем приложения. Если же этих схем нет, работать приходится нам с тобой.
Некоторые цвета текста и фона заданы именно здесь, поэтому их нужно изменить аналогично с colors.xml .
Layout
В папке com.vk.admin/res/ находятся описания экранов приложения.
- com.vk.admin/res/layout/ — универсальное хранилище экранов для всех смартфонов. Если нет каких-то специальных указаний, то будут использованы эти ресурсы;
- com.vk.admin/res/layout-v«XX (где XX — версия SDK смартфона, зависит от версии Android на устройстве) используются для работы с самыми передовыми элементами UI;
- остальные com.vk.admin/res/layout-. задают специфичные экраны приложения для ориентации устройства, разрешения и так далее.
Некоторые цвета приложения, чаще всего задний фон, можно найти здесь и изменить.
Но закончить мы пока не можем — есть некоторые экраны, цвет фона и текста которых задан не в файлах .xml, а прямо в исполняемом коде приложения. Туда нам и дорога.
Smali
Внутри приложений на Android используется собственный формат файлов — .dex , или Dalvik EXecutable , и собственная виртуальная машина, чтобы эти файлы исполнять, — Dalvik .
ВВЕДЕНИЕ В РЕВЕРСИНГ С НУЛЯ С ИСПОЛЬЗОВАНИЕМ ИДА ПРО. ЧАСТЬ 1.
Как и с любым компилируемым языком, для .dex есть байт-код — smali — человекочитаемый и понятный с первого взгляда.
Машина Dalvik, в отличие от JVM , — регистровая, а не стековая. Регистры не имеют типов и могут хранить всё: числа, строки, экземпляры классов. При этом язык smali строго типизирован.
Вот небольшая последовательность инструкций, чтобы вывести содержимое регистра v0 в лог.
- const-string v1, «MyTag» — записать в регистр v1 строку «MyTag» .
- invoke-static , Ljava/lang/String;->valueOf(I)Ljava/lang/String; — вызвать функцию String.valueOf(v0) . Здесь static означает, что функция встроена в виртуальную машину; — список аргументов; L показывает, что сразу за ним идет название объекта, класса и так далее; java , lang , String; — тип строки; I — тип числа, Integer; а все вместе ( ->valueOf(I)Ljava/lang/String; ) говорит нам о том, что вызывается функция valueOf от одного аргумента и возвращает она строку.
- move-result-object v2 — записать результат предыдущей операции в v2 .
- invoke-static , Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I — залогировать содержимое v2 под тегом из v1 .
Если не удается понять, что значит тот или иной регистр или что делает та или иная функция, используй декомпилятор smali в Java — Jadx .
Интуитивно понятный интерфейс Jadx
Использовать Jadx просто — нужно лишь выбрать файл и открыть его, код будет автоматически декомпилирован и показан.
Рекомендую ознакомиться с документацией по байт-коду Dalvik VM.
setBackgroundColor
Для некоторых экранов приложения используется параметр setBackgroundColor(I)V , который устанавливает цвет фона. Часто это не статичные экраны, а динамические: с поддержкой скролла, различные списки и карточки.
invoke-virtual , Landroid/webkit/WebView;->setBackgroundColor(I)V
Эта строка занимается изменением. Чтобы изменить цвет, нужно его записать в регистр, а затем передать в функцию вместо настоящего.
const v12, -0x1000000 #### Эквивалент 0xFF000000 — черного invoke-virtual , Landroid/webkit/WebView;->setBackgroundColor(I)V
Теперь пройдись по всем файлам и замени цвет.
Бывают случаи на порядок проще.
const v2, -0x1 #### Здесь -0x1 == 0xFFFFFFFF — белый цвет invoke-virtual , Landroid/support/v7/widget/CardView;->setBackgroundColor(I)V
Нужно просто изменить -0x1 на -0x1000000 , и приложение погрузится во тьму.
Стоит быть внимательным и пытаться разобраться в коде: иногда оптимизатор кода будет перемещать инструкции const вверх, и ты можешь их не заметить.
setTextColor
Иногда текст, который меняется в ходе работы с приложением, может менять свой цвет. За это отвечает параметр setTextColor(I)V , второй аргумент которого можно подменить на нужный, в нашем случае — белый.
#### Меняем цвет const p1, -0x1 #### на белый invoke-virtual , Landroid/widget/TextView;->setTextColor(I)V
На этом борьбу со светлым фоном и ярким экраном можно закончить. Большинство элементов экрана поменяли свой цвет на противоположный. Так ты можешь изменить любое приложение, особенно если ты любишь потыкать в телефон поздно ночью.
Результат изменений
Меняем функциональность приложения
Чтобы ощутить всю мощь smali, давай попробуем изменить какую-то часть приложения. Например, обойдем проверку на внутренние покупки.
Возьмем другое приложение — ISS Detector . Оно показывает положение МКС над Землей. В нем можно купить расширения: показ комет, планет, Луны, телескопа «Хаббл».
При копировании приложения на компьютер может возникнуть проблема: в составе приложения не один и не два, а целых три файла apk !
$ adb shell pm path com.runar.issdetector
package:/data/app/com.runar.issdetector-dtgy8_hlf1y-cekrg1_W-A==/base.apk
package:/data/app/com.runar.issdetector-dtgy8_hlf1y-cekrg1_W-A==/split_config.en.apk
package:/data/app/com.runar.issdetector-dtgy8_hlf1y-cekrg1_W-A==/split_config.xxhdpi.apk
Копируем все. При переустановке приложения файлы split_config.en.apk и split_config.xxhdpi.apk потеряются, а без них приложение будет вылетать. Поэтому их нужно будет переподписать: зайти в них как в архивы ZIP, удалить папку META_INF и прогнать через стандартную процедуру утилиты jarsigner. Основной же файл мы будем препарировать с помощью apktool.
Покупками в приложении занимается интерфейс IInAppBillingService . Для него прописана обертка com.runar.issdetector.util : IabHelper, IabResult, Purchase, Security, Inventory.
В этом приложении можно не идти напролом, обманывая сервис покупок. Проще заставить приложение думать, что все уже куплено. В этом нам поможет Inventory.smali .
В особо сложных случаях такой трюк провернуть не удается, и тогда приходится подменять данные, заставляя сервис ложно сообщать о совершенных покупках. Подробнее об этом можно почитать в материале компании Securing Apps ( PDF ).
Открыв файл, ты увидишь поле mPurchaseMap , которое содержит в себе все покупки: номер товара, сопоставленный с покупкой, которую совершил пользователь.
.field mPurchaseMap:Ljava/util/Map; .annotation system Ldalvik/annotation/Signature; value = < «Ljava/util/Map;» > .end annotation .end field
Далее в коде мы видим строку hasPurchase(String sku) -> boolean , которая проверяет, совершал ли пользователь покупку. Для этого делается проверка на существование ключа sku в mPurchaseMap .
.method public hasPurchase(Ljava/lang/String;)Z .locals 1 .line 45 iget-object v0, p0, Lcom/runar/issdetector/util/Inventory;->mPurchaseMap:Ljava/util/Map; invoke-interface , Ljava/util/Map;->containsKey(Ljava/lang/Object;)Z move-result p1 return p1 .end method
А что будет, если в любом случае отдавать true ?
.method public hasPurchase(Ljava/lang/String;)Z .locals 1 const p1, 0x1 return p1 .end method
Собираем приложение и устанавливаем его.
$ adb install-multiplie com.runar.issdetector.apk split_config.xxhdpi.apk split_config.en.apk
Success
Результат изменения кода
С этого можно начать свой путь в реверс-инжиниринг. Я рассказал тебе основы, с которых начинал сам. Небольшие изменения могут улучшить твою жизнь — надеюсь, я смог тебе это показать.
Источник: teletype.in
Препарируем P-Code. Как реверсить старый софт на Visual Basic
Чтобы немного разнообразить свою жизнь, сегодня мы снова займемся разборкой антиквариата. Многие уже забыли о существовании такого инструмента, как давно похороненный P-Code, в который транслировались программы на Visual Basic. Тем не менее созданные с его помощью приложения до сих пор существуют, и сегодня мы с тобой аккуратно сломаем одно из них.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
К сожалению (или счастью?), Microsoft поэтапно похоронила P-Code, сперва перейдя на компиляцию пи‑кода в натив, от чего, на мой взгляд, он стал сильно более неуклюжим, а затем и Wowсе полностью перевела VB на платформу .NET. Тем не менее из‑за своей простоты и популярности в былые времена созданные на P-Code проекты весьма многочисленны и продолжают работать по сей день.
Чтобы ты не испугался, если вдруг в твои руки попадет подобный раритет, знал, что с ним делать и с какой стороны к нему подойти, рассмотрим специфику и внутреннее устройство P-Code на примере доработки небольшой графической программы. Условия задачи таковы: у нас есть софтина, в текущей поставке которой отключены некоторые полезные функции (нет связанных с ними пунктов меню). Но сама черная кошка в темной комнате присутствует, то есть в модуле имеются и нужные нам пункты меню, и код отвечающих за них функций. Просто они невидимы для нашей лицензии, и открыть их — наша задача.
Для начала определяем тип программы и ее защиту при помощи DetectItEasy.
Попытка загрузить исследуемую программу в IDA, к сожалению, не принесла никакого полезного результата.
Настало время для нашего любимого отладчика x64dbg. Немного повозившись в нем, обнаруживаем, что основной код крутится внутри модуля msvbvm60. dll .
Налицо классическая виртуальная машина. В ней интерпретируется поток данных, текущий указатель команды находится в регистре esi . Из потока выбирается байт кода операции, и по его индексу из таблицы адресов обработчиков ( 6909AA24 в дампе) выбирается адрес обработчика следующей команды, на которую делается переход. По счастью, это не злобный протектор типа Enigma или Themida, никаких обфускаторов и антиотладчиков в коде нет. Более того, нам даже не требуется изобретать велосипед, разбирая виртуальную машину самостоятельно — за время существования VB за нас это сделали другие добрые люди.
Итак, мы наконец вплотную подошли к понятию P-Code. Этот термин был придуман еще полвека назад одним из основоположников современного программирования Никлаусом Виртом для любого аппаратно‑независимого псевдокода виртуальной машины. Однако с легкой руки Microsoft прижилось оно применительно к теперь уже мертвому байт‑коду Visual Basic, преимущественно 6-й версии.
Схема функционирования P-Code предельно проста и видна на скриншоте выше. Из странных особенностей можно отметить наличие целых шести таблиц обработчиков байт‑кодов. Это значит, что не все опкоды псевдокоманд однобайтовые, каждый из последних пяти опкодов главной таблицы ( FB-FF ) — «составной» двухбайтовый. То есть обработчик каждого из этих кодов считывает следующий байт и передает управление по его индексу на обработчик из другой таблицы адресов, в которой тоже содержится 256 возможных значений. Непонятно, зачем используется такой хитрый способ, а главное — для чего предусмотрен такой запас опкодов, ведь из 1531 возможного задействовано всего 822, причем некоторые дублируют друг друга.
Я не буду приводить здесь полную таблицу опкодов P-Code, желающие могут найти ее на сайте DotFix или даже в более информативном виде в исходниках проекта Semi-VB-Decompiler. Там же приводятся аргументы и примерный смысл каждого опкода.
Вооружившись данной информацией, гораздо продуктивнее разбирать и отлаживать программу даже в x64dbg. Однако существуют и еще более продвинутые инструменты для отладки и декомпиляции пи‑кода. Два из них ты уже, наверное, увидел по приведенным выше ссылкам: свободный декомпилятор Semi-VB-Decompiler и коммерческий VB Decompiler. Еще один незаменимый инструмент для работы с пи‑кодом — свободный дизассемблер‑отладчик VBDec.
Надо сказать, что эти проекты весьма сырые и имеют массу недочетов (к примеру, Semi-VB-Decompiler у меня вообще не декомпилировал ни одного файла и не смог найти валидную сигнатуру), но их возможности дополняют друг друга. К примеру, VB Decompiler умеет с более‑менее переменным успехом не только дизассемблировать, но и восстанавливать VB-код. Причем не только из P-Code, но и из скомпилированного из него натива, и даже из .NET. А хоть VBDec этого и не умеет, зато его дизассемблер на несколько порядков более прямой и безглючный, а главное, у него есть полнофункциональный дебаггер с возможностью трассировки P-Code.
Вернемся к нашей задаче и попробуем решить ее уже с помощью этих чудесных инструментов. Для начала открываем исследуемую программу в VB Decompiler и ищем главное окно. В VB Decompiler для этого имеется инструмент Tools-Search string (он, правда, временами подглючивает, но потерпеть можно). Хоть программа и обфусцирована, но мы находим и главное окно MDIForm1, и первый пункт меню из скрытых из‑за отсутствия лицензии.
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Источник: xakep.ru
Простой реверсинг и защита .NET приложений.
DEEPSIDE
Реверсинг (англ. Reversing) — это совокупность действий, дающих, так сказать, обратный ход. Это если переводить с английского. Что же мы реверсируем? Конечно же алгоритмы программ. Reversing подразумевает под собой разбор программы с целью изменения ее работы, параметров, интерфейса, встраивание дополнительных функций и т.д.
Эти действия могут включать в себя нахождение алгоритма генерации/проверки кода, пароля, алгоритма организации защиты и т.д. Совокупность этих действий, как я уже сказал, и называется Reversing.
Реверсинг сродни крэкерству, однако под реверсингом чаще понимается восстановление исходного кода программы из исполняемого кода, часто реверсинг кода может быть даже не связан с алгоритмом защиты программ.
- Сегодня мы будем реверсить .NET приложение.
Начало. Инструментарий.
Для реверса нам необходимы программы:
- ExeInfoPE / RDG Packer Detector
- dnSpy
- UnConfuserEx
ExeInfoPE и RDG Packer Detector выполняют одну (из) важную функцию для реверса — Узнать ЯП на котором написана программа.
dnSpy — Инструмент для дизассемблирования, говоря простым языком эта утилита позволит нам доставать весь код из exe файла.
DnSpy включает в себя декомпилятор, отладчик и редактор сборки (и т. д.) Он может быть легко расширен путем написания собственного расширения.
UnConfuserEx — утилита позволяющая снимать протектор ConfuserEx (о нём чуть позже).
Теперь представим, вам методом СИ скинули exe файл в котором содержится вирус, стиллер к примеру , но мы ведь не глупые и во всём видим подвох, пробуем открыть файл в ExeInfoPE (файл брал с этой статьи)
Видим, что программа написана на C#, в Lamer Info написано, что файл не накрыт никаким протектором, код чист.
Теперь запускаем dnSpy и выбираем наш файл, после Декомпиляции видим это:
Здесь можем увидеть следующую информацию:
- Версия фреймворка, у меня это 4.5
- Название проекта
Перейдём в точку входа, кликнув по «Точка входа: ИмяПроекта.Program.Main». Перейдя в точку входа видим весь код класса Program.cs / Main.cs:
Пролистав чуть ниже видим операции с почтой:
В коде можно заметить логин и пароль от почты хакера. Теперь можем зайти на почту хозяина стиллера и украсть все его логи!
Защита кода.
Для защиты кода используются обфускаторы / протекторы для ЯП на котором написана программа. Как пример защитим код стиллера при помощи обфускатора ConfuserEx (далее конфузер)
Открываем конфузер, добавляем наш файл, во вкладке «Basic Settings» выставляем нужную защиту, каждая защита имеет свой ряд функционала:
- Minimum:
- Normal:
В методе Maximum используется все функции для защиты кода. После выбираем вкладку «Confuse!» и наш обфуцированный файл появляется в папке «Confused»:
Стоит заметить, чем выше защита, тем выше размер защищённого файла. Теперь когда мы откроем файл с защищённым кодом в ExeInfoPE, мы увидим чем накрыт файл и с какими параметрами защищён код:
В поле «Lamer Info» показывается информация о методах снятия данного протектора или обфускатора.
Попробуем закинуть в dnSpy обфусцированное приложение:
Основная информация не изменилась, НО поменялась точка входа, попробуем открыть её:
Т.к я выставлял минимальные настройки конфузера, некоторые строки кода остались не зашифрованными, НО имена переменных, данные от почты и остальные важные данные стали зашифрованными.
Ещё нужно запомнить вот что:
Даже если вы защитили свой код протектором или обфускатором, это не значит, что его невозможно вытащить.
Снимаем защиту ConfuserEx
Для снятия конфузера нам потребуется ConfuserExSwitchKiller. Открываем ConfuserExSwitchKiller.exe в поле «Browse For Assembly» выбираем наш файл:
Далее тыкаем «Deobfuscate» и видим, что наш файл успешно деобфусцирован:
Защита ConfuserEx снята. Закидываем чистый файл в dnSpy:
Уже видим знакомую точку входа, переходим и видим, код абсолютно чист:
Все строки декодированы, а программа реверснута.
Итог.
Сегодня мы разобрали базовые методы реверса .NET приложений. Научились узнавать на каком языке программирования написана программа. Также научились реверсить C# приложения, защищать код, снимать ConfuserEx.
На этом статья заканчивается, удачи каждому начинающему реверсеру)
Еще больше интересных статей на канале DEEPSIDE
Источник: telegra.ph