2015-06-28 4 views
3

Я пытаюсь реализовать самомодифицирующийся код в своем приложении 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, который реализует код самомодифицирующимся:

  1. памяти Чтение процесс (вот больше информации об этом Understanding Linux /proc/id/maps):

    FILE *fp; fp = fopen("/proc/self/maps", "r");

  2. Обнаружение адреса начало и конец файла .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

  3. Найти байты methodToModify в файле .dex или .oat.

  4. Используйте функцию mprotect, чтобы установить разрешение на запись файла.

  5. Измените метод возвращаемого значения.

Моя проблема заключается в том, что этот подход отлично работает на моем Nexus 7 с Android 4.2, но он не работает на Nexus 5 с Android 5.1. Я могу реализовать самомодифицирующий код с Dalvik, но я не могу сделать то же самое с ART.

Итак, возможно ли реализовать самомодифицирующийся код с АРТ?

ответ

3

Учитывая, что ART использует загодя Компиляция, https://source.android.com/devices/tech/dalvik/

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

более подробно здесь: https://source.android.com/devices/tech/dalvik/configure.html

Google IO 2014 видео на ART время выполнения: https://youtu.be/EBlTzQsUoOw

+0

Насколько я понимаю, .oat файл содержит байт-код приложения, но это байт-код не является исполняемым. В то же время файл .oat также содержит встроенные инструкции, преобразованные из байт-кода, которые являются исполняемыми. Я прав? – floyd

+0

@Floyd Это звучит правильно. Собственные инструкции будут в файле ELF. В видеоролике IO есть описание процесса. –

+0

Как вы думаете, можно ли изменить исполняемый код ART во время выполнения? – floyd

Смежные вопросы