Smali что это такое

Начинаем со Smali. Как реверсить приложения для Android

Smali что это такое. cogwheels h. Smali что это такое фото. Smali что это такое-cogwheels h. картинка Smali что это такое. картинка cogwheels h

Содержание статьи

Какое приложение мы будем препарировать? Я выбрал для своих целей VK Admin — программу для управления сообществами «ВКонтакте» со смартфона. В нем не предусмотрена темная тема, поэтому мы с тобой попробуем эту тему добавить.

WARNING

Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный изложенным материалом.

Собираем и разбираем

Сначала извлечем все ресурсы приложения, используя утилиту apktool — она распаковывает и запаковывает файлы пакетов APK, которые хранятся в сжатом, бинарном виде, и дизассемблирует программный код, заключенный в них.

Чтобы получить установочный пакет, можно воспользоваться Android Debugging Bridge — системой для отладки программ на устройстве. В *nix-подобных системах ADB ставится стандартно, с помощью пакетного менеджера, а в Windows — идет в составе Android Studio или Android SDK Platform Tools.

В первую очередь установим приложение из Google Play Store на смартфон, подключим его к компьютеру с помощью USB, затем воспользуемся ADB для переноса пакета приложения на компьютер и извлечем его содержимое.

$ adb shell pm path com.vk.admin
package:/data/app/com.vk.admin-Ka5KVtTbnGgxoRqnObb-pQ==/base.apk

$ adb pull /data/app/com.vk.admin-Ka5KVtTbnGgxoRqnObb-pQ==/base.apk com.vk.admin.apk
3881 KB/s (13414132 bytes in 3.374s)

$ apktool d com.vk.admin.apk
I: Using Apktool 2.4.0 on base.apk
I: Loading resource table.
I: Decoding AndroidManifest.xml with resources.
I: Regular manifest package.
I: Decoding file-resources.
I: Decoding values / XMLs.
I: Baksmaling classes.dex.
I: Copying assets and libs.
I: Copying unknown files.
I: Copying original files.

$ apktool b com.vk.admin/
I: Using Apktool 2.4.0
I: Checking whether resources has changed.
I: Checking whether sources has changed.
I: Smaling classes folder into classes.dex.
I: Building apk file.
I: Copying unknown files/dir.
I: Built apk.

Затем необходимо подписать приложение. Это нужно, чтобы и Google Play Store, и устройство не обновляли приложение, если подписи не совпадают. Поэтому не забудь удалить приложение с телефона, прежде чем установить свое, подписанное своим ключом. Для создания подписи в первый раз нужно воспользоваться утилитой keytool (входит в Java Development Kit):

Enter key password for
(RETURN if same as keystore password):
Re-enter new password:

Когда ты уже создал ключ, подпиши приложение.

После этого установи приложение на телефон.

$ adb install com.vk.admin.apk
3881 KB/s (13414132 bytes in 3.374s)
Success

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Источник

Русские Блоги

Основы смальского языка

Что такое Смали?

Введение

Основы смальского языка

Следующее содержание относится к структуре и базовому синтаксису некоторых программ на Smali. Эти базовые синтаксисы необходимо использовать при использовании Smali для изменения логики приложения.

Smali файловая структура

основной тип

Введите ключевые словаСоответствует описанию типа в Java
Vvoid, может использоваться только для типа возврата
Zboolean
Bbyte
Sshort
Cchar
Iint
Jlong (64 bits)
Ffloat
Ddouble (64 bits)

объект

Тип объекта, то есть объект ссылочного типа, при обращении к нему начинается с L, за которым следует полное имя пакета, например: java.lang.String Соответствующий синтаксис Smali Ljava/lang/String

массив

Объявление метода и вызов

Шаблон справочного метода Smali, приведенный в официальной вики, выглядит следующим образом:
Lpackage/name/ObjectName;->MethodName(III)Z
Часть 1 Lpackage/name/ObjectName; Используется для объявления определенных типов для JVM, чтобы найти

Поскольку список параметров метода не разделен запятой, его можно разделить только слева направо в соответствии с определением типа. Это необходимо соблюдать осторожно.

