我对dalvik字节码的检测导致一些验证错误, 似乎与实际插入的代码片段没有直接关系。 特别是,我遇到以下错误:
2019-06-12 11:47:04.479 14745-14763/? E/ACRA: ACRA caught a VerifyError for fr.kwiatkowski.ApkTrack
java.lang.VerifyError: Verifier rejected class com.orm.util.ReflectionUtil: void com.orm.util.ReflectionUtil.addFieldValueToColumn(android.content.ContentValues, java.lang.reflect.Field, java.lang.Object, java.util.Map) failed to verify: void com.orm.util.ReflectionUtil.addFieldValueToColumn(android.content.ContentValues, java.lang.reflect.Field, java.lang.Object, java.util.Map): [0x63] register v2 has type Undefined but expected Precise Reference: java.lang.String (declaration of 'com.orm.util.ReflectionUtil' appears in /data/app/fr.kwiatkowski.ApkTrack-1/base.apk)
at com.orm.util.ReflectionUtil.getDomainClasses(Unknown Source)
at com.orm.SchemaGenerator.createDatabase(Unknown Source)
at com.orm.SugarDb.onCreate(Unknown Source)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
at com.orm.SugarDb.getDB(Unknown Source)
at com.orm.SugarRecord.getSugarDataBase(Unknown Source)
at com.orm.SugarRecord.find(Unknown Source)
at com.orm.SugarRecord.find(Unknown Source)
at fr.kwiatkowski.apktrack.model.InstalledApp.find_app(Unknown Source)
at fr.kwiatkowski.apktrack.model.InstalledApp.detect_new_version(Unknown Source)
at fr.kwiatkowski.apktrack.MainActivity$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:761)
检测版本包括在每个分支上插入的以下两个指令:
const-string p1, "some unique id"
invoke-static/range {p1 .. p1}, Lcall/my/tracer/;->trace(Ljava/lang/String;)V
其中,p1是指ID最高的寄存器(最后一个寄存器)。 为了使用此寄存器,我插入了一个新的本地寄存器并进行了移位 所有参数寄存器都从左边的一个位置(实际上是两个位置,用于处理宽类型)开始,这样最后一个(或多个)寄存器就可以释放了,例如:
move-object/from16 v6, p0
move-object/from16 v7, p1
move-object/from16 p0, p2
但是,在上述情况下,似乎是问题的寄存器v2从未在任何插入的指令中使用。我只注意到代码 驻留在某些try-catch块中,但由于我从不更改其中的寄存器类型 这个方块,这应该不是问题。以下链接包括 原始的和已检测的APK文件:https://ufile.io/tn6epndj
谢谢!