Heim > Artikel > Betrieb und Instandhaltung > So führen Sie eine statische Analyse in Android durch
Android Reverse Engineering ist der Prozess der Dekompilierung. Da die Ergebnisse der Android-Vorwärtskompilierung nicht verstanden werden können, besteht die Voraussetzung der statischen Analyse in CTF darin, die vorhandenen Dateien in eine Quellcodeschicht zu dekompilieren, die wir verstehen und statische Analysen durchführen können.
0X01 Grundlegende Erklärung
Der Logikcode der Android-Anwendung wird von Java entwickelt, daher ist die erste Ebene der Java-Code
Die Java Virtual Machine JVM führt die aus der Java-Datei kompilierte Klassendatei aus
Die Android Virtual Machine Dalvik Führen Sie nicht die nach der JVM-Kompilierung der Java Virtual Machine generierte Klassendatei aus, sondern führen Sie die nach dem Packen generierte Dex-Datei aus und integrieren Sie sie erneut. Die kompilierte Smali-Datei
APK: ist das kompilierte Android-Anwendungsinstallationspaket
Dex-Datei: ist class Die Paketdatei der Datei
smali-Datei: Es ist eine Dalvik-Bytecode-Datei
class-Datei: Es ist eine JVM-Bytecode-Datei
0X02 Tool-Verwendung
Die Android-Frage im CTF liefert Ihnen möglicherweise nicht unbedingt die vollständig kompilierte Datei APK, möglicherweise Es handelt sich um einen beliebigen Dateityp während des Kompilierungsprozesses. Im Folgenden unterteilt Brother Dou die folgenden Dateitypen und verwendet Tools, um den Java-Quellcode zu erhalten, den Brother Dou verstehen kann. Typ 1: Klassendatei. Diese Situation ist relativ einfach . Das empfohlene Tool jd-gui
ist direkt. Ziehen Sie die Klassendatei ein und Sie können den Java-Quellcode sehen.
Typ 2: APK-Programm
Nachdem das Android-Projekt kompiliert wurde, erhalten wir das gewünschte APK-Installationspaket. Die APK-Datei ist eigentlich ein komprimiertes Paket.
Ändern Sie den Suffixnamen in „zip“ und entpacken Sie die Datei wie folgt:
META-INF-Ordner:
speichert APK-Signaturinformationen, um die Integrität des APK-Pakets und die Systemsicherheit zu gewährleisten .
res-Ordner:
speichert Ressourcendateien, einschließlich Symbol- und XML-Dateien.
AndroidManifest.xml-Datei:
Anwendungskonfigurationsdatei, die von jeder Anwendung definiert und eingebunden werden muss. Sie beschreibt den Anwendungsnamen, die Version, Berechtigungen, referenzierte Bibliotheksdateien und andere Informationen.
classes.dex-Datei:
Sie können die Datei direkt auf die virtuelle Dalvik-Maschine laden und ausführen, die von der IDE aus der Java-Datei kompiliert und generiert wird.
resources.arsc-Datei>
Binäre Ressourcendatei, einschließlich Zeichenfolgen usw.
Empfohlene Tools zum Dekompilieren von APK: ApkIDE und JEB
1. JEB-Verwendung:
JEB importiert das APK direkt und Sie sehen die Smali-Datei, nachdem die Dekompilierung abgeschlossen ist.
Viele Android-Reverse-Engineering-Tools dekompilieren in kleine Dateien.
JEB Wählen Sie die Smali-Datei aus und drücken Sie Q, um die Java-Datei anzuzeigen.
Vorteile: Die Codestruktur der aus der Smali-Datei dekompilierten Java-Datei ist klar.
Nachteile: Kann nicht geändert werden.
2. Verwenden Sie ApkIDE:
Projekt->Öffnen Sie Apk
Warten Sie, bis die Dekompilierung abgeschlossen ist.
Sehen Sie sich die Smali-Datei an.
Wählen Sie die Smali-Datei aus, die Java-Quellcode erfordert, und klicken Sie auf die Schaltfläche unten, um den Java-Quellcode zu öffnen.
ApkIDE ist mit jd-gui verknüpft. Wenn Sie darauf klicken, wird zu jd-gui gesprungen.
ApkIDE dekompiliert die APK in Klassen und verwendet dann jd-gui, um den Java-Quellcode abzurufen.
Sie können die dekompilierte Klassendatei im Projektverzeichnis von ApkIDE_v3.3ApkIDEWorksrc sehen.
Vorteile: Leistungsstark, Sie können die dekompilierte Smali-Datei ändern und neu kompilieren, um APK zu generieren.
Nachteile: Der kompilierte Java-Code ist nicht klar genug. 3. Unterschiede bei der Dekompilierung gleiche APK mit den beiden oben genannten Tools. Umgekehrte Ergebnisse:
Als Java-Entwicklungsbegeisterter mag Bruder Dou die umgekehrten Ergebnisse von JEB, die komfortabler anzusehen sind.
Typ drei: Dex-Datei
Empfohlenes Tool dex2.jar
classes.dex-Datei, dies ist ein aus Android-Quellcode kompiliertes Bytecode-Paket
Versuchen Sie, das Tool dex2.jar zu verwenden, um den Java-Quellcode-Befehl wie folgt abzurufen.d2j -dex2jar.bat C:UserslinDesktopclasses.dex
jar-Dateien können als komprimierte Pakete von Klassendateien verstanden werden und die Java Virtual Machine kann direkt ausgeführt werden
Verwenden Sie JD-GUI, um „classes-dex2jar.jar“ zu öffnen und den Java-Quellcode anzuzeigen
Typ 4: Smali-Datei
Wenn nur eine einzige Smali-Datei vorhanden ist, können Sie die oben genannten Tools nicht zum direkten Dekompilieren verwenden
Bruder Dou dachte, dass ApkIDE eine APK in eine Smali-Datei dekompilieren und hinzufügen, löschen und ändern kann und überprüfen Sie die Smali-Datei
Verwenden Sie also ApkIDE, um eine beliebige vollständige APK zu öffnen und die Smali-Datei hinzuzufügen (die APK kann von Ihnen selbst entwickelt werden)
Fügen Sie die Smali-Datei zum ApkIDE-Projekt hinzu.
Neu kompilieren, um APK zu generieren.
Nach erfolgreicher Kompilierung wird eine APK im ursprünglichen APK-Verzeichnis generiert.
Öffnen Sie es mit Tools wie JEB, um die Ezreal.smali-Datei anzuzeigen.
Andere Tools:
Editor: Notepad++, Sublime usw.
Android-Emulator: Night God-Emulator usw.
0X04 Beispielfragenanalyse
Installieren Sie die Anwendung im Simulator und prüfen Sie, ob welche vorhanden sind alle Eingabeaufforderungen auf der Benutzeroberfläche.
Geben Sie Zeichen in das Textfeld ein und klicken Sie auf die Schaltfläche, um einen Fehler anzuzeigen, der zur Bestimmung der richtigen Flagge verwendet werden kann.
Kompilieren Sie es mit dem JEB-Tool in eine Java-Datei. Unter der Android-Datei befindet sich die SDK-Datei. Wir möchten die Quellcodedatei unter dem COM-Paket analysieren.
Es gibt nur drei Codekategorien. Analysieren Sie zunächst den Programmeintrag MainActivity, um die Schlüsselcodeblöcke zu finden.
Mit diesem if-Satz soll festgestellt werden, ob die Flagge korrekt ist.
Durchsuchen Sie die Klasse, um zu sehen, wo diese Methode aufgerufen wird.
Die Analyse zeigt, dass arg12 der in die Schnittstelle einzugebende Parameter ist. Zu diesem Zeitpunkt wissen wir, dass der Wert von v5 das gewünschte Flag ist.
onCreate-Funktion ruft die checkSN-Methode auf und übergibt zwei Parameter:
MainActivity.this.edit_userName.trim()
MainActivity.this.edit_sn.getText().toString().trim( )
//OnCreate ist eine spezielle Funktion in Android, die verwendet wird, um „anzugeben, dass ein Fenster generiert wird“.
//Es wird kein Fenster generiert, sondern nur die Eigenschaften des Fensters wie Stil, Position, Farbe usw. festgelegt, bevor das Fenster angezeigt wird.
public void onCreate(Bundle arg3) {
super.onCreate(arg3);
this.setContentView(0x7F040019);
this.setTitle(0x7F06001D);
this.edit_ userName = "Tenshine";
this .edit_sn = this.findViewById(0x7F0C0051);
this.btn_register = this.findViewById(0x7F0C0052);
this.btn_register.setOnClickListener(new View$OnClickListener() {
public void onClick(View arg5) {
if(!MainActivity.this.checkSN(MainActivity.this.edit_userName.trim(), MainActivity.this.edit_sn.getText().toString().trim())) {
Toast.makeText(MainActivity.this, 0x7F06001E , 0).show (); MainActivity.this.btn_register.setEnabled(false);
MainActivity .this.setTitle(0x7F060019);
Sie können es direkt verwenden
und v3 ist der Rückgabewert des toHexString Methode und muss übergeben werden. v1 ist v1.update(arg11.getBytes()); das generierte
arg11 ist der übergebene Parameter „Tenshine“
private boolean checkSN(String arg11, String arg12) {
boolean v7 = false;
if(arg11 != null) {
try {
if(arg11.length() == 0) {
zurück v7;
}
if(arg12 == null) {
return v7;
}
if(ar g12.length() != 22) {
return v7;
}
MessageDigest v1 = MessagedIGest.getInstance ("Md5");
v1.reset ();
StringBuilder v5 = new StringBuilder(); int v4; for(v4 = 0; v4 .append(v3.charAt(v4)) ; } if(!"flag{" + v5.toString() + "}".equalsIgnoreCase(arg12)) { return v7; } } catch(NoSuchAlgorithmException v2) {goto label_40; } v7 = true; } return v7;label_40: v2.printStackTrace(); return v7;}将上面的分析结果,取出生成v5的关系代码都是纯java代码,不需要Android的包引入,只需引入java的依赖包。import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;öffentliche Klasse Code { static String toHexString(byte[] arg8, String arg9) { StringBuilder v3 = new StringBuilder(); byte[] v0 = arg8; int v5 = v0.length; int v4; for(v4 = 0; v4 String v2 = Integer.toHexString(v0[v4] & 255); if(v2.length() == 1) { v3.append('0');
} v3.append(v2).append(arg9); } return v3.toString(); } public static void main(String[] args)throws Ausnahme{ MessageDigest v1 = MessageDigest .getInstance("MD5"); v1.reset(); v1.update("Tenshine".getBytes()); String v3 = Code.toHexString(v1.digest(), ""); StringBuilder v5 = new StringBuilder(); int v4; for(v4 = 0; v4 v5.append(v3.charAt(v4 ) ); } System.out.println("flag{" + v5.toString() + "}"); . }}用IDEA编辑运行,拿到flag。
Das obige ist der detaillierte Inhalt vonSo führen Sie eine statische Analyse in Android durch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!