我反向设计了一些android apks来添加一些功能测试的工具。 我想知道如果给我一个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
答案 0 :(得分:29)
调用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,唯一的问题是新寄存器不在寄存器范围的末尾 - 它们实际上就在参数寄存器之前。
例如,让我们采用一个总共有5个寄存器(.registers 5
)的方法,其中3个是参数寄存器。所以你有v0和v1是非参数寄存器,p0-p2是3参数寄存器,是v2-v4的别名。
如果您需要添加额外的2个寄存器,则会将其提升至.registers 7
。参数寄存器保持在寄存器范围的末尾,因此p0-p2现在别名为v4-v6,而v2和v3是可安全使用的新寄存器。
答案 1 :(得分: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
答案 2 :(得分:3)
添加smali代码的一种更简单的方法是在测试android应用程序中编写java代码。使用apktool反汇编。查看smali文件以识别smali代码并将其用于注入您已反汇编的其他应用程序。
在这里下载apktool:http://ibotpeaches.github.io/Apktool/
答案 3 :(得分:0)
另一个我一直在使用的选项,我为此创建了一个 FileWritter.java
类是打开您最喜欢的 IDEA (Intellij/Android Studio),下载Java2Smali 插件以获得正确的 IDEA 并运行该插件。
简而言之:
这是java2smali plugin的链接
如何使用?
================================================ ========================== 干杯!