Как использовать dexlib2 для инструментов определенных методов, особенно для выделения регистров для добавления новых инструкций? - PullRequest
0 голосов
/ 29 мая 2018

Я использую dexlib2 для программной обработки некоторых методов в файле dex, например, если я найду такие инструкции:

invoke-virtual {v8, v9, v10}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;

Я бы хотел вставить инструкцию перед ней, ипоэтому во время выполнения я могу знать точные аргументы Class.getMethod ().

Однако теперь я сталкиваюсь с некоторыми вопросами о том, как распределить регистры, которые будут использоваться в моей вставленной инструкции мониторинга?

Я знаю два способа, но в любом случае есть свои проблемы:

  1. Я могу использовать DexRewriter для увеличения registerCount этого метода (например, с .register 6 до .register 9), так чтоЯ могу иметь дополнительные (3) регистры для использования.Но сначала это ограничено 16 регистрами;во-вторых, когда я увеличиваю значение registerCount, параметры будут переданы в последние, и поэтому мне нужно переписать все инструкции в этом методе, которые используют параметры, что утомительно.

  2. Или яможет повторно использовать регистры.Таким образом, я должен проанализировать жизнеспособность каждого из регистров, в то время как у dexlib2, похоже, нет существующего API для создания цепочек CFG и def-use, что означает, что я должен написать его сам.Кроме того, я сомневаюсь, что таким образом смогу ли я получить достаточно доступных регистров.

Так я правильно понимаю эту проблему?Существуют ли какие-либо инструменты / алгоритмы для этого?Или любой совет, что я могу сделать это лучше?

Спасибо.

1 Ответ

0 голосов
/ 29 мая 2018

Несколько баллов:

  • Вы не ограничены 16 регистрами в методе.Большинство инструкций могут касаться только первых 16 регистров, но есть инструкции mov, которые можно использовать для замены значений с более высокими регистрами

  • Если вы можете обойтись с , а не Распределение любых новых регистров сделает вашу жизнь намного проще.Один из подходов заключается в создании нового статического метода с помощью вашей инструментальной логики, а затем добавлении вызова этого статического метода с соответствующими значениями из целевого метода.

  • Один подход, который я виделиспользуется для увеличения числа регистров, а затем в начале метода добавляется серия инструкций перемещения, чтобы переместить все регистры параметров обратно в те же регистры, в которых они находились до увеличения числа регистров.Это позволяет вам не переписывать все существующие инструкции и гарантирует, что новые регистры в конце диапазона не используются.Основное раздражение при таком подходе состоит в том, что когда новые регистры v16 или выше, вам придется сделать некоторые перестановки до и после точки, в которой они используются, чтобы вернуть значение обратно в младший регистр, а затем восстановить всевпоследствии был в этом регистре.

...