3

我正在尝试使用 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. 读取进程内存(这里有更多关于了解 Linux /proc/id/maps的信息):

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

  2. 检测 .dex 文件(或 .oat 文件在 ART 的情况下)的开始和结束地址:

    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 做同样的事情。

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

4

1 回答 1

4

鉴于 ART 正在使用提前编译,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

于 2015-06-28T17:16:27.457 回答