Android上的原生自修改代码

前端之家收集整理的这篇文章主要介绍了Android上的原生自修改代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在 Android上做一些自我修改的本机代码,并在仿真器中运行它.我的示例是基于来自android-ndk的HelloJNI示例.看起来像这样:
#define NOPE_LENGTH 4

typedef void (*FUNC) (void);

// 00000be4 <nope>:
//     be4: 46c0        nop         (mov r8,r8)
//     be6: 4770        bx  lr
void nope(void) {
    __asm__ __volatile__ ("nop");
}

void execute(void){
    void *code = mmap(NULL,NOPE_LENGTH,PROT_WRITE | PROT_EXEC,MAP_PRIVATE | MAP_ANONYMOUS,-1,0);

    if (code != MAP_Failed) {
        memcpy(code,nope,NOPE_LENGTH);

        ((FUNC)code)();
    }
}

问题是这个代码崩溃了.哪里不对?

解决方法

在猜测中,nope()被编译为Thumb,但您将其称为ARM(假设mmap返回一个字对齐的指针).要调用Thumb代码,应该设置地址的低位.尝试这样的东西:
( (FUNC)(((unsigned int)code)|1) )();

要正确执行,您应确保已分配的内存对齐(Thumb为2,ARM为4),确保您尝试运行的代码是Thumb(或ARM),并相应地设置位0.

原文链接:/android/312848.html

猜你在找的Android相关文章