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) )(); 

要做到这一点,你应该确保分配的内存对齐(2对于Thumb和4对于ARM),确保你试图运行的代码是Thumb(或ARM),并相应地设置位0。