Автоматическое преобразование кода dex Android

Я хочу преобразовать / instrument DeX файлы. Цели преобразования включают измерение охвата кода. Обратите внимание, что исходные файлы недоступны. Таким образом, инструментирование Dex-единственный вариант.

Мне интересно, есть ли какая-либо существующая база кода, которую я мог бы посмотреть в качестве примеров для написания инструмента для достижения моей цели.

Я знаю о проекте Smali и множестве других проектов, которые строятся на Smali. Однако ни один из этих проектов не является хорошим примером для моего цель.

Я ищу код, который автоматически преобразует код smali или представление dexlib, из которого генерируется smali. Более поздний вариант предпочтителен для моей цели, потому что накладных расходов на создание smali можно избежать.

5 ответов


в некоторых случаях smali сам выполняет небольшое количество перезаписи инструкций при повторной сборке файла dex. Такие вещи, как замена const-string на const-string/jumbo или инструкция goto на "большую", если цель находится вне диапазона. Это включает в себя замену инструкций в списке инструкций потенциально большими и соответствующее исправление смещений.

CodeItem.fixInstructions метод отвечает за этот.


кроме того, есть библиотека asmdex. Я не очень хорошо знаком с этим, но похоже, что это может иметь отношение к тому, что вы хотите сделать.


Это много кода, но dx DexMerger является примером программы, которая преобразует файлы dex. Это довольно сложно из-за того, что ему нужно угадать размер вывода, чтобы заставить прямые ссылки работать.

вам также необходимо создать инфраструктуру для перезаписи инструкций dalvik. DexMerger это InstructionTransformer делает неглубокую перезапись: он регулирует смещения от одного сопоставления к другому. Для измерения покрытия кода ваша инструкция переписывание, вероятно, должно быть гораздо более сложным.


другой вариант, который стал доступен в последнее время является Dexpler. Это расширение Soot, которое является основой для анализа и инструментирования Java-программ. Дексплер читает .apk файлы и преобразует в промежуточный формат Jimple. Затем код Jimple может быть произвольно инструментирован и в конечном итоге сброшен в новый apk.


(для записи, я отвечаю на свой собственный вопрос здесь)

В конце концов я не нашел никакого инструмента, который соответствовал бы моим требованиям. Так что я закончил тем, что создал свой собственный инструмент, называемый Элла, на основе DexLib. Из коробки он делает несколько вещей, таких как измерение покрытия кода, отслеживание метода записи и т. д. Но он может быть легко расширен для выполнения других типов преобразований.


Я знаю, что немного поздно, но на всякий случай, если вы все еще заинтересованы или, возможно, для некоторых других читателей. ASMDEX уже упоминалось. И я думаю, что это ваш лучший выбор на данный момент для того, чего вы пытаетесь достичь.

Что касается добавления новых регистров, взгляните на org.ow2.asmdex.утиль.RegisterShiftMethodAdapter класс. Это не идеально! На самом деле, как это ужасно, изменение существующих инструкций 4bit при добавлении регистра будет означать, что какой-то регистр закончится до 0xF и не будет вписываться в 4 бита.

но это должно быть хорошее начало.