我正在尝试使用 JNI 在我的 Android 应用程序中实现自修改代码。
我的应用程序的 MainActivity 类中有以下方法:
public int methodToModify()
{
return 42;
}
这是此方法的字节码:
const/16 v0, 0x2A
return v0
这就是该方法在 classes.dex 文件中的表示方式:
13 00 2A 00 0F 00
methodToModify
我的目标是从本机代码更改运行时方法的返回值。所以,这是实现自修改代码的 JNI 方法的算法:
读取进程内存(这里有更多关于了解 Linux /proc/id/maps的信息):
FILE *fp; fp = fopen("/proc/self/maps", "r");
检测 .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
methodToModify
在 .dex 或 .oat 文件中查找字节。使用
mprotect
函数设置写入文件的权限。修改返回值方法。
我的问题是,这种方法在我的 Nexus 7 和 Android 4.2 上完美运行,但在 Nexus 5 和 Android 5.1 上不起作用。我可以用 Dalvik 实现自我修改代码,但我不能用 ART 做同样的事情。
那么,是否可以用 ART 实现自修改代码呢?