我正在尝试将一个部分未知的对象输出到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)
答案 0 :(得分:1)
此方法总共有5个寄存器,1个本地寄存器和4个参数寄存器。 v0
当然是本地寄存器,v1
-v4
是参数寄存器,也可以作为p0
-p3
访问。即v1
与p0
相同,v2
与p1
相同,等等。
在调用Log.d之前,将v1设置为字符串。但是如上所述,v1是p0的别名,因此您刚刚破坏了this
引用。因此,当您尝试调用Lcom/a/a/a/a;->a(...)Lcom/a/a/a/j;
时,验证程序会发现p0包含字符串而不是Lcom/a/a/a/a;
,并且验证失败。