, (OTOH, копию netmite легче читать, чем копию в репозитории git, потому что присутствует страница CSS.)
аю сСмали и Баксмали на небольшом приложении Hello World Android, которое я написал. Мой исходный код:
package com.hello;
import android.app.Activity;
import android.os.Bundle;
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
который затем был разобран на:
.class public Lcom/hello/Main;
.super Landroid/app/Activity;
.source "Main.java"
# direct methods
.method public constructor <init>()V
.locals 0
.prologue
.line 6
invoke-direct {p0}, Landroid/app/Activity;-><init>()V
return-void
.end method
# virtual methods
.method public onCreate(Landroid/os/Bundle;)V
.locals 1
.parameter "savedInstanceState"
.prologue
.line 10
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 11
const/high16 v0, 0x7f03
invoke-virtual {p0, v0}, Lcom/hello/Main;->setContentView(I)V
.line 12
return-void
.end method
Я понимаю, что это какое-то промежуточное представительство, но я не уверен, что это такое. Как я понимаю, должна быть некоторая спецификация о том, как понимать это представление, но я не могу понять, как его искать. Таким образом, учитывая файл apk, кто-то может объяснить в непрофессионале о том, какСпецификация кода операции Dalvik используется, чтобы прийти к этому представлению? Мое нынешнее понимание таково:
Имея APK, я могу извлечь AndroidManifest.xml в двоичном формате XML и использовать такой инструмент, какaxml2xml.pl чтобы получить "текстовую" версию манифеста, которая не является полной или я мог бы использоватьapktool чтобы получить более читаемую форму. Но я все еще не уверен, какую спецификацию они используют для преобразования двоичного XML в текст.Дизассемблерыкак-то используя спецификацию кода операции Dalvil для чтения файлов dex и преобразования их в вышеприведенное представление.Любая информация (возможно, с некоторыми простыми примерами) о двух вышеупомянутых шагах очень поможет мне в правильном понимании концепций.
Обновление 1 (опубликовано после ответа Криса):
По сути, я бы сделал следующее, чтобы получить байт-код Dalvik:
Возьмите apk и распакуйте его, чтобы получить файлы classes.dex.Затем дизассемблер читает файл classes.dex и определяет все классы, присутствующие в apk. Можете ли вы дать мне некоторую информацию о том, как это делается? Он анализирует файл в шестнадцатеричном режиме и ищет спецификацию Dalvik, а затем разрешает соответствующим образом? Или что-то еще происходит? Например, когда я использовал hexdump на classes.dex, он дал мне что-то вроде этого:
64 65 78 0a 30 33 ...
Используются ли они сейчас для поиска кода операции?
Предполагая, что инструмент смог разделить входящий байт-код на отдельные классы, он затем продолжает сканировать шестнадцатеричные коды из файла classes.dex и использует спецификацию Davlik для вывода соответствующего имени кода операции из таблицы?На самом деле, короче говоря, мне интересно знать, как делается вся эта «магия». Так, например, если бы я научился писать этот инструмент, какой дорожной карте высокого уровня я должен придерживаться?