Android上的原生自修改代码

Android上的原生自修改代码,第1张

概述我试图在 Android上做一些自我修改的本机代码,并在仿真器中运行它.我的示例是基于来自android-ndk的HelloJNI示例.看起来像这样: #define NOPE_LENGTH 4typedef void (*FUNC) (void);// 00000be4 <nope>:// be4: 46c0 nop (mov r8, r8)// 我试图在 Android上做一些自我修改的本机代码,并在仿真器中运行它.我的示例是基于来自androID-ndk的HelloJNI示例.看起来像这样:
#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上的原生自修改代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1133410.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存