Smali toString() 不适用于给定的参数对象

Smali toString() not working for given parameter object

我正在尝试将部分未知的对象输出到 logcat(通过 Log.d),目前此方法失败。失败,因为应用程序崩溃而没有将对象打印到 logcat。

方法:

.method public a(Ljava/lang/String;Lcom/a/a/a/k;Lcom/a/a/a/l;)Lcom/a/a/a/j;
.locals 1

 #!
invoke-virtual {p2}, Ljava/lang/Object;->toString()Ljava/lang/String;

move-result-object v0

const-string v1, "#######C0905.m3694#######"

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

const/4 v0, 0x0

invoke-virtual {p0, v0, p1, p2, p3}, Lcom/a/a/a/a;->a(Landroid/content/Context;Ljava/lang/String;Lcom/a/a/a/k;Lcom/a/a/a/l;)Lcom/a/a/a/j;

move-result-object p1

return-object p1
.end method

据我所知,它确实继承自 Object,因此可以应用 toString()。对 Smali 还是很陌生,我想我选择了错误的寄存器?选择 p1 打印没有冗余 toString() 的字符串,使用 toString() 打印失败。

原因:

java.lang.VerifyError: Verifier rejected class com.a.a.a.a: com.a.a.a.j com.a.a.a.a.a(java.lang.String, com.a.a.a.k, com.a.a.a.l) failed to verify: com.a.a.a.j com.a.a.a.a.a(java.lang.String, com.a.a.a.k, com.a.a.a.l): [0xA] 'this' argument 'Precise Reference: java.lang.String' not instance of 'Reference: com.a.a.a.a' (declaration of 'com.a.a.a.a' appears in /data/app/com.digitalsirup.android.android_endzeitspiel-LZqKD836UaaUhNxKzyt2jA==/base.apk)

该方法共有5个寄存器,1个本地寄存器,4个参数寄存器。 v0当然是局部寄存器,v1-v4是参数寄存器,也可以用p0-p3来访问。即 v1p0 相同,v2p1 相同,等等

就在调用 Log.d 之前,您将 v1 设置为一个字符串。但正如我上面提到的,v1 是 p0 的别名,所以您刚刚破坏了 this 引用。因此,当您尝试调用 Lcom/a/a/a/a;->a(...)Lcom/a/a/a/j; 时,验证器发现 p0 包含一个字符串,而不是 Lcom/a/a/a/a;,因此验证失败。