Android 上原生的自修改代码

2024-03-28

我正在尝试在 Android 上制作一些自修改本机代码并在模拟器中运行它。我的示例基于 android-ndk 中的 Hello JNI 示例。它看起来像这样:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 上原生的自修改代码 的相关文章

随机推荐

  • 无法使用 Require.js 调用函数

    我尝试使用 require js 为我的 node js 服务器编写一个模块 它只返回我想从 url 获取的对象 但不知何故 我无法返回用我的方法获得的值 http get 在我返回值后执行 所以我只是得到 未定义 但为什么呢 请你帮助我好
  • 如何检测 2 的补码乘法溢出?

    在我正在阅读的一本书中 以下函数用于确定 2 的补码整数乘法溢出 int tmult ok int x int y int p x y return x p x y 虽然这有效 但我如何证明它在所有情况下的正确性 当发生溢出时如何确保 p
  • 在 Windows Server 上运行的 Java 应用程序可以通过 Windows 身份验证连接到 SQL Server

    在提出问题之前 让我先介绍一些背景知识 我在一家主要运行 Windows 的商店 我们有几个批处理应用程序在 Windows 服务器上运行 主要是 2003 年 大多数批处理应用程序都是用 C 和 C 编写的 然而 我们有一些用 Java
  • 如何通过命令行检查 Visual Studio 更新?

    为了简化我的虚拟环境设置 我正在使用巧克力味 http chocolatey org自动化我的虚拟机 因为我可以运行cinst安装 Visual Studio 的命令 c gt cinst VisualStudio2012Professio
  • tangelgram 的彩色线 - 包 ape 函数 cophyloplot

    我正在尝试对包含相同分类单元的两棵树进行系统发育比较 我想根据隔离站点为连接着色 我原以为我已经成功执行了此操作 但我的工作流程中存在错误 即彩色线与隔离站点不准确对应 我想知道您是否有任何见解 请在下面找到我的可复制示例 site lt
  • firebase导入服务抛出错误

    我正在使用 firebase 函数 我想使用服务帐户密钥 json 来初始化App 并将其放入凭证中 但出现错误 类型参数 type string project id 字符串 private key id 字符串 私钥 字符串 clien
  • 从字节数组中读取 C# 中的 C/C++ 数据结构

    从数据来自 C C 结构的 byte 数组填充 C 结构的最佳方法是什么 C 结构看起来像这样 我的 C 很生锈 typedef OldStuff CHAR Name 8 UInt32 User CHAR Location 8 UInt32
  • 随着利润增加,如何在止损和当前价格之间保持 10 点的利润差距

    我试图在解决方案中添加另一个条件 当交易盈利 10 点时 我希望止损移动 10 点 更具体地说 假设我设置了一个挂单买单 止损是低于开盘价 10 点 止盈是 50 点 如果交易盈利 10 点 则止损将向上移动 10 点 如果交易盈利 20
  • 有没有更好的写法 ||在单个 if 语句中[重复]

    这个问题在这里已经有答案了 想知道是否有更好的方法来编写下面的代码 我希望我的 if 语句忽略所有键码 但这样写似乎很混乱 如下所示 thanks if event keyCode 9 event keyCode 91 event keyC
  • 为什么 ((object)(int)1).Equals(((object)(ushort)1)) 产生 false?

    我有这样的情况object我想检查与另一个是否相等object public static bool Equals object a object b return a Equals b 当出现问题时a 1 integer and b 1
  • 为什么 Java 中的每个对象都隐式扩展 java.lang.Object 类?

    我已经用 Java 编程有一段时间了 但是当我试图解释什么是 Java 时 java lang Object是给朋友上课的 我除了简单的一句台词之外想不出更多的话 Java中的所有对象都扩展java lang Object隐含地 我不太确定
  • 以编程方式创建具有特定样式的 ImageView

    我想以编程方式执行此操作
  • IOS 5:UIScrollView 不将触摸传递给 nextResponder

    我有一个子类UIScrollView 并覆盖其所有 4 Touches 功能 在那些 Touches 函数中 self nextResponder Touches and super Touches 用于传递触摸事件 我还有一个视图控制器
  • Apache POI 设置 Excel 图表标题

    我正在从头开始创建 Excel 工作簿 其中一张工作表包含一个图表 我想设置图表标题 Apache POI 在 HSSFChart 上有一个 setChartTitle 方法 但 XSSFChart 和与格式无关的 Chart 都没有设置图
  • 如何验证 WebClient 请求?

    我正在使用网络客户端调用我网站上的页面 我正在尝试将网页的结果放入 pdf 中 因此我正在尝试获取呈现页面的字符串表示形式 问题是请求没有经过身份验证 所以我得到的只是一个登录屏幕 我已将 UseDefaultCredentials 属性设
  • 如何向 django 项目添加环境变量

    我正在尝试设置我的项目 以便它可以在本地使用环境变量 我尝试将其添加到我的激活文件和其他内容列表的末尾 我正在尝试使用这个 from base import if os environ DJANGO SERVER TYPE local tr
  • 在事务内部或外部打开和关闭游标以及事务失败时如何关闭游标

    我正在 SQL Server 2012 中编写一个存储过程 它使用游标进行读取 并在TRY CATCH堵塞 基本上 我的问题如下 我应该在里面声明我的光标吗TRY CATCH堵塞 如果是 我应该在之前还是之后声明光标BEGIN TRANSA
  • 将 Font Awesome 图标做成一个圆圈?

    我在某些项目中使用 font Awesome 但我想用 font Awesome 图标做一些事情 我可以轻松地调用这样的图标 i class fa fa lock i 是否有可能所有图标始终处于带边框的圆圈中 类似这样的 我有一张图片 Us
  • 使用一组迭代步骤迭代基于列表的列表

    我想根据存储在另一个列表中的可变数量的迭代和存储为整数的恒定数量的跳过来迭代给定的列表 假设我有三件事 l 我需要迭代 或过滤 的列表 w 一个列表 告诉我在休息之前要迭代多少项 k 一个整数 告诉我在每组迭代之间要跳过多少个元素 换句话说
  • Android 上原生的自修改代码

    我正在尝试在 Android 上制作一些自修改本机代码并在模拟器中运行它 我的示例基于 android ndk 中的 Hello JNI 示例 它看起来像这样 define NOPE LENGTH 4 typedef void FUNC v