Android リバース エンジニアリングは逆コンパイルのプロセスです。Android のフォワード コンパイルの結果は理解できないため、CTF での静的解析の前提は、表示されたファイルを理解して静的解析を実行できるソース コードの層に逆コンパイルすることです。 。
0X01 基本説明
Android アプリケーションのロジック コードは Java で開発されているため、最初の層は Java コードです
Java 仮想マシン JVM は Java ファイルのコンパイルを実行します 後続のクラスfile
#Android 仮想マシン Dalvik は、Java 仮想マシンの JVM コンパイル実行後に生成されるクラス ファイルではなく、パッケージ化後に生成される dex ファイルを実行して再統合した後にコンパイルされる smali ファイルです APK: コンパイル済みの Android アプリケーション インストール パッケージです dex ファイル: クラス ファイルのパッケージ化ファイルです smali ファイル: Dalvik バイトコード ファイルです classファイル: JVM バイトコード ファイルです 0X02 ツールの使用法 CTF の Android の質問では、必ずしも完全なコンパイル済み APK が得られるわけではありません。コンパイル プロセスでは、任意のファイル タイプになる可能性があります。 Brother は次のファイル タイプを分割し、ツールを使用して、Dou が理解できる Java ソース コードを取得します。タイプ 1: クラス ファイルこの状況は比較的単純です。推奨ツール jd-gui クラス ファイルを取り込むだけで、Java ソース コードが表示されます。
#タイプ 2: APK プログラム
Android プロジェクトがコンパイルされたら、必要な APK インストール パッケージを取得します。 APKファイルは実際には圧縮パッケージです。
拡張子を zip に変更して解凍すると、解凍されたファイルは次のようになります:
META-INF フォルダー:
apk パッケージの整合性とシステムのセキュリティを確保するために、apk 署名情報を保存します。
res フォルダー:
アイコンや XML ファイルなどのリソース ファイルを保存します。
AndroidManifest.xml ファイル:
アプリケーション構成ファイル。各アプリケーションを定義して含める必要があります。アプリケーション名、バージョン、権限、参照されるライブラリ ファイル、その他の情報が記述されます。
classes.dex ファイル:
Dalvik 仮想マシンに直接ロードして実行できるファイルは、IDE によって Java ファイルからコンパイルおよび生成されます。
resources.arsc file>
文字列などを含むバイナリ リソース ファイル。
APK の逆コンパイルに推奨されるツール: ApkIDE、JEB
1. JEB の使用法:
JEB は APK を直接インポートし、逆コンパイルが完了すると smali ファイルが表示されます。
Android リバース エンジニアリング ツールの多くは、小さいファイルに逆コンパイルします。
JEB smali ファイルを選択し、Q を押すと Java ファイルが表示されます。
利点: smali ファイルから逆コンパイルされた Java ファイルのコード構造は明確です。
欠点: 変更できません。
2. ApkIDE を使用します:
Project->Open Apk
逆コンパイルが完了するまで待ちます。
#smali ファイルを参照してください。
Java ソース コードが必要な smali ファイルを選択し、下のボタンをクリックして Java ソース コードを開きます。
ApkIDE は jd-gui に関連付けられているので、クリックすると jd-gui にジャンプします。
ApkIDE は APK をクラスに逆コンパイルし、jd-gui を使用して Java ソース コードを取得します。
#利点: 強力で、逆コンパイルされた smali ファイルを変更し、再コンパイルして APK を生成できます。
Brother Dou は、Java 開発愛好家であり、JEB のリバース エンジニアリング結果が好きで、見るのがより快適です。
タイプ 3: dex ファイル推奨ツール dex2.jarclasses.dex ファイル、これは Android ソース コードからコンパイルされたバイトコード パッケージです 試してみるdex2.jar ツールを使用して Java ソース コード コマンドを取得するには、次のようにします。.\d2j-dex2jar.bat C:\Users\lin\Desktop\classes.dexjar ファイルはクラス ファイルの圧縮パッケージとして理解でき、Java 仮想マシンを直接実行できます。
Jd を使用します。 -gui を使用して、classes-dex2jar.jar を開くと、Java ソース コードが表示されます。
Type 4: smali file
It smali ファイルが 1 つしかない場合は使用できません。 上記のツールは直接逆コンパイルします。
Brother Dou は、ApkIDE で APK を smali ファイルに逆コンパイルし、smali ファイルを追加、削除、変更、確認できると考えました。
そこで、彼は ApkIDE を使用して完全な APK を開いて、smari ファイルを追加しました (APK は自分で開発できます)
smali ファイルを ApkIDE プロジェクトに追加します。
再コンパイルして APK を生成します。
#コンパイルが成功すると、元の APK ディレクトリに APK が生成されます。
次に、JEB およびその他のツールでそれを開いて、Ezreal.smali ファイルを確認します。
その他のツール:
エディタ: notepad、Sublime など
Android エミュレータ: 夜神シミュレーションデバイスなど
0X04 分析例
アプリケーションをシミュレータにインストールし、インターフェイスにプロンプトが表示されるかどうかを確認します。
テキストボックスに文字を入力してボタンをクリックするとエラーが表示されますが、これは正しいフラグを判定するために使われているのでしょう。
JEB ツールを使用して Java ファイルにコンパイルします。Android ファイルの下に sdk ファイルがあります。ソース コード ファイルを分析したいと思います。 com パッケージの下にあります。
コードのカテゴリは 3 つだけです。まず、プログラム エントリ MainActivity を分析して、主要なコード ブロックを見つけます。
この if 文は、フラグが正しいかどうかを判断するためのものです。
# クラスを検索して、このメソッドが呼び出される場所を確認します。
分析により、arg12 がインターフェイスに入力されるパラメーターであることがわかり、この時点で、v5 の値が必要なフラグであることがわかります。
onCreate 関数は checkSN メソッドを呼び出し、2 つのパラメータを渡します:
MainActivity.this.edit_userName.trim()
MainActivity.this.edit_sn.getText().toString().trim()
//OnCreate は Android の特別な関数で、「ウィンドウが生成されていることを示す」ために使用されます。
//ウィンドウは生成されませんが、ウィンドウが表示される前にスタイル、位置の色などのウィンドウのプロパティを設定するだけです。
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( );
}
Else {
Toast.maketext (mainactivity.this, 0x7f06001b, 0) .Show ();
## MainActivity.this.btn_register .setEnabled(false); MainActivity.this.setTitle(0x7F060019); } });} v5 の値を分析します。v5 は v3 と v4 によって生成されます。v4 は int で、ループのために 0 に直接割り当てられます。これを直接使用できます。 で、v3 は toHexString メソッドです。戻り値は次のとおりです。 v1 は v1.update(arg11.getBytes()) に渡されます。生成された arg11 はパラメータ「Tenshine」に渡されますprivate boolean checkSN(String arg11, String arg12) {
boolean v7 = false;
if(arg11 != null) {
試してみる {
if(arg11.length() == 0) {
return v7;
}
if(arg12 == null) {
return v7;
}
if(arg12.length() != 22) {
return v7;
}
MessageDigest v1 = MessageDigest.getInstance("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(!"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 ;パブリック クラス コード { 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 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)); } System.out.println("flag{" v5.toString() "}"); }}IDEA を使用してフラグを立てます。以上がAndroid で静的解析を実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。