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