ART中的Android自修改代码

时间:2015-06-28 16:44:40

标签: android c android-ndk self-modifying android-runtime

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

我的应用程序的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文件的开头和结尾的地址(或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. 修改返回值方法。

  6. 我的问题是这种方法完全适用于我的Android 4.2的Nexus 7,但它不适用于Android 5.1的Nexus 5。我能够用Dalvik实现自修改代码,但我不能用ART做同样的事情。

    那么,是否可以用ART实现自修改代码?

1 个答案:

答案 0 :(得分:4)

鉴于ART正在使用Ahead of Time Compilation,https://source.android.com/devices/tech/dalvik/

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

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

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