Dalvik Verifier: register1 v25 тип 0, разыскивается ссылка

У меня есть следующий код Smali:

.method private k(I)V
.registers 27 (original) 29 (after)

...
#@68a
invoke-direct/range {v24 .. v25}, Landroid/widget/LinearLayout;-><init>(Landroid/content/Context;)V
...

Это отклонено верификатором Dalvik. 0x76 — это вызов-прямой/диапазон.

dalvikvm: VFY: register1 v25 type 0, wanted ref
dalvikvm: VFY: bad arg 1 (into Landroid/content/Context;)
dalvikvm: VFY:  rejecting call to Landroid/widget/LinearLayout;.<init> (Landroid/content/Context;)V
dalvikvm: VFY:  rejecting opcode 0x76 at 0x068a
dalvikvm: VFY:  rejected Lcom/pocketwood/myav/MyAV;.k (I)V
dalvikvm: Verifier rejected class Lcom/pocketwood/myav/MyAV;
dalvikvm: Class init failed in newInstance call (Lcom/pocketwood/myav/MyAV;)

Интересно, что v25 не используется ни в одной инструкции выше 68a! Исходный APK работает нормально, но перепакованный с помощью smali верификатор отклоняет класс MyAV.


person joe-jeff    schedule 02.03.2019    source источник


Ответы (2)


Я подозреваю, что у вас неправильное расположение кода. Если вы посмотрите на сообщение об ошибке, в нем упоминается код операции 0x76, то есть invoke-direct/range. В предоставленном вами фрагменте кода нет инструкции invoke-direct/range, поэтому, если не происходит что-то действительно странное, это не может быть кодом, вызывающим проблему.

Кроме того, обратите внимание на название метода в сообщении об ошибке: Lcom/pocketwood/myav/MyAV;.k (I)V. Есть что-то похожее на пробел после k. Сам по себе символ пробела не является допустимым символом в имени метода, но, может быть, это какой-то другой символ Юникода, похожий на пробел?

Не берите в голову. Похоже, что это пространство встроено в сообщение об ошибке.


Наконец, смещение, упомянутое в сообщении об ошибке (at 0x068a), должно быть смещением кода инструкции в содержащем методе. Вы можете использовать опцию --offsets baksmali при дизассемблировании файла dex, и baksmali добавит комментарий со смещением кода перед каждой инструкцией. Хотя я не уверен навскидку, указано ли смещение в байтах или кодовых единицах, которые составляют 16 бит, поэтому оно может отличаться в 2 раза.

person JesusFreke    schedule 02.03.2019
comment
Вы правы, смещение было неправильным. --Offsets - отличная помощь! Я обновил свой исходный вопрос. - person joe-jeff; 03.03.2019

Решение: v26 — это p1, а v25 — это p0. Из-за модификации количество регистров было увеличено до 29, и из-за этого v25 больше не является p0.

person joe-jeff    schedule 02.03.2019
comment
Похоже, вы используете --parameter-registers=false. Если бы вы оставили его включенным, регистр был бы дизассемблирован как p0, и изменение количества регистров в методе не повлияло бы на это. - person JesusFreke; 03.03.2019