Maison > Article > Opération et maintenance > Comment effectuer une analyse statique sous Android
L'ingénierie inverse Android est le processus de décompilation. Étant donné que le résultat de la compilation directe Android ne peut pas être compris, le principe de l'analyse statique dans CTF est de décompiler les fichiers qui apparaissent en une couche de code source que nous pouvons comprendre et exécuter en statique. analyse.
0X01 Description de base
Le code logique des applications Android est développé par Java, donc la première couche est du code java
Java Virtual Machine JVM Quoi est en cours d'exécution est le fichier de classe compilé à partir du fichier java
La machine virtuelle Android Dalvik n'est pas le fichier de classe généré après l'exécution de la compilation JVM de la machine virtuelle Java, mais le fichier dex généré après l'exécution et la réintégration le package. Le fichier smali
APK : est le package d'installation de l'application Android compilé
fichier dex : est le fichier d'emballage du fichier de classe
smali file : C'est un fichier de bytecode Dalvik
class file : C'est un fichier de bytecode JVM
0X02 Utilisation de l'outil
La question Android dans CTF n'est pas nécessairement Je vais vous donner l'APK entièrement compilé, qui peut être n'importe quel type de fichier pendant le processus de compilation. Ci-dessous, Brother Dou divise les types de fichiers suivants et utilise des outils pour obtenir le code source Java que Brother Dou peut comprendre
.Type 1 : fichier de classe
Cette situation est relativement simple L'outil recommandé jd-gui
peut directement extraire le fichier de classe et vous pouvez voir le java. code source.
Type 2 : programme APK
Une fois le projet Android compilé, nous allons obtenez ce que nous voulons du package d’installation APK, le fichier APK est en fait un package compressé.
Changez le nom du suffixe pour le compresser et décompressez-le. Le fichier décompressé est comme indiqué ci-dessous :
#🎜 🎜##🎜 🎜#
En tant que passionné de développement Java, Brother Dou aime les résultats inverses de JEB, qui sont plus confortables à regarder.
Type 3 : fichier dex Outil recommandé dex2.jarfichier classes.dex, il s'agit d'un package de bytecode compilé à partir du code source Android # 🎜🎜#Essayez d'utiliser l'outil dex2.jar pour obtenir la commande de code source Java comme suit
.d2j-dex2jar.bat C:UserslinDesktopclasses.dex
Les fichiers jar peuvent être compris comme des packages compressés de fichiers de classes, et la machine virtuelle Java peut être exécutée directement
Utilisez Jd-gui pour ouvrir classes-dex2jar.jar pour voir le code source Java
Type 4 : fichier smali
Lorsqu'il n'y a qu'un seul fichier smali, vous ne pouvez pas utiliser les outils ci-dessus pour décompiler directement
Brother Dou pensait qu'ApkIDE pouvait décompiler un APK en un fichier smali, et ajouter, supprimer, modifier et vérifiez le fichier smali
Utilisez donc ApkIDE pour ouvrir n'importe quel APK complet et ajoutez le fichier smali (l'APK peut être développé par vous-même)
Ajoutez le fichier smali au projet ApkIDE.
Recompilez pour générer l'APK.
Après une compilation réussie, un APK sera généré dans le répertoire APK d'origine.
Ouvrez-le avec des outils tels que JEB pour voir le fichier Ezreal.smali.
Autres outils :
Éditeur : notepad++, Sublime, etc.
Simulateur Android : simulateur Night God, etc.
0X04 Exemple d'analyse de questions
Installez l'application dans le simulateur et vérifiez s'il y a toutes les invites sur l’interface.
Entrez des caractères dans la zone de texte et cliquez sur le bouton pour provoquer une erreur. Devinez si elle peut être utilisée pour déterminer le bon drapeau.
Utilisez l'outil JEB pour le compiler dans un fichier java. Sous le fichier Android se trouve le fichier sdk. Nous voulons analyser le fichier de code source sous le package com.
Il n'y a que trois catégories de code. Tout d'abord, analysez l'entrée du programme MainActivity pour trouver les blocs de code clés.
Cette phrase sert à déterminer si le drapeau est correct.
Recherchez dans la classe pour voir où cette méthode est appelée.
L'analyse montre que arg12 est le paramètre à saisir dans l'interface. A ce moment, nous savons que la valeur de v5 est le drapeau que nous voulons. La fonction
onCreate appelle la méthode checkSN et transmet deux paramètres :
MainActivity.this.edit_userName.trim()
MainActivity.this.edit_sn.getText().toString().trim()
//OnCreate est une fonction spéciale d'Android, utilisée pour "indiquer qu'une fenêtre est en cours de génération".
//Il ne génère pas de fenêtre, mais définit uniquement les propriétés de la fenêtre telles que le style, la position, la couleur, etc. avant que la fenêtre ne soit affichée.
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);
Vous pouvez l'utiliser directement
et v3 est la valeur de retour de toHexString. et doit être transmis. v1 est v1.update(arg11.getBytes()); le
arg11 généré est le paramètre transmis "Tenshine"
private boolean checkSN(String arg11, String arg12) {
boolean v7 = false;
if(arg11 != null) {
#🎜 🎜# essayez { if(arg11.length() == 0) { return v7; }#🎜 🎜# if(arg12 == null) {
return v7;
}
if(arg12.length() != 22) {
return v7;
retourner la version 7 ; MessageDigest v1 = MD5");
v1. reset();
v1.update(arg11.getBytes());
String v3 = MainActivity.toHexString(v1.digest(), "");#🎜 🎜#
StringBuilder v5 = new StringBuilder(); int v4; for(v4 = 0; v4 v5.append(v3.charAt(v4)); } if(!"fla g{" + v5 .toString() + "}" }#🎜 🎜# catch(NoSuchAlgorithmException v2) {
goto label_40;
}
v7 = vrai;
}# 🎜🎜#
retour v7;label_40: v2.printStackTrace(); retour v7;#🎜 🎜## 🎜🎜#}将上面的分析结果,取出生成v5的关系代码都是纯java代码,Pour Android, il s'agit de Java的依赖包。import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class Code {# 🎜🎜# string statique toHexString(byte[] arg8, String arg9) {
StringBuilder v3 = new StringBuilder();
byte[] v0 = arg8;#🎜🎜 #
int v5 = v0.length; int v4; for(v4 = 0; v4 ≪ version 5 ; ++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 NoSuchAlgorithmException{ #🎜 🎜#
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))( # }
}
用IDEA编辑运行,拿到flag。
#🎜 🎜##🎜 🎜#
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!