10

我正在尝试在 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)();
    }
}

问题是这段代码正在崩溃。怎么了?

4

1 回答 1

11

猜测一下,nope()它被编译为 Thumb,但您将其称为 ARM(假设 mmap 返回一个字对齐的指针)。要调用 Thumb 代码,应设置地址的低位。尝试这样的事情:

( (FUNC)(((unsigned int)code)|1) )();

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

于 2010-12-16T14:44:19.767 回答