2012-09-28 64 views
11

我逆向工程一些android apks添加一些仪器功能测试。 我想知道给予smali如下的.smali文件,比如修改.smali文件

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

我怎么能添加一些每种方法。

.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. 提高该方法的寄存器计数,并使用新创建的寄存器

对于编号2,唯一的问题是新寄存器不在寄存器范围的末尾 - 它们实际上就在参数寄存器之前。

例如,我们采取总共5个寄存器(.registers 5)的方法,其中3个参数寄存器。所以你有v0和v1是非参数寄存器,p0-p2是3个参数寄存器,并且是v2-v4的别名。

如果您需要添加额外的2个寄存器,您最多可以将它碰到.registers 7。参数寄存器保持在寄存器范围的末尾,所以p0-p2现在被别名为v4-v6,而v2和v3是可以安全使用的新寄存器。

+0

这解释了为什么我的努力有时会莫名其妙地导致崩溃。谢谢! –

+1

这是一个很好的简洁的答案,但我认为在invoke-static结尾处有一个小的拼写错误,它需要一个;之后Ljava/lang/Throwable – GeekyDeaks

+0

这是修复,谢谢。 – JesusFreke

10

对寄存器的评论太大,无法对JesusFreke的回答发表评论。值得一提的是,如果您有.local指令而不是.register指令,则数字方案将有所不同。粗略地说,该指令涉及以下方式:

.registers = .locals + NUMBER_OF_PARAMETERS 

所以,如果你有一个具有4个参数,并使用3个寄存器,可以显示该指令的功能是.registers 7.locals 3

,你会得到寄存器设置如下:

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

来源:https://github.com/JesusFreke/smali/wiki/Registers

3

其中一个简单的方法来添加smali代码,是写在测试Android应用程序的Java代码。使用apktool反汇编。查看smali文件以识别smali代码,并将其用于注入已拆卸的其他应用程序。

下载apktool这里:http://ibotpeaches.github.io/Apktool/