【问题标题】:modifying .smali files修改 .smali 文件
【发布时间】:2021-02-24 07:44:18
【问题描述】:

我对一些安卓 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

【问题讨论】:

    标签: android apk logcat smali


    【解决方案1】:

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

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

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

    如果您需要添加额外的 2 个寄存器,您可以将其增加到 .registers 7。参数寄存器位于寄存器范围的末尾,因此 p0-p2 现在别名为 v4-v6,而 v2 和 v3 是可以安全使用的新寄存器。

    【讨论】:

    • 这解释了为什么我的努力有时会莫名其妙地导致崩溃。谢谢!
    • 这是一个非常简洁的答案,但我认为在调用静态的末尾有一个小错字,它需要一个 ;在 Ljava/lang/Throwable 之后
    【解决方案2】:

    对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/

      【讨论】:

        【解决方案4】:

        另一个我一直在使用的选项,我为此创建了一个 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 文件。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-13
          • 2020-04-16
          • 1970-01-01
          • 1970-01-01
          • 2015-05-17
          • 1970-01-01
          相关资源
          最近更新 更多