web-dev-qa-db-ja.com

Androidアプリケーションのsmaliコードをデバッグする方法は?

動作しているAndroidアプリケーションがあります。ソースコードがありません。このアプリケーションの機能をデバッグしたいと思います。apktoolを使用して、このアプリケーションのapkファイルを正常にリバースエンジニアリングできます--- https://code.google.com/p/Android-apktool/ このツールは、クラスファイルをsmali形式で生成します。

私の要件は:

  1. デバッグログを追加してメソッドをデバッグできるようにするため。
  2. スタックトレースを出力してメソッド呼び出しをデバッグできるようにするため。

これを実現するには、デバッグログまたはスタックトレースに相当するsmaliを挿入/挿入する必要があります。メソッドの1つの開始時にsmali命令を追加しようとしましたが、ClassVerifyErrorでクラッシュしました。

smaliコードの例-

.method public declared-synchronized b()V
    .locals 2

    .prologue

    .line 87
    monitor-enter p0

    :try_start_0
    iget-object v0, p0, Lcom/example/viewerlib/t/d;->a:Ljava/lang/Thread;

    invoke-virtual {v0}, Ljava/lang/Thread;->isAlive()Z

               :
               :

誰かがsmaliデバッグログを追加するのを手伝ってくれませんか。事前にThnx。

1。smaliのデバッグログ

Smaliのデバッグログ。たとえば、メソッドtest()の内部で、「Test()の内部」デバッグログを出力するとします。 smaliのメソッドの開始時に、次の手順を追加します。

sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

const-string v1, "Inside Test()"

invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

注-ここでレジスタv0、v1を使用するときは注意が必要です。コード実行フローでは、フローの後半で使用されるレジスタの1つを使用していないことを確認する必要があります。または、例外が発生する場合があります。

2。StackTrace

これは、メソッドのスタックトレースを出力するためのsmaliのコードです。

Javaコード

public static void printStackTraces() {
    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 
    for (StackTraceElement element : stackTraceElements) {
        System.out.println("Class name :: " + element.getClassName() + "  || method name :: " + element.getMethodName());
    }
}

そして同等のsmaliコードは

.method public static printStackTraces()V
    .locals 7

    .prologue
    .line 74
    invoke-static {}, Ljava/lang/Thread;->currentThread()Ljava/lang/Thread;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/Thread;->getStackTrace()[Ljava/lang/StackTraceElement;

    move-result-object v1

    .line 75
    .local v1, stackTraceElements:[Ljava/lang/StackTraceElement;
    array-length v3, v1

    const/4 v2, 0x0

    :goto_0
    if-lt v2, v3, :cond_0

    .line 78
    return-void

    .line 75
    :cond_0
    aget-object v0, v1, v2

    .line 76
    .local v0, element:Ljava/lang/StackTraceElement;
    sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream;

    new-instance v5, Ljava/lang/StringBuilder;

    const-string v6, "Class name :: " 

    invoke-direct {v5, v6}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    invoke-virtual {v0}, Ljava/lang/StackTraceElement;->getClassName()Ljava/lang/String;

    move-result-object v6

    invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v5

    const-string v6, "  || method name :: " 

    invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v5

    invoke-virtual {v0}, Ljava/lang/StackTraceElement;->getMethodName()Ljava/lang/String;

    move-result-object v6

    invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v5

    invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v5

    invoke-virtual {v4, v5}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    .line 75
    add-int/lit8 v2, v2, 0x1

    goto :goto_0
.end method

このメソッドを任意のsmaliファイルに追加します。そして、

(上記のsmaliコードをcom.example.pakagename.ClassNameに追加したと仮定)

invoke-static {}, Lcom/example/packagename/ClassName;->printStackTraces()V

お役に立てれば .....

26
rajan goswami

IntellijIdeaが好きなら、 smalidea チャンスを与えてください!

4
packmad

これで、Android StudioまたはIntellij IDEA -- Smalidea )の優れたプラグインを使用できます。さらに、インストールプロセスと私のデバッグ ブログ投稿。

4
CROSP

ちょっと私はあなたがこのツールが役立つかもしれないと思っていました

apkファイルをJava記述されたコードクラスに逆コンパイルします

このリンクをチェックして試してみてください

http://forum.xda-developers.com/showthread.php?t=243041

2
Owehbeh

私はソニーのapkanalyzerを使用することをお勧めします:

https://github.com/sonyxperiadev/ApkAnalyser

apk-sを逆コンパイルしてsmaliコードを読み取り、printステートメントをさまざまな場所に挿入できます。メニューオプションがあります:「カスタムログを印刷する」、スタックトレースを印刷することもでき、他の多くのことを行うことができます。すべての変更が終わったら、デバイス->インストールを押してapkを起動します。すべてGUIから。

2
marcinj

Apkanalyzerはststicアナライザーであることを指摘して申し訳ありませんsmaliコードを理解および編集するには、次のことを試してください

http://themasterofmagik.wordpress.com/2014/03/08/decompilerecompile-an-apk-basic-editing/

さまざまなシナリオでの編集について説明します。どのツールをいつ使用するか。

APKを逆コンパイル/再コンパイルするためのさまざまなアプローチ

a. apk
    1. apktool + Notepad++
    2. Virtuous Ten Studio
    3. AndroChef Java Decompiler
b. classes.dex
    1. smali/baksmali
    2. dex2jar + JD-GUI
1
ASD

Smalideaプラグインを使用してみましたが、動作させることができなかったため、以下に示す別のアプローチで試してみました。

Android Studio 3.1.2、[ファイル]-> [プロファイルの選択]または[APKの分析]オプションに移動]にオプションがあります。次に、Apkをclasses.dexファイルとsmaliを含むファイルから逆コンパイルします。次に、Rus As-> Debugオプションを使用して、任意のsmaliファイルにブレークポイントを設定すると、指定したブレークポイントで停止します。これは、アプリケーションに単一のdexファイルがある場合にのみ機能します。ただし、マルチdexアプリケーションには回避策があります。以下の手順に従う必要があります-

1)Apktoolツールを ここ からダウンロードします

2)-> apktooldを使用してAPKを逆コンパイルします

3)上記で生成されたすべてのsmaliファイルを複数のフォルダー(smali、smali_classess2、smali_classes3など)にコピーして、Android Studio-> Analyze Apkメソッドから作成したoutフォルダーにコピーします。これにより、すべてのsmaliがファイルは単一のフォルダにあります

4)この手順が必要かどうかはわかりませんが、これを実行しました。この手順を確認してください。ここでも、コマンド-> apktool bを使用して、手順2で作成したフォルダーを使用してapktoolを使用してApkをビルドします。これにより、すべての.dexファイルが生成され、以前にAnalyzeApkメソッドを使用して単一のclasses.dexファイルが生成されたのと同じ場所にすべてのファイルがコピーされます。

5)Analyze Apkメソッドを使用して作成された同じプロジェクトを使用すると、デバッグできます。

P.S. -Android studioはJavaコードを使用したデバッグについて文句を言いますが、この方法は機能します。この方法は、smaliファイルを編集している場合にのみ役立ちます。それをデバッグします。

0
Fenil