Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
{
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=nulln";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. Позволяет декомпилировать и исследовать файлы .
и .
. У данного продукта самая, на мой взгляд, удобная навигация по декомпилированному коду, так что, если говорить только об исследовании алгоритма, этот инструмент самый удобный.
dnSpy — позволяет декомпилировать, редактировать, компилировать и отлаживать сборки .Net. Следует отметить, что все функции, кроме декомпиляции, работают далеко не всегда, многое зависит от конкретной ситуации. В моем случае компиляция не заработала: софтина не смогла связать пространства имен Mono и Android.
Simple-assembly-explorer — достаточно старый, но от этого не утративший актуальности софт. Позволяет декомпилировать .
и .
в код на С# или CIL (Common Intermediate Language — «высокоуровневый ассемблер» виртуальной машины .NET. Промежуточный язык, разработанный фирмой Microsoft для платформы .NET Framework). Самая полезная возможность — этот инструмент умеет компилировать код на CIL, что позволяет без особого труда вносить изменения в исследуемые файлы.
Для распаковки и запаковки APK я решил использовать 7z вместо стандартного для таких случаев apktool. Ниже я объясню почему.
Сначала я попытался использовать для распаковки 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.exexprogram.apk-oprogram_apk
После распаковки, помимо привычных для APK файлов, получаем каталог assemblies
с кучей dll
. Из них нас интересует одна библиотека, имя которой совпадает с именем приложения. Ее‑то мы и будем потрошить.
Анализ DLL и поиск места для внесения правок выходит за рамки сегодняшней статьи, так как мыслям на эту тему будет тесно даже в книге. Остановлюсь лишь на технических моментах. Как я писал выше, dnSpy отказался компилировать исправленную библиотеку, поэтому пришлось прибегнуть к помощи Simple-assembly-explorer (SAE).
|
|