Попалось мне недавно в руки мобильное приложение для Android, которое работало не совсем так, как хотелось бы. Значит, нужно хорошенько покопаться в его потрошках!
Сказано — сделано: берем свежую версию GDA, открываем наш подопытный APK и видим, что выглядит он как‑то уж слишком подозрительно. Классы всех activity содержат примерно одинаковый шаблонный код такого типа:
public class MainActivity extends BaseActivity{ private ArrayList refList; public static final String __md_methods; static { MainActivity.__md_methods = "n_onCreate:\(Landroid/os/Bundle;\)V:GetOnCreate_Landroid_os_Bundle_Handler ..... _ILandroid_os_Bundle_Handler:Android.Locations.ILocationListenerInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null\n"; Runtime.register("Megaprogram.Activity.MainActivity, Megaprogram", MainActivity.class, MainActivity.__md_methods); } public void MainActivity(){ super(); if (this.getClass() == MainActivity.class) { Object[] objArray = new Object[0]; TypeManager.Activate("Megaprogram.Activity.MainActivity, Megaprogram", "", this, objArray); } return;Это наводит на мысли, что нам попался неправильный APK. Возможно, какой‑то фреймворк... Если поменять расширение . на ., то в глаза бросается необычная для обычных мобильных приложений папка assemblies, содержащая кучу DLL-библиотек.
Поскольку многие библиотеки содержат в названии слово Xamarin, становится понятным, откуда взялось такое однообразие — основной код программы написан на С# и располагается в библиотеке DLL, а на Java написаны лишь шаблонные куски кода, предназначенные для связи между средой выполнения Mono и виртуальной машиной среды выполнения Android (ART).
Ну да ладно, в сторону теорию, пора браться за дело.
Выбираем инструмент
Для работы с .Net я использую три инструмента.
-
dotPeek от JetBrains. Позволяет декомпилировать и исследовать файлы
.иdll .. У данного продукта самая, на мой взгляд, удобная навигация по декомпилированному коду, так что, если говорить только об исследовании алгоритма, этот инструмент самый удобный.exe 
Главное окно dotPeek -
dnSpy — позволяет декомпилировать, редактировать, компилировать и отлаживать сборки .Net. Следует отметить, что все функции, кроме декомпиляции, работают далеко не всегда, многое зависит от конкретной ситуации. В моем случае компиляция не заработала: софтина не смогла связать пространства имен Mono и Android.

Главное окно dnSpy -
Simple-assembly-explorer — достаточно старый, но от этого не утративший актуальности софт. Позволяет декомпилировать
.иdll .в код на С# или CIL (Common Intermediate Language — «высокоуровневый ассемблер» виртуальной машины .NET. Промежуточный язык, разработанный фирмой Microsoft для платформы .NET Framework). Самая полезная возможность — этот инструмент умеет компилировать код на CIL, что позволяет без особого труда вносить изменения в исследуемые файлы.exe 
Главное окно Simple assembly explorer
Для распаковки и запаковки APK я решил использовать 7z вместо стандартного для таких случаев apktool. Ниже я объясню почему.
Разбираем APK
Сначала я попытался использовать для распаковки APK известную программу apktool, но при запаковке возникла проблема из‑за того, что apktool «не знает» такой тип файлов, как ., не считает его стандартным для APK. Стандартными считаются только файлы с именами из следующего массива:
private final static String[] APK_STANDARD_ALL_FILENAMES = new String[] {"classes.dex", "AndroidManifest.xml", "resources.arsc", "res", "lib", "libs", "assets", "META-INF" };.При сборке APK все неизвестные файлы сжимаются (тип сжатия DEFLATED), а Xamarin надеется увидеть свои DLL несжатыми (STORED) и от разочарования не может нормально прочитать их. Сначала возникла мысль исправить и пересобрать apktool, но потом я решил поступить проще: распаковывать и запаковывать файлы обычным архиватором, без сжатия. Ведь декодирование манифеста или получение smali-кода мне в данной задаче не требуется, а зачем тогда усложнять себе жизнь без необходимости?
Итак, распаковываем:
7z.exe x program.apk -oprogram_apkПосле распаковки, помимо привычных для APK файлов, получаем каталог assemblies с кучей dll. Из них нас интересует одна библиотека, имя которой совпадает с именем приложения. Ее‑то мы и будем потрошить.
Патчим .Net
Анализ DLL и поиск места для внесения правок выходит за рамки сегодняшней статьи, так как мыслям на эту тему будет тесно даже в книге. Остановлюсь лишь на технических моментах. Как я писал выше, dnSpy отказался компилировать исправленную библиотеку, поэтому пришлось прибегнуть к помощи Simple-assembly-explorer (SAE).
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»

