ホームページ  >  記事  >  運用・保守  >  Android で静的解析を実行する方法

Android で静的解析を実行する方法

WBOY
WBOY転載
2023-05-11 22:28:121113ブラウズ

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 ソース コードが表示されます。


Android で静的解析を実行する方法
#タイプ 2: APK プログラム

Android プロジェクトがコンパイルされたら、必要な APK インストール パッケージを取得します。 APKファイルは実際には圧縮パッケージです。

拡張子を zip に変更して解凍すると、解凍されたファイルは次のようになります:


Android で静的解析を実行する方法
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 で静的解析を実行する方法
Android リバース エンジニアリング ツールの多くは、小さいファイルに逆コンパイルします。

JEB smali ファイルを選択し、Q を押すと Java ファイルが表示されます。


Android で静的解析を実行する方法
利点: smali ファイルから逆コンパイルされた Java ファイルのコード構造は明確です。

欠点: 変更できません。

2. ApkIDE を使用します:

Project->Open Apk

逆コンパイルが完了するまで待ちます。


Android で静的解析を実行する方法#smali ファイルを参照してください。

Android で静的解析を実行する方法Java ソース コードが必要な smali ファイルを選択し、下のボタンをクリックして Java ソース コードを開きます。

Android で静的解析を実行する方法ApkIDE は jd-gui に関連付けられているので、クリックすると jd-gui にジャンプします。

Android で静的解析を実行する方法ApkIDE は APK をクラスに逆コンパイルし、jd-gui を使用して Java ソース コードを取得します。

逆コンパイルされたクラス ファイルは、ApkIDE の ApkIDE_v3.3\ApkIDE\Worksrc のプロジェクト ディレクトリで確認できます。

Android で静的解析を実行する方法#利点: 強力で、逆コンパイルされた smali ファイルを変更し、再コンパイルして APK を生成できます。

欠点: コンパイルされた Java コードは十分に明確ではありません。

3. 逆コンパイルの違い

Smali ファイルは Smali 構文で書かれていますが、Smali 構文は緩い構文です

したがって、逆コンパイル プロセス、ツールが異なり、 Java ソース コードは明らかに異なります。

次は、上記 2 つのツールを使用して同じ APK を反転した結果です:

Android で静的解析を実行する方法

Brother Dou は、Java 開発愛好家であり、JEB のリバース エンジニアリング結果が好きで、見るのがより快適です。 Android で静的解析を実行する方法

タイプ 3: dex ファイル

推奨ツール dex2.jar

classes.dex ファイル、これは Android ソース コードからコンパイルされたバイトコード パッケージです

試してみるdex2.jar ツールを使用して Java ソース コード コマンドを取得するには、次のようにします。

.\d2j-dex2jar.bat C:\Users\lin\Desktop\classes.dex


Android で静的解析を実行する方法

jar ファイルはクラス ファイルの圧縮パッケージとして理解でき、Java 仮想マシンを直接実行できます。

Jd を使用します。 -gui を使用して、classes-dex2jar.jar を開くと、Java ソース コードが表示されます。


Android で静的解析を実行する方法

Type 4: smali file

It smali ファイルが 1 つしかない場合は使用できません。 上記のツールは直接逆コンパイルします。

Brother Dou は、ApkIDE で APK を smali ファイルに逆コンパイルし、smali ファイルを追加、削除、変更、確認できると考えました。

そこで、彼は ApkIDE を使用して完全な APK を開いて、smari ファイルを追加しました (APK は自分で開発できます)


Android で静的解析を実行する方法

smali ファイルを ApkIDE プロジェクトに追加します。


Android で静的解析を実行する方法

再コンパイルして APK を生成します。

Android で静的解析を実行する方法

#コンパイルが成功すると、元の APK ディレクトリに APK が生成されます。


Android で静的解析を実行する方法

次に、JEB およびその他のツールでそれを開いて、Ezreal.smali ファイルを確認します。


Android で静的解析を実行する方法

その他のツール:

エディタ: notepad、Sublime など

Android エミュレータ: 夜神シミュレーションデバイスなど

0X04 分析例

アプリケーションをシミュレータにインストールし、インターフェイスにプロンプ​​トが表示されるかどうかを確認します。

テキストボックスに文字を入力してボタンをクリックするとエラーが表示されますが、これは正しいフラグを判定するために使われているのでしょう。


Android で静的解析を実行する方法

JEB ツールを使用して Java ファイルにコンパイルします。Android ファイルの下に sdk ファイルがあります。ソース コード ファイルを分析したいと思います。 com パッケージの下にあります。


Android で静的解析を実行する方法

コードのカテゴリは 3 つだけです。まず、プログラム エントリ MainActivity を分析して、主要なコード ブロックを見つけます。

この if 文は、フラグが正しいかどうかを判断するためのものです。

Android で静的解析を実行する方法

# クラスを検索して、このメソッドが呼び出される場所を確認します。

分析により、arg12 がインターフェイスに入力されるパラメーターであることがわかり、この時点で、v5 の値が必要なフラグであることがわかります。


Android で静的解析を実行する方法

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 で静的解析を実行する方法

以上がAndroid で静的解析を実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。