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方法的算法:
读取进程内存(这里有关于这个的更多信息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
函数设置写入文件的权限。
修改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
我正在尝试使用 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方法的算法:
读取进程内存(这里有关于这个的更多信息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
函数设置写入文件的权限。修改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