我正在尝试用我自己的函数记录 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) 寄存器中。所以我可以理解错误,但不确定如何解决问题。