Android上的原生自修改代码

前端之家收集整理的这篇文章主要介绍了Android上的原生自修改代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在 Android上做一些自我修改的本机代码,并在仿真器中运行它.我的示例是基于来自android-ndk的HelloJNI示例.看起来像这样:
  1. #define NOPE_LENGTH 4
  2.  
  3. typedef void (*FUNC) (void);
  4.  
  5. // 00000be4 <nope>:
  6. // be4: 46c0 nop (mov r8,r8)
  7. // be6: 4770 bx lr
  8. void nope(void) {
  9. __asm__ __volatile__ ("nop");
  10. }
  11.  
  12. void execute(void){
  13. void *code = mmap(NULL,NOPE_LENGTH,PROT_WRITE | PROT_EXEC,MAP_PRIVATE | MAP_ANONYMOUS,-1,0);
  14.  
  15. if (code != MAP_Failed) {
  16. memcpy(code,nope,NOPE_LENGTH);
  17.  
  18. ((FUNC)code)();
  19. }
  20. }

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

解决方法

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

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

猜你在找的Android相关文章