Android ART 中的自修改代码

Android self-modifying code in ART

我正在尝试使用 JNI 在我的 Android 应用程序中实现自修改代码。

我在我的应用程序的 MainActivity class 中有以下方法:

public int methodToModify()
{       
    return 42;
}

这是这个方法的字节码:

const/16 v0, 0x2A
return v0

这就是此方法在 classes.dex 文件中的表示方式:

13 00 2A 00 0F 00

我的目标是在运行时从本机代码更改方法 methodToModify 的 return 值。所以,这是实现自修改代码的JNI方法的算法:

  1. 读取进程内存(这里有关于这个的更多信息Understanding Linux /proc/id/maps):

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

  2. 检测.dex文件(或ART情况下的.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. 在 .dex 或 .oat 文件中查找 methodToModify 的字节。

  4. 使用mprotect函数设置写入文件的权限。

  5. 修改return取值方式

我的问题是,这种方法在我的 Android 4.2 的 Nexus 7 上完美运行,但它不适用于 Android 5.1 的 Nexus 5。我可以用 Dalvik 实现自修改代码,但我不能用 ART 做同样的事情。

那么,有没有可能用ART实现自修改代码呢?

鉴于 ART 使用的是提前编译,https://source.android.com/devices/tech/dalvik/

我不确定你希望它如何工作,因为在运行时它已经在 CPU 架构代码中,而不是 DEX 字节码。

此处有更多详细信息:https://source.android.com/devices/tech/dalvik/configure.html

Google 关于 ART 运行时的 IO 2014 视频: https://youtu.be/EBlTzQsUoOw