Если вам нужно вызвать конструктор, MethodName:

Зарегистрировать декларацию и использовать

В Smali, если вам нужно хранить переменные, вы должны сначала объявить достаточное количество регистров, один регистр может хранить 32-битные типы длины, такие как Int, и два регистра могут хранить 64-битные типы данных, такие как Long или Double

В сочетании с обычно используемыми инструкциями Dalvik, вы можете достичь некоторых необходимых функций

Итак, как определить количество регистров, которые будут использоваться?

Из-за нестатического метода вам нужно занять регистр для сохранения этого указателя, тогда минимальное количество регистров этого типа метода равно 1, если вам нужно обработать входящие параметры, вам нужно добавить еще раз, в это время вы должны рассмотреть Double и Float Этот тип параметра должен занимать два регистра, например:

Если метод Java объявлен следующим образом:
myMethod(int p1, float p2, boolean p3)

Тогда соответствующий сомали это:
method LMyObject;->myMethod(IJZ)V
В настоящее время соответствующая ситуация с регистром выглядит следующим образом:

Зарегистрировать имяСоответствующая ссылка
p0this
p1параметр p1 типа int
p2, p3параметр типа p2 с плавающей точкой
p4логический параметр p3

Тогда минимальное количество необходимых регистров: 5

Если метод содержит определения констант, переменных и т. Д., Вам необходимо увеличить количество регистров в соответствии с ситуацией. Пока число соответствует требованиям, убедитесь, что значение, которое необходимо получить, не вымывается при последующем присвоении. После сохранения регистр можно переназначить) или занять реестр на долгое время

Набор инструкций Dalvik

Если вам нужно написать программу с использованием Smali, вам также необходимо освоить часто используемые инструкции виртуальной машины Dalvik, которые называются набором команд Dalvik. Эти инструкции в некоторой степени похожи на инструкции по сборке x86, но есть больше инструкций, и они очень просты и удобны в использовании. Для более подробного ознакомления вы можете обратиться к официальным документам Android, связанным с Dalvik:https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions

Вот также некоторые часто используемые инструкции, в сочетании с Smali для объяснения:

Используется для возврата значения, соответствующего оператору возврата в Java

Используется для объявления констант, таких как строковые константы (только объявления, String a = «abc» Такие заявления включают декларацию и уступку)

инструкцияобъяснение
if-eq v1,v2Определить, равны ли значения в двух регистрах
if-ne v1,v2Определите, не равны ли значения в двух регистрах
if-lt v1,v2Определите, меньше ли значение в регистре v1, чем значение в регистре v2 (lt == меньше чем)
if-ge v1,v2Определите, больше или равно ли значение в регистре v1 значению в регистре v2 (ge == больше или равно)
if-gt v1,v2Определите, больше ли значение в регистре v1, чем значение в регистре v2 (gt == great than)
if-le v1,v2Определите, является ли значение в регистре v1 меньше или равно значению в регистре v2 (le == меньше или равно)

Следует отметить, что если операторы, написанные на Java, часто в соответствующих Smali, станут противоположной логикой суждения, как показано ниже:

Соблюдайте внимательно:
Smali что это такое. 6192db22ca917050ec75e481fa3b4a33. Smali что это такое фото. Smali что это такое-6192db22ca917050ec75e481fa3b4a33. картинка Smali что это такое. картинка 6192db22ca917050ec75e481fa3b4a33

Атрибутивные операции делятся на: получить и положить

Целевой тип делится на: массив (массив), экземпляр (экземпляр) и статический (статический) три, соответствующий сокращенный префикс a, i, s

Типы длины делятся на: по умолчанию (ничего не писать), широкий (широкий, 64-битный) 、 объект 、 boolean 、 byte 、 char 、 short (Последние несколько не будут объяснены, в соответствии с Java)

Формат инструкции: [Имя команды] [регистр источника], [регистр объекта, в котором находится поле назначения], [указатель поля] Пример кода следующий: операция заключается в присвоении значения 100 переменной члена класса mIntA типа int:

