修改.smali文件

时间:2012-09-28 22:31:01

标签: android apk logcat smali

我反向设计了一些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

4 个答案:

答案 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

但是,您必须小心使用的寄存器。您不希望破坏具有稍后将使用的值的寄存器。

所以你有两个选择:

  1. 查找“安全”未使用的寄存器,并使用它们(可能很棘手)
  2. 增加方法的寄存器计数,并使用新创建的寄存器
  3. 对于数字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

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

答案 2 :(得分:3)

添加smali代码的一种更简单的方法是在测试android应用程序中编写java代码。使用apktool反汇编。查看smali文件以识别smali代码并将其用于注入您已反汇编的其他应用程序。

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

答案 3 :(得分:0)

另一个我一直在使用的选项,我为此创建了一个 FileWritter.java 类是打开您最喜欢的 IDEA (Intellij/Android Studio),下载Java2Smali 插件以获得正确的 IDEA 并运行该插件。

简而言之:

  • 打开您的 AndroidStudio/Intellij
  • 转到文件/设置
  • 点按搜索栏并搜索“插件”
  • 在您登陆插件 UI 后,请确保位于“MarketPlace” 标签在那里
  • 搜索 java2smali,安装它并重新启动 IDEA

这是java2smali plugin的链接

如何使用?

  • 用 Java 编写代码(建议用 Java 编写而不是在 Kotlin 中编写代码) 如果您尝试将其反编译为 smali,您将获得额外的代码 您反编译的应用程序可能不支持 Kotlin->Java,因为 例如,应用程序可能是用 Java 编写的,也可能不包含任何 Kotlin 库)
  • 在您编写了要转换为 smali 的代码后,单击 构建/编译为 Smai
  • 您将被自动重定向到已编译的 Smali 代码(即 Smali 代码将在您的项目中生成在原始代码旁边 Java代码)
  • 从这点开始做你想做的,你可以看看里面 编译后的 Smali 文件并找到所需代码所在的行 根据需要调用或实现整个 Smali 文件。

================================================ ========================== 干杯!