其他分享
首页 > 其他分享> > Android中的ART自修改代码

Android中的ART自修改代码

作者:互联网

我正在尝试使用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的更多信息):

文件* 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实现自修改代码?

解决方法:

鉴于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

标签:self-modifying,android-ndk,c-3,android,android-runtime
来源: https://codeday.me/bug/20191028/1950276.html