在 Smali 中添加我自己的日志功能

逆向工程 安卓
2021-06-17 11:15:10

我正在尝试用我自己的函数记录 smali 中函数的参数。我创建了一个新的 Android Studio 项目并编写了函数,然后使用 APKtool 来检索 Smali 文件。

这是我的功能:

.method public userFunction(II)V
    .locals 2
    .param p1, "a"    # I
    .param p2, "b"    # I

    .line 28
    invoke-static {p1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;

    move-result-object v0

    const-string v1, "Message"

    invoke-static {v1, v0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    return-void
.end method

如您所见,它需要两个整数,然后记录一个(暂时忘记另一个整数未使用)。

这是我用来用Java编写上述功能的Android studio代码。

    public void sendMessage(View view)
    {
        userFunction(3,2);
    }

    public void userFunction(int a, int b)
    {
        Log.d("Message", Integer.toString(a));
    }

现在我想不通的是如何在 Smali 中调用这个函数。我的问题可能是我正在按钮中测试它。sendMessage 是一种用于测试目的的 Onclick 方法,它所做的只是执行用户功能。

我在这背后的推理是 Smali 中的方法调用最终是

invoke-virtual {p0, v0, v1}, Lcom/example/froggyfresh/MainActivity;->userFunction(II)V

从我读到的,我相信 p0 是调用函数的对象。所以我不确定如何从我试图调试的项目中的另一个方法中调用该函数。

是否有解决方法,以创建一些通用函数来记录值?

在我尝试调试的 APK 中使用 p0 时遇到的问题是 APKtool 给了我这个错误:

C:\Users\Dell\Desktop>apktool b base
I: Using Apktool 2.4.1
I: 检查源是否已经改变...
I: Smaling smali 文件夹到 classes.dex...
base\smali\funproject.smali[5059 ,1] 无效寄存器:v29。必须介于 v0 和 v15 之间,包括端点。
无法 smali 文件:funproject.smali

我知道 p0 是一个参数寄存器,并且参数存储在最终的 v(insertnumberhere) 寄存器中。所以我可以理解错误,但不确定如何解决问题。

1个回答

只需让您的辅助方法成为静态方法,然后使用 invoke-static 调用它

invoke-static {v0, v1}, Lcom/example/froggyfresh/MainActivity;->userFunction(II)V

关于寄存器超出范围的事情,您需要使用移动指令对寄存器值进行一些改组,以将所需的值放入较低的 16 个寄存器中。

例如,假设您有一个未使用的寄存器 v23。您可以将值从较低的寄存器之一移动到 v23,然后将 p0 的值移动到该较低的寄存器中。

move-object v2, v23
move-object p0, v2

然后在通话后,您需要将 v2 的原始值重新洗牌

move-object v23, v2