Инструкции для поля экземпляра перечислены ниже, где я могу быть заменен на a или s, которые используются для манипулирования полями массива или статическими полями, соответственно

инструкцияобъяснение
igetЗначение, используемое для манипулирования типом значения int
iget-wideЗначение, используемое для работы широкого поля
iget-objectЗначение, используемое для управления ссылками на объект
iget-booleanЗначение, используемое для работы с логическим типом
iget-byteЗначение, используемое для манипулирования типом байта
iget-charЗначение, используемое для манипулирования типом символа
iget-shortЗначение, используемое для работы короткого типа
iputНазначение, используемое для манипулирования типами значений, такими как int
iput-wideНазначение, используется для работы широкого поля
iput-objectНазначение, используемое для управления ссылками на объекты
iput-booleanНазначение, используемое для управления булевыми типами
iput-byteНазначение, используемое для манипулирования типами байтов
iput-charНазначение, используемое для управления типами символов
iput-shortНазначение, используется для работы короткого типа

Следующий Java-код предназначен для самых простых операций присваивания и значения переменных класса.

Соответствующий код Smali выглядит следующим образом:

В соответствии со сравнением кода Java и Smali, стоит отметить, что метод получения переменных класса в Smali ближе к вызовам функций, но нет никаких параметров для вызовов функций

В дополнение к базовым инструкциям Dalvik, представленным выше, Dalvik также поддерживает два типа наборов команд: преобразование типов значений (например, int в float, double в float и т. Д.) И базовые операции (математические операции, логические операции, самоинкремент). Перечислите некоторые общие инструкции, другие могут ссылаться на официальные документы Google, упомянутые выше

Что может сделать Смали?

Хотя мы понимаем основной синтаксис Smali, мы, как правило, не пишем напрямую Smali для разработки функций, что является слишком дорогостоящим, и цель понимания Smali состоит в том, чтобы выполнить реверс-инжиниринг Android, такой как: анализ принципов APP, обнаружение уязвимостей, Конечно, вы также можете внести некоторые незначительные изменения в некоторые приложения (лучше не делать вещи, которые наносят ущерб закону, нарушают закон и дисциплину, и вредят другим)

Источник

Начинаем со Smali. Как реверсить приложения для Android

Smali что это такое. android reverseeng featuredimg. Smali что это такое фото. Smali что это такое-android reverseeng featuredimg. картинка Smali что это такое. картинка android reverseeng featuredimgОбратная разработка позволяет не только разобраться в существующих приложениях, но и модифицировать их. В этом смысле приложения на Android — клад для начинающего хакера и настоящий аттракцион для любителя. Сегодня мы разберем несколько приложений, чтобы потренироваться в реверс-инжиниринге и узнать о подлинных возможностях твоего смартфона.

Какое приложение мы будем препарировать? Я выбрал для своих целей VK Admin — программу для управления сообществами «ВКонтакте» со смартфона. В нем не предусмотрена темная тема, поэтому мы с тобой попробуем эту тему добавить.

Собираем и разбираем

Сначала извлечем все ресурсы приложения, используя утилиту apktool — она распаковывает и запаковывает файлы пакетов APK, которые хранятся в сжатом, бинарном виде, и дизассемблирует программный код, заключенный в них.

Чтобы получить установочный пакет, можно воспользоваться Android Debugging Bridge — системой для отладки программ на устройстве. В *nix-подобных системах ADB ставится стандартно, с помощью пакетного менеджера, а в Windows — идет в составе Android Studioили Android SDK Platform Tools.

В первую очередь установим приложение из Google Play Store на смартфон, подключим его к компьютеру с помощью USB, затем воспользуемся ADB для переноса пакета приложения на компьютер и извлечем его содержимое.

Затем необходимо подписать приложение. Это нужно, чтобы и Google Play Store, и устройство не обновляли приложение, если подписи не совпадают. Поэтому не забудь удалить приложение с телефона, прежде чем установить свое, подписанное своим ключом. Для создания подписи в первый раз нужно воспользоваться утилитой keytool (входит в Java Development Kit):

Когда ты уже создал ключ, подпиши приложение.

После этого установи приложение на телефон.

