
#define nopE_LENGTH 4typedef voID (*FUNC) (voID);// 00000be4 <nope>:// be4: 46c0 nop (mov r8,r8)// be6: 4770 bx lrvoID 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上的原生自修改代码全部内容,希望文章能够帮你解决Android上的原生自修改代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)