Я пытаюсь реализовать самомодифицирующийся код в своем приложении Android с помощью JNI.Самомодифицирующийся код Android в ART
У меня есть следующий метод в MainActivity классе моего приложения:
public int methodToModify()
{
return 42;
}
И это байткод этого метода:
const/16 v0, 0x2A
return v0
Вот как этот метод представлен в classes.dex файла :
13 00 2A 00 0F 00
Моя цель здесь изменить возвращаемое значение метода methodToModify
во время выполнения из собственного кода. Таким образом, это алгоритм метода JNI, который реализует код самомодифицирующимся:
памяти Чтение процесс (вот больше информации об этом Understanding Linux /proc/id/maps):
FILE *fp; fp = fopen("/proc/self/maps", "r");
Обнаружение адреса начало и конец файла .dex (или .oat файл в случае АРТ):
while (fgets(line, 2048, fp) != NULL) { // search for 'dex' or 'oat' if (strstr(line, ".oat") != NULL || strstr(line, ".dex") != NULL) // get starting and ending addresses of the DEX file region
Найти байты
methodToModify
в файле .dex или .oat.Используйте функцию
mprotect
, чтобы установить разрешение на запись файла.Измените метод возвращаемого значения.
Моя проблема заключается в том, что этот подход отлично работает на моем Nexus 7 с Android 4.2, но он не работает на Nexus 5 с Android 5.1. Я могу реализовать самомодифицирующий код с Dalvik, но я не могу сделать то же самое с ART.
Итак, возможно ли реализовать самомодифицирующийся код с АРТ?
Насколько я понимаю, .oat файл содержит байт-код приложения, но это байт-код не является исполняемым. В то же время файл .oat также содержит встроенные инструкции, преобразованные из байт-кода, которые являются исполняемыми. Я прав? – floyd
@Floyd Это звучит правильно. Собственные инструкции будут в файле ELF. В видеоролике IO есть описание процесса. –
Как вы думаете, можно ли изменить исполняемый код ART во время выполнения? – floyd