【问题标题】:ARM assembly Jump to addressARM 汇编 跳转到地址
【发布时间】:2014-06-10 02:01:05
【问题描述】:

我有一个纯C的需求,在读完页面后,我想用跳转指令和另一个函数地址替换函数地址,这样我就可以用另一个函数代替当前函数运行时,它实现了 MOCK。

它在 X86 上运行良好,但在 ARM 上,我遇到了一些问题,不知道如何解决。你可以帮帮我吗?

什么是ARM的跳转指令,如何使用memcpy将其替换为当前函数地址?

我认为关键要素可能是 16hex ARM 跳转指令

【问题讨论】:

  • “我遇到了一些问题” - 说出这些问题究竟是什么什么会有所帮助。
  • 另外,有许多 ARM 指令会导致分支,但在“纯 C”中您无法访问它们,因为 C 运行时环境的抽象是您的最低级别。这听起来确实像是您在有效地尝试重新实现函数指针,但是以一种依赖于实现细节或未定义行为的令人讨厌的方式。
  • 您需要提供有关“C”环境的更多详细信息。以最纯粹的形式,auselen 的回答适用。但是,如果它是具有共享库的 Linux 或其他一些操作系统,则可能适用其他解决方案。另外,您是否允许修改源代码或者您想对二进制文件执行此操作?您是否有权访问 libelf 等
  • 我使用 mprotect 使页面读/写,所以我可以改变内存,我的 ARM env 是 android 模拟器,但是在我 memcpy 之后,它就崩溃了。附言使用了 B 指令和函数地址。
  • @Samblg 你需要提高你的接受率。

标签: c assembly arm


【解决方案1】:

来自 arm 社区页面上标题为 Caches and Self-Modifying Code 的博文:

缓存 ARM 架构具有单独的数据缓存和 指令访问;这些被称为 D-cache 和 I-cache, 分别。 ... 有两个 CPU 接口, 内核可以同时加载一条指令和一些数据。

... 因为 D-cache 和 I-cache 不一致, 新编写的指令可能会被现有的内容所掩盖 I-cache,导致处理器执行旧的(或可能 无效)指令。

我相信本文的其余部分会帮助您深入挖掘,但我想知道您为什么不使用函数指针?它们会更容易构建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    相关资源
    最近更新 更多