Меняем цветовые схемы

Цвета в приложении можно настроить несколькими способами:

Все эти варианты жизнеспособны и постоянно используются.

colors.xml

styles.xml

В файле com.vk.admin/res/values/styles.xml заданы цвета, но только некоторые. Этот файл используется самими разработчиками, когда они хотят сделать несколько цветовых схем приложения. Если же этих схем нет, работать приходится нам с тобой.

Layout

В папке com.vk.admin/res/ находятся описания экранов приложения.

Некоторые цвета приложения, чаще всего задний фон, можно найти здесь и изменить.

Smali

Машина Dalvik, в отличие от JVM, — регистровая, а не стековая. Регистры не имеют типов и могут хранить всё: числа, строки, экземпляры классов. При этом язык smali строго типизирован.

Вот небольшая последовательность инструкций, чтобы вывести содержимое регистра v0 в лог.

Если не удается понять, что значит тот или иной регистр или что делает та или иная функция, используй декомпилятор smali в Java — Jadx.

Smali что это такое. . Smali что это такое фото. Smali что это такое-. картинка Smali что это такое. картинка Интуитивно понятный интерфейс Jadx

Использовать Jadx просто — нужно лишь выбрать файл и открыть его, код будет автоматически декомпилирован и показан.

Эта строка занимается изменением. Чтобы изменить цвет, нужно его записать в регистр, а затем передать в функцию вместо настоящего.

Теперь пройдись по всем файлам и замени цвет.

Бывают случаи на порядок проще.

Стоит быть внимательным и пытаться разобраться в коде: иногда оптимизатор кода будет перемещать инструкции const вверх, и ты можешь их не заметить.

setTextColor

На этом борьбу со светлым фоном и ярким экраном можно закончить. Большинство элементов экрана поменяли свой цвет на противоположный. Так ты можешь изменить любое приложение, особенно если ты любишь потыкать в телефон поздно ночью.

Smali что это такое. 1 compare. Smali что это такое фото. Smali что это такое-1 compare. картинка Smali что это такое. картинка 1 compare Результат изменений

Меняем функциональность приложения

Чтобы ощутить всю мощь smali, давай попробуем изменить какую-то часть приложения. Например, обойдем проверку на внутренние покупки.

Возьмем другое приложение — ISS Detector. Оно показывает положение МКС над Землей. В нем можно купить расширения: показ комет, планет, Луны, телескопа «Хаббл».

Копируем все. При переустановке приложения файлы split_config.en.apk и split_config.xxhdpi.apk потеряются, а без них приложение будет вылетать. Поэтому их нужно будет переподписать: зайти в них как в архивы ZIP, удалить папку META_INF и прогнать через стандартную процедуру утилиты jarsigner. Основной же файл мы будем препарировать с помощью apktool.

Собираем приложение и устанавливаем его.

$ adb install-multiplie com.runar.issdetector.apk split_config.xxhdpi.apk split_config.en.apk
Success

С этого можно начать свой путь в реверс-инжиниринг. Я рассказал тебе основы, с которых начинал сам. Небольшие изменения могут улучшить твою жизнь — надеюсь, я смог тебе это показать.

Источник

Русские Блоги

Обратный путь Android: глубокое понимание инструкций байт-кода Davilk и файлов Smali

Сегодня я представлю знания, связанные с виртуальной машиной Davilk. Во-первых, я познакомлю вас с байт-кодом Davilk, который нас больше всего беспокоит, а затем углублюсь в область обратного проектирования Android. Причина написания этой статьи Потому что есть девушки, которые хотят этому научиться, плюс в Интернете много информации слишком разрозненно и однобоко. Конечно, важнее резюмировать прошлое.

Вы можете следить за моим блогом, чтобы узнавать о моем настроенииРеки и озера называют маленьким белым братом

Дескриптор Davilk

Подобно JVM, байт-код Davilk также имеет набор методов для описания типов, методов и полей. Эти методы в сочетании с инструкциями Davilk образуют полный ассемблерный код.

Байт-код и тип данных

