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

时间:2018-07-19 15:18:59

标签: android smali

我正在尝试将一个部分未知的对象输出到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)

1 个答案:

答案 0 :(得分:1)

此方法总共有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;,并且验证失败。