Ива*_*ван 10 linux android arm self-modifying android-ndk
我试图在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)();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是这段代码崩溃了.怎么了?
Igo*_*sky 11
猜测,nope()编译为Thumb,但你将其称为ARM(假设mmap返回一个字对齐的指针).要调用Thumb代码,应设置地址的低位.尝试这样的事情:
( (FUNC)(((unsigned int)code)|1) )();
Run Code Online (Sandbox Code Playgroud)
要正确执行此操作,您应确保已分配的内存对齐(Thumb为2,ARM为4),请确保您尝试运行的代码是Thumb(或ARM)并相应地设置位0.
| 归档时间: |
|
| 查看次数: |
1940 次 |
| 最近记录: |