У меня есть следующий код Smali:
.method private a(Landroid/content/Context;Landroid/os/Bundle;Ljava/lang/String;Ljava/lang/String;I)V
.registers 33
move/16 v22, p5
move-object/16 v21, p4
move-object/16 v20, p3
move-object/16 v19, p2
move-object/16 v18, p1
move-object/16 v17, p0
check-cast v21, Ljava/lang/String;
check-cast v20, Ljava/lang/String;
check-cast v19, Landroid/os/Bundle;
check-cast v18, Landroid/content/Context;
check-cast v17, Lcom/clevertap/android/sdk/aa;
move-object/from16 v1, v18
move-object/from16 v2, v19
move-object/from16 v3, v20
move/from16 v4, v22
.line 476
...
invoke-static {v4}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
Это отклонено верификатором Dalvik по следующей причине:
VFY: register1 v4 type 2, wanted 17
VFY: rejecting opcode 0x71 at 0x05f0
VFY: rejected Lcom/clevertap/android/sdk/aa;.a (Landroid/content/Context;Landroid/os/Bundle;Ljava/lang/String;Ljava/lang/String;I)V
Verifier rejected class Lcom/clevertap/android/sdk/aa;
Тип 17 — целое число, а тип 2 означает неизвестный тип. Почему верификатор теряет тип?
Учитывая, что смещение равно 0x05f0
, эта инструкция invoke-static
находится очень далеко в методе. Между вершиной метода и там почти наверняка есть код, который также использует регистр v4.
Я рекомендую использовать функциональность baksmali --register-info
, которая добавляет комментарий до/после каждой инструкции с подробностями о типах регистров. Вы должны быть в состоянии проследить код в обратном направлении и выяснить, откуда берется тип v4.
Смотрите baksmali help classpath
. Хотя в этом случае я не думаю, что вас интересует точный тип класса регистратора, только общий тип (неизвестный, целочисленный, ссылка и т. д.), поэтому я думаю, что может быть достаточно пустого пути к классам (--bootclasspath ""
). .
Баксмали не работает с параметром --register-info: Произошла ошибка при загрузке файлов путей к классам. Прерывание. org.jf.dexlib2.analysis.ClassPathResolver$ResolveException: org.jf.dexlib2.analysis.ClassPathResolver$NotFoundException: не удалось найти запись classpath /system/framework/core-libart.jar в org.jf.dexlib2.analysis.ClassPathResolver .<init>(ClassPathResolver.ja va:138)