2012-09-28 12 views
11

私はリバースエンジニアリングしていくつかのアンドロイドAPKをテストし、機能テスト用の計測器を追加しました。 私は.smaliファイル内の各メソッドに.smaliファイルを変更する

Log.e(TAG, "some descritpion", e); 

のようなものを追加する方法を次のようにsmali与えられたかを知りたいです。

.class public Ld; 
.super Landroid/view/View; 
.source "SourceFile" 


# instance fields 
.field a:Z 

.field b:Lcom/rovio/ka3d/App; 


# direct methods 
.method public constructor <init>(Lcom/rovio/ka3d/App;)V 
    .locals 2 
    .parameter 

    .prologue 
    const/4 v1, 0x1 

    .line 317 
    invoke-direct {p0, p1}, Landroid/view/View;-><init>(Landroid/content/Context;)V 

    .line 313 
    const/4 v0, 0x0 

    iput-boolean v0, p0, Ld;->a:Z 

    .line 314 
    const/4 v0, 0x0 

    iput-object v0, p0, Ld;->b:Lcom/rovio/ka3d/App; 

    .line 318 
    iput-object p1, p0, Ld;->b:Lcom/rovio/ka3d/App; 

    .line 319 
    invoke-virtual {p0, v1}, Ld;->setFocusable(Z)V 

    .line 320 
    invoke-virtual {p0, v1}, Ld;->setFocusableInTouchMode(Z)V 

    .line 321 
    return-void 
.end method 


# virtual methods 
.method public a(Z)V 
    .locals 4 
    .parameter 

    .prologue 
    const/4 v3, 0x0 

    .line 325 
    invoke-virtual {p0}, Ld;->getContext()Landroid/content/Context; 

    move-result-object v0 

    const-string v1, "input_method" 

    invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; 

    move-result-object v0 

    check-cast v0, Landroid/view/inputmethod/InputMethodManager; 

    .line 326 
    invoke-virtual {p0}, Ld;->getWindowToken()Landroid/os/IBinder; 

    move-result-object v1 

    invoke-virtual {v0, v1, v3}, Landroid/view/inputmethod/InputMethodManager;->hideSoftInputFromWindow(Landroid/os/IBinder;I)Z 

    .line 327 
    if-eqz p1, :cond_0 

    .line 329 
    invoke-virtual {p0}, Ld;->getWindowToken()Landroid/os/IBinder; 

    move-result-object v1 

    const/4 v2, 0x2 

    invoke-virtual {v0, v1, v2, v3}, Landroid/view/inputmethod/InputMethodManager;->toggleSoftInputFromWindow(Landroid/os/IBinder;II)V 

    .line 330 
    invoke-virtual {p0}, Ld;->requestFocus()Z 

    .line 333 
    :cond_0 
    iput-boolean p1, p0, Ld;->a:Z 

    .line 334 
    return-void 
.end method 

.method public onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; 
    .locals 3 
    .parameter 

    .prologue 
    .line 343 
    new-instance v0, La; 

    iget-object v1, p0, Ld;->b:Lcom/rovio/ka3d/App; 

    const/4 v2, 0x0 

    invoke-direct {v0, v1, p0, v2}, La;-><init>(Lcom/rovio/ka3d/App;Landroid/view/View;Z)V 

    .line 345 
    const/4 v1, 0x0 

    iput-object v1, p1, Landroid/view/inputmethod/EditorInfo;->actionLabel:Ljava/lang/CharSequence; 

    .line 350 
    const v1, 0x80090 

    iput v1, p1, Landroid/view/inputmethod/EditorInfo;->inputType:I 

    .line 351 
    const/high16 v1, 0x1000 

    iput v1, p1, Landroid/view/inputmethod/EditorInfo;->imeOptions:I 

    .line 352 
    return-object v0 
.end method 

答えて

28

Log.e()を呼び出す実際のコードはかなり簡単です。

const-string v0, "MyTag" 
const-string v1, "Something to print" 
# assuming you have an exception in v2... 
invoke-static {v0, v1, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I 

ただし、使用するレジスタには注意が必要です。後で使用される値を持つレジスタを壊すことは望ましくありません。

だから、あなたは2つのオプションがあります:

  1. 「安全」、未使用のレジスタを検索し、そして(注意が必要です)それらを使用
  2. の方法のレジスタ数を増やして、新しく作成されたレジスタ
  3. を使用

番号2の場合、新しいレジスタはレジスタ範囲の最後ではなく、実際はパラメータレジスタの直前です。

たとえば、合計5つのレジスタ(.registers 5)を持つメソッドを考えてみましょう。そのうち3つはパラメータレジスタです。したがって、非パラメタレジスタであるv0とv1と、3つのパラメータレジスタであるp0〜p2を持ち、v2〜v4のエイリアスです。

さらに2つのレジスタを追加する必要がある場合は、.registers 7までバンプします。パラメータレジスタはレジスタ範囲の最後に留まるので、p0-p2はv4-v6にエイリアスされ、v2およびv3は安全に使用できる新しいレジスタです。

+0

私の努力は時々不可解クラッシュを引き起こす理由を説明。ありがとう! –

+1

これは非常に簡潔な答えですが、私はinvoke-staticの終わりに小さなタイプミスがあり、それが必要だと思います。 Ljava/lang/Throwableの後 – GeekyDeaks

+0

これは修正されました。ありがとうございます。 – JesusFreke

10

JesusFrekeの答えに対するコメントには大きすぎるレジスタに対するコメント。 .registerディレクティブの代わりに.localディレクティブがある場合は、番号体系が異なります。大雑把に言えば、ディレクティブは次のように関連しています。

だから、
.registers = .locals + NUMBER_OF_PARAMETERS 

あなたは4つのパラメータを持っており、3つの以上のレジスタ.registers 7または.locals 3です現れる可能性のディレクティブを使用して機能を持っている場合。次のように

そして、あなたは、レジスタの設定を取得します:

v0 
v1 
v2 
v3 <==> p0 
v4 <==> p1 
v5 <==> p2 
v6 <==> p3 

出典:smaliコードを追加するための単純な方法のhttps://github.com/JesusFreke/smali/wiki/Registers

3

一つ、テストアンドロイドアプリでJavaコードを記述することです。 apktoolを使用して逆アセンブルします。 smaliファイルを見て、smaliコードを特定し、それを逆アセンブルした他のアプリケーションに注入するために使用します。ここ

ダウンロードapktool:http://ibotpeaches.github.io/Apktool/

関連する問題