Байт-код Davilk имеет только два типа: базовые типы и ссылочные типы. Объекты и массивы являются ссылочными типами. Описание типов байт-кода в Davilk согласуется с правилами дескриптора в JVM: для базовых типов и void без возвращаемого значения Тип представлен заглавная буква, а тип объекта представлен буквой L плюс полное имя объекта. Массив представлен символом [, и конкретные правила таковы:

тип javaДескриптор типа
booleanZ
byteB
shortS
charC
intI
longJ
floatF
doubleD
voidV
Тип объектаL
Тип массива[

Здесь мы сосредоточимся на объяснении типов объектов и типов массивов:

Тип объекта

Тип массива

Описание поля

Описание метода

Для иллюстрации воспользуемся несколькими примерами, например java.lang.String:

Набор инструкций Davilk

Освоив описание вышеуказанных полей и методов, мы можем только сказать, что мы понимаем, как описывать поле и метод, а для конкретной логики в методе нам необходимо понимать набор инструкций в Dalvik. Поскольку Dalvik основан на Архитектура на основе регистров, набор инструкций Он сильно отличается от набора инструкций в JVM, но больше похож на инструкции сборки в x86.

Инструкции по определению данных

Инструкции по работе с данными

Команда перемещения используется для операций с данными, что означает перемещение пункта назначения, источника, то есть данные данных перемещаются из регистра источника (регистр источника) в регистр назначения (регистр источника), который может понимать операцию присваивания между переменными в java. • В зависимости от байт-кода и типа «Другой» за командой перемещения будет следовать другой суффикс.

инструкцияописание
move vA,vBНазначьте значение регистра vB регистру vA, регистры vA и vB имеют 4 бита
move/from16 vAA,VBBBBПрисвойте значение регистра vBBBB (16 бит) регистру vAA (7 бит), from16 указывает, что исходный регистр vBBBB составляет 16 бит
move/16 vAAAA,vBBBBНазначьте значение регистра vBBBB регистру vAAAA, 16 означает, что регистр источника vBBBB и регистр назначения vAAAA являются 16-битными.
move-object vA,vBНазначьте ссылку на объект в регистре vB регистру vA, регистр vA и регистр vB имеют 4 бита.
move-result vAAНазначьте одиночный (32-битный) не объектный результат предыдущей операции вызова инструкции (вызова метода) регистру vAA.
move-result-wide vAAНазначьте двойное слово (64-битный) не объектный результат предыдущей операции вызова инструкции регистру vAA
mvoe-result-object vAAНазначьте объектный результат предыдущей операции вызова инструкции регистру vAA
move-exception vAAСохраните исключение, возникшее во время последнего запуска, в регистр vAA.

Инструкции по эксплуатации объекта

Операции, связанные с экземплярами объекта, такие как создание объекта, проверка объекта и т. Д.

инструкцияописание
new-instance vAA,[email protected]Создайте объект указанного типа и назначьте ссылку на устройство регистру vAA. Объекты массивов сюда не включаются.
instance-of vA,vB,[email protected]Определите, имеет ли ссылка на объект в регистре vB указанный тип, если это так, присвойте v1 значение 1, в противном случае присвойте ему значение 0
check-cast vAA,[email protected]Преобразуйте ссылку на объект в регистре vAA в указанный тип и присвойте результат vAA в случае успеха, в противном случае будет выброшено исключение ClassCastException.

Инструкции по работе с массивом

В примере инструкций по работе мы не нашли инструкции по созданию объекта, Davilk устанавливает специальную инструкцию для операций с массивами.

инструкцияОписание
new-array vA,vB,[email protected]Создайте массив указанного типа и размера (заданного регистром vB) и назначьте его регистру vA.
fill-array-data vAA,+BBBBBBBBЗаполните массив указанными данными, vAA представляет собой ссылку на массив (адрес первого элемента массива)

Инструкции по работе с данными

Операции с данными в основном бывают двух типов: арифметические операции и логические операции.
1. Инструкции по арифметическим операциям

инструкцияОписание
add-typeИнструкция по добавлению
sub-typeИнструкция по вычитанию
mul-typeИнструкция умножения
div-typeИнструкция по разделу
rem-typeпопрошайничество

2. Инструкции по расчету логического элемента.

инструкцияОписание
and-typeИ инструкция
or-typeИЛИ инструкция
xor-typeИнструкция по вычислению элемента XOR

3. Инструкции по перемещению

инструкцияОписание
shl-typeПодписанная инструкция сдвига влево
shr-typeПодписанная инструкция сдвига вправо
ushr-typeБеззнаковая инструкция сдвига вправо

Сравните инструкции

Инструкции по эксплуатации в полевых условиях

Инструкции по работе с полями представляют собой установку и выборку полей объекта, как и ваши более длинные методы set и get в коде. Основные инструкции: iput-type, iget-type, sput-type, sget-type.type Представляет тип данных.

Операции чтения и записи обычных полей

Инструкции iput-type и iget-type с префиксом i используются для операций чтения и записи полей.

инструкцияОписание
iget-byte vX,vY,filed_idСчитайте значение поля filed_id в объекте в регистре vY и назначьте его регистру vX
iput-byte vX,vY,filed_idУстановите значение поля filed_id в объекте в регистре vY равным значению регистра vX
iget-boolean vX,vY,filed_id
iput-boolean vX,vY,filed_id
iget-long vX,vY,filed_id
iput-long vX,vY,filed_id

Операции чтения и записи статического поля

Инструкции типа sput и sget с префиксом s используются для операций чтения и записи статических полей.

инструкцияОписание
sget-byte vX,vY,filed_id
sput-byte vX,vY,filed_id
sget-boolean vX,vY,filed_id
sput-boolean vX,vY,filed_id
sget-long vX,vY,filed_id
sput-long vX,vY,filed_id

Инструкция по вызову метода

Большинство инструкций методов в Davilk очень похожи на инструкции в JVM. В настоящее время существует пять наборов инструкций:

Эти пять инструкций являются базовыми. Кроме того, вы также встретите инструкции invoke-direct / range, invoke-static / range, invoke-super / range, invoke-virtual / range, invoke-interface / range. Единственная разница между Тип и приведенные выше инструкции заключаются в том, что последние могут устанавливать диапазон регистров, который могут использовать параметры метода, который используется, когда имеется более четырех параметров.

Следует отметить, что если вы хотите получить возвращаемое значение выполнения метода, вам необходимо получить результат выполнения через указанную выше инструкцию move-result.

Инструкция возврата метода

В Java во многих случаях нам нужно вернуть результат выполнения метода через Return, а также инструкция возврата, предоставленная в Davilk, чтобы вернуть результат выполнения:

инструкцияОписание
return-voidНичего не вернуть
return vAAВозвращает 32-битное значение не объектного типа.
return-wide vAAВозвращает 64-битное значение не объектного типа.
return-object vAAСсылка на тип объекта

Инструкция по синхронизации

инструкцияОписание
monitor-enter vAAПолучить операцию блокировки для указанного объекта
monitor-exit vAAОтменить операцию блокировки для указанного объекта

Инструкция по исключению

Давным-давно виртуальная машина также использовала инструкции jsr и ret для реализации исключений, но теперь JVM выбросила исходный метод и вместо этого использует таблицы исключений для реализации исключений. Davilk по-прежнему использует инструкции для реализации:

инструкцияОписание
throw vAAБросить исключение указанного типа в регистр vAA

Инструкция по прыжкам

Инструкции перехода используются для перехода от текущей адресной строки к указанному смещению и в основном используются в ветвях if и switch. Davilk предоставляет инструкции goto, Packaging-Switch и if-test для реализации операций перехода.

В условном сравнении тест в if-test представляет собой правило сравнения. Эта инструкция используется часто, поэтому мы просто садимся и объясняем:

инструкцияОписание
if-eq vA,vB,targetРегистры vA и vB равны, что эквивалентно if (a == b) в java. Например, if-eq v3, v10, 002c означает, что если условие истинно, переход к текущей позиции + 002c. Остальное похож
if-ne vA,vB,targetЭквивалентно if (a! = B) в java
if-lt vA,vB,targetЗначение в регистре vA меньше vB, что эквивалентно if (a b)
if-gt vA,vB,targetЭквивалентно if (a > b)
if-ge vA,vB,targetЭквивалентно if (a >= b)
if-le vA,vB,targetЭквивалентно if (a b)

В дополнение к приведенным выше инструкциям Davilk также предоставляет условную инструкцию с нулевым значением, которая используется для сравнения с 0, что можно понимать как установку значения регистра vB в приведенной выше инструкции на 0.

инструкцияОписание
if-eqz vAA,targetЭквивалентно if (a == 0) или if (! A) в java
if-nez vAA,targetЭквивалентно if (a! = 0) или if (a) в java
if-ltz vAA,targetЭквивалентно if (a 0)
if-gtz vAA,targetЭквивалентно if (a > 0)
if-lez vAA,targetЭквивалентно if (a 0)
if-gtz vAA,targetЭквивалентно if (a >= 0)

Прикрепил:
Выше мы сказали, что есть две таблицы смещения, упакованные-переключатели-полезные данные и запасные-переключатели-полезные данные. Единственная разница между ними заключается в том, в порядке ли значения в таблице. Мы сделаем это позже Подробное объяснение.

Инструкции по преобразованию данных

Преобразование типов данных хорошо знакомо любому разработчику Java и используется для реализации взаимного преобразования двух разных типов данных. Базовый формат инструкции: unop vA, vB, что означает работу с медианным значением регистра vB и результатом. Хранится в реестре vA.

инструкцияОписание
int-to-longПреобразование в длинное целое число
float-to-intПреобразование типа с плавающей запятой одинарной точности в целое число
int-to-byteПреобразование в байтовый тип
neg-intИнструкция дополнения, дополнить целое число
not-intИнструкция отрицания, отрицать целое число

До сих пор мы сделали краткое описание инструкций в Davilk. Инструкции Davilk в значительной степени объединены с инструкциями x86, а также структурой и семантикой инструкций JVM, поэтому в целом инструкции в Davilk по-прежнему очень легко изучить. Подробнее Подробнее подробные инструкции, пожалуйста, обратитесь к:Полный комплект инструкций Davilk

Подробный файл smali

Ключевые словаОписание
.filedОпределить поля
.method. end methodМетод определения
.annotationАннотация к определению
.implementsОпределите инструкции интерфейса
.localЗадает количество используемых локальных переменных
.registersУкажите количество используемых локальных регистров
.prologueУказывает начало кода в методе
.lineПредставляет указанную строку в исходном файле Java
.paramterПараметры метода указаны.

Ниже мы кратко объясним структуру файла smali:

Первые три строки файла smali описывают текущую информацию о классе:

После заголовка файла идет тело файла, то есть основная часть класса, включая четыре части описания интерфейса, описания аннотации, описания поля и описания метода, реализованного классом. Давайте посмотрим на структуру полей и методов соответственно. (Не забывайте. (Представление методов и полей мы сказали в Davilk)

Описание интерфейса

smali добавил к нему аннотацию #Interface

Описание аннотации

Описание поля

Поля описаны в smali. Мы знаем, что Java делится на статические поля (атрибуты класса) и обычные поля (атрибуты экземпляра). Их представление в smali выглядит следующим образом:

1. Общие поля:

2. Статические поля
Знание статических полей добавляет статику к определению общих полей и имеет следующий формат:

Примечание: файлы smali также являются статическими полями, а обычные поля добавляются с комментариями #static field и #instan filed соответственно.

Описание метода

.Method используется в smali для описания метода. Конкретный формат определения выглядит следующим образом:

Следует отметить, что smali добавил к нему аннотацию метода #direct

Структура файла smali также очень ясна и понятна. Его также очень удобно читать после знакомства. Давайте взглянем на простой файл smali. Чтобы облегчить понимание, мы сначала вставляем фрагмент java-кода:

Давайте проанализируем smali, который декомпилирован из этого фрагмента кода. В коде

Заключительные замечания

Я все еще чувствую, что есть много моментов, которые я не ясно изложил, поэтому я добавлю их позже.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *