Что такое дизассемблирование кода Dalvik?

Я играю с smali и baksmali в небольшом приложении для Android Hello World, которое я написал. Мой исходный код:

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 ()V
    .locals 0

    .prologue
    .line 6
    invoke-direct {p0}, Landroid/app/Activity;->()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 для вывода соответствующего имени кода операции из таблицы?

Короче говоря, мне интересно узнать, как творится вся эта «магия». Так, например, если бы я научился писать этот инструмент, какой высокоуровневой дорожной карты мне следовало бы следовать?

5
задан Legend 27 January 2011 в 19:01
поделиться