我正在尝试使用JNI在Android应用程序中实现自我修改的代码.
我的应用程序的MainActivity类具有以下方法:
public int methodToModify()
{
return 42;
}
这是此方法的字节码:
const/16 v0, 0x2A
return v0
这就是在classes.dex文件中表示此方法的方式:
13 00 2A 00 0F 00
我的目标是在运行时中从本地代码更改methodToModify方法的返回值.因此,这是实现自修改代码的JNI方法的算法:
文件* fp;
fp = fopen(“ / proc / self / maps”,“ r”);
>检测.dex文件(或在ART中为.oat文件)的开头和结尾的地址:
while(fgets(line,2048,fp)!= NULL){
//搜索“ dex”或“燕麦”
如果(strstr(line,“ .oat”)!= NULL || strstr(line,“ .dex”)!= NULL)
//获取DEX文件区域的开始和结束地址
>在.dex或.oat文件中查找methodToModify的字节.
>使用mprotect功能来设置写入文件的权限.
>修改返回值方法.
我的问题是,这种方法完全可以在装有Android 4.2的Nexus 7上正常工作,但不能在装有Android 5.1的Nexus 5上工作.我可以使用Dalvik实施自我修改的代码,但使用ART无法做到这一点.
那么,是否可以使用ART实现自修改代码?
解决方法:
我不确定您希望它如何工作,因为在运行时它已经在CPU体系结构代码中,而不是DEX字节码中.
标签:self-modifying,android-ndk,c-3,android,android-runtime
来源: https://codeday.me/bug/20191028/1950276.html