Verständnis Demontage der Dalvik-code?
Ich bin Herumspielen mit smali und baksmali auf ein kleines Hello World " - Android-Anwendung, die ich geschrieben habe. Mein Quelltext ist:
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);
}
}
wurde dann zerlegt:
.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
Ich verstehe, dass dies einige Art von Intermediate Representation, bin aber nicht sicher, was es ist. So wie ich das verstehe muss es irgendeine Spezifikation auf, wie zu verstehen, diese Darstellung aber nicht in der Lage bin, um herauszufinden, wie die Suche für Sie. So eine apk-Datei ist, kann mir jemand erklären, in einfachen Begriffen, wie die Dalvik opcode-Spezifikation wird verwendet, um kommen auf diese Darstellung? Mein Aktuelles Verständnis ist dieses:
- Gegeben eine APK, die ich extrahieren konnte die
AndroidManifest.xml in einem Binären XML
format und verwenden Sie ein tool wie
axml2xml.pl zu bekommen, eine "textuelle"
version des manifests, die nicht
die vollständige ODER könnte ich die
apktool , um eine besser lesbare
form. Aber ich bin noch nicht sicher, was
Spezifikation, die Sie verwenden, um
konvertieren der binären XML-Code in text. - Die
Zerleger sind irgendwie nutzen
die Dalvil opcode-Spezifikation
Lesen Sie die dex-Dateien und konvertiert es
in der obigen Darstellung.
Informationen (vielleicht mit einigen einfachen Beispielen) auf die beiden oben genannten Schritte helfen würde, mich in eine gute Möglichkeit zu bekommen, die Konzepte Recht.
Update 1 (geschrieben nach der Antwort von Chris):
Also im wesentlichen, ich würde Folgendes tun, um rechtzeitig an den Dalvik bytecode:
- Nehmen Sie eine apk, und extrahieren Sie es, um die Klassen.dex-Dateien.
-
Dann den disassembler liest den Klassen.dex-Datei und bestimmt, dass alle Klassen vorhanden, die in der apk. Können Sie mir einige Informationen darüber, wie dies geschehen ist? Es tut Parsen der Datei im hex-Modus und Suche die Dalvik-Spezifikation und lösen dann entsprechend? Oder ist etwas anderes passiert? Zum Beispiel, wenn ich in den hexdump auf Klassen.dex, es gab mir so etwas wie dieses:
64 65 78 0a 30 33 ...
Sind diese nun für Opcode-lookups?
- Unter der Annahme, dass das tool war in der Lage, trennen Sie den eingehenden bytecode in separate Klassen geht es dann weiter, um scan die hex-codes aus den Klassen.dex-Datei und verwendet die Davlik-Spezifikation, um die Ausgabe der entsprechenden Opcode Namen aus der Tabelle?
Eigentlich, kurz gesagt, ich bin daran interessiert zu wissen, wie alle diese "Magie" ist fertig. So zum Beispiel, wenn ich waren zu lernen, zu schreiben ist dieses tool, was die high-level-roadmap sollte ich Folgen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie hier sehen ist das davlik-bytecode. Java-code übersetzt wird, um Dalvik-bytecode durch das dx-tool. Das manifest ist ein eigenes Thema, ich werde in einer minute. Effektiv, wenn Sie kompilieren Sie Ihre Android-Anwendung, die dx-tool wandelt Ihre Java-code in bytecode (der gleichen Weise, dass javac konvertiert den Java-zu-Java-bytecode für eine standard-JVM-Anwendung) mit der 256 dalvik-opcodes.
Beispielsweise
invoke-super
ist ein opcode, das weist die dvm (dalvik virtual machine), um eine Methode aufzurufen, die auf der super-Klasse. Ebensoinvoke-interface
weist der dvm, der zum aufrufen einer interface-Methode.So können Sie sehen, dass
übersetzt
In diesem Fall
invoke-super
nimmt zwei Parameter, die{p0,p1
Gruppe und dieLandroid/app/Activity;->onCreate(Landroid/os/Bundle;)
parameter, die die Methode ist, die Spezifikation, die es verwendet, um zu suchen und zu beheben, die Methode, wenn nötig.Dann gibt es die
invoke-direct
rufen Sie im Konstruktor Bereich.Jede Klasse hat eine
init
Methode, die verwendet wird, zum initialisieren der Klasse die Daten der Mitglieder, auch bekannt als Konstruktor. Wenn erstellen Sie eine Klasse, die virtuelle Maschine muss sich auch an den Konstruktor der Superklasse. Dies erklärt, warum der Konstruktor für Ihre Klasse ruft dieActivity
Konstruktor.Mit Bezug auf das manifest, was passiert (dies ist alles in der Dalvik-Spezifikationen, wenn Sie Auschecken der source-code) ist, dass der compiler (erzeugt, dass der apk-Datei) konvertiert, das manifest zu einem stärker komprimierten format (binary xml) für die Zwecke der Platzersparnis. Das manifest hat nichts zu tun mit dem code, den du gepostet hast, ist es mehr weist der dvm, wie die Bearbeitung der Bewerbung ist ein ganzes mit Bezug auf
Activities
,Services
usw. Das was du gepostet hast ist das, was tatsächlich ausgeführt wird.Das ist ein high-level-Antwort auf Ihre Frage. Wenn Sie mehr benötigen, lassen Sie es mich wissen und ich werde mein bestes tun.
Bearbeiten bist Du grundsätzlich Recht. Der decompiler liest die binären Daten als byte-stream aus dem dex-Datei. Es hat ein Verständnis von dem, was das format sein sollte, und ist in der Lage zu ziehen aus Informationen wie Konstanten, Klassen, etc. Mit Bezug auf die Befehle, das ist genau das, was es tut. Sie verstehen, was der byte-Wert für jeden opcode ist (oder, wie es ist vertreten in den dex-Datei) und ist in der Lage zu konvertieren, die in eine lesbare Zeichenfolge. Wenn Sie gehen, um dies zu implementieren, abgesehen vom Verständnis der Allgemeinen Grundlagen von Compilern, ich würde beginnen, mit einem tiefen Verständnis der Struktur einer dex-Datei. Von dort aus, würden Sie brauchen, um eine Tabelle zu erstellen, die Spiele-opcode-Werte mit den für Menschen lesbaren string. Mit diesen Informationen und einige zusätzliche Informationen in Bezug auf string-Konstanten, etc. Sie bauen könnten, die eine text-Datei-Darstellung des kompilierten Klasse. Macht das Sinn?
Den opcode-Spezifikation beschreibt nur die Anweisungen. Die dex-Datei-format ist mehr als das - es enthält alle benötigten Metadaten für die Dalvik VM (und den disassembler) zum interpretieren der Datei - strings, Klassen, Typen, Methoden und so weiter. Siehe auch die offizielle spec opcode, es ist mehr vollständig und ausführlich als die, die Sie verknüpft.
<plug>
BTW, die nächste version von IDA Pro unterstützen Demontage .dex-Dateien</plug>