Я использую dexlib2 для программной обработки некоторых методов в файле dex, например, если я найду такие инструкции:
invoke-virtual {v8, v9, v10}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
Я бы хотел вставить инструкцию перед ней, ипоэтому во время выполнения я могу знать точные аргументы Class.getMethod ().
Однако теперь я сталкиваюсь с некоторыми вопросами о том, как распределить регистры, которые будут использоваться в моей вставленной инструкции мониторинга?
Я знаю два способа, но в любом случае есть свои проблемы:
Я могу использовать DexRewriter для увеличения registerCount этого метода (например, с .register 6 до .register 9), так чтоЯ могу иметь дополнительные (3) регистры для использования.Но сначала это ограничено 16 регистрами;во-вторых, когда я увеличиваю значение registerCount, параметры будут переданы в последние, и поэтому мне нужно переписать все инструкции в этом методе, которые используют параметры, что утомительно.
Или яможет повторно использовать регистры.Таким образом, я должен проанализировать жизнеспособность каждого из регистров, в то время как у dexlib2, похоже, нет существующего API для создания цепочек CFG и def-use, что означает, что я должен написать его сам.Кроме того, я сомневаюсь, что таким образом смогу ли я получить достаточно доступных регистров.
Так я правильно понимаю эту проблему?Существуют ли какие-либо инструменты / алгоритмы для этого?Или любой совет, что я могу сделать это лучше?
Спасибо.