14

我对一些 android apk 进行了逆向工程,以添加一些用于功能测试的工具。我想知道给定一个 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

4 回答 4

34

调用 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 是可以安全使用的新寄存器。

于 2012-09-28T23:37:03.873 回答
13

对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

于 2012-10-26T16:24:11.210 回答
4

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

在此处下载 apktool:http: //ibotpeaches.github.io/Apktool/

于 2013-08-02T12:06:52.183 回答
1

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

简而言之 :

  • 打开你的AndroidStudio/Intellij
  • 转到文件/设置
  • 点击搜索栏并搜索“插件”
  • 登陆插件 UI 后,请确保在“ MarketPlace ”选项卡上
  • 搜索java2smali,安装并重新启动 IDEA

这是java2smali插件的链接

如何使用?

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

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

于 2021-02-23T23:38:29.637 回答