2012-09-28 18 views
11

Tôi đảo ngược thiết kế một số apks android để thêm một số thiết bị đo đạc để thử nghiệm chức năng. Tôi muốn biết đưa ra một smali như sau làm thế nào tôi có thể thêm một cái gì đó giống nhưsửa đổi các tập tin .smali

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

để mỗi phương pháp trong các tập tin .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 

Trả lời

28

Mã thực tế để gọi Log.e() khá đơn giản. Nó sẽ liên quan đến một cái gì đó như:

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 

Tuy nhiên, bạn phải cẩn thận với những thanh ghi bạn sử dụng. Bạn không muốn clobber một đăng ký có một giá trị sẽ được sử dụng sau này.

Vì vậy, bạn có 2 lựa chọn:

  1. Tìm "an toàn" đăng ký sử dụng, và sử dụng những người (có thể được khôn lanh)
  2. Tăng số lượng đăng ký của phương pháp này, và sử dụng các thanh ghi mới được tạo ra

Đối với số 2, dấu hiệu duy nhất là các thanh ghi mới không nằm ở cuối phạm vi đăng ký - chúng thực sự ngay trước khi đăng ký tham số.

Ví dụ, chúng ta hãy lấy một phương pháp có tổng số 5 đăng ký (.registers 5), 3 trong số đó là các thanh ghi tham số. Vì vậy, bạn có v0 và v1 là các thanh ghi không tham số, và p0-p2 là các thanh ghi tham số 3 và là các bí danh cho v2-v4.

Nếu bạn cần thêm 2 thanh ghi bổ sung, bạn sẽ làm tăng thêm tối đa .registers 7. Các thanh ghi tham số nằm ở cuối phạm vi đăng ký, vì vậy p0-p2 bây giờ được đặt tên là v4-v6, và v2 và v3 là các thanh ghi mới được an toàn để sử dụng.

+0

Điều này giải thích tại sao nỗ lực của tôi đôi khi không thể giải thích được nguyên nhân gây ra sự cố. Cảm ơn! –

+1

Đây là một câu trả lời ngắn gọn tuyệt vời, nhưng tôi nghĩ có một lỗi nhỏ ở cuối lời gọi tĩnh và nó cần một; sau Ljava/lang/Throwable – GeekyDeaks

+0

Điều này là cố định, cảm ơn. – JesusFreke

10

Nhận xét về sổ đăng ký quá lớn để nhận xét về câu trả lời của JesusFreke. Điều đáng nói đến là nếu bạn có chỉ thị .local thay vì chỉ thị .register, sơ đồ số sẽ khác nhau. Nói đại khái, các chỉ thị liên quan theo cách sau đây:

.registers = .locals + NUMBER_OF_PARAMETERS 

Vì vậy, nếu bạn có một hàm có 4 thông số và sử dụng 3 thanh ghi hơn các chỉ thị mà có thể xuất hiện là .registers 7 hoặc .locals 3.

Và bạn sẽ nhận được thiết lập thanh ghi như sau:

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

Nguồn: https://github.com/JesusFreke/smali/wiki/Registers

3

Một trong những cách đơn giản để thêm mã smali, là để viết mã java trong một ứng dụng thử nghiệm Android. Tháo rời bằng cách sử dụng apktool. Nhìn vào các tập tin smali để xác định mã smali và sử dụng nó để tiêm vào các ứng dụng khác mà bạn đã tháo rời.

Tải xuống apktool tại đây: http://ibotpeaches.github.io/Apktool/