VFY: регистр 1 v4 тип 2, разыскивается 17

У меня есть следующий код 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 означает неизвестный тип. Почему верификатор теряет тип?

0
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Учитывая, что смещение равно 0x05f0, эта инструкция invoke-static находится очень далеко в методе. Между вершиной метода и там почти наверняка есть код, который также использует регистр v4.

Я рекомендую использовать функциональность baksmali --register-info, которая добавляет комментарий до/после каждой инструкции с подробностями о типах регистров. Вы должны быть в состоянии проследить код в обратном направлении и выяснить, откуда берется тип v4.

Баксмали не работает с параметром --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>(ClassPathRe‌​solver.ja va:138)

joe-jeff 02.03.2019 22:28

Смотрите baksmali help classpath. Хотя в этом случае я не думаю, что вас интересует точный тип класса регистратора, только общий тип (неизвестный, целочисленный, ссылка и т. д.), поэтому я думаю, что может быть достаточно пустого пути к классам (--bootclasspath ""). .

JesusFreke 02.03.2019 22:56

Другие вопросы по теме