在运行时修补 ARM7 代码

逆向工程 安卓 手臂
2021-06-20 07:10:09

如何在运行时为 ELF 共享对象修补 ARM7 二进制代码?详细地说,我想在运行时为我自己的应用程序修补一个特定的例程。

我试着用谷歌搜索来检查如何做到这一点,但我找不到任何东西。我不需要完整的答案,我需要的是:我应该使用哪些功能,其余的我可以自己弄清楚。

平台为ARM7处理器,具体为运行Android操作系统的手机。

先感谢您。

3个回答

根据内存是否受到保护,您必须授予自己写入指定区域的权限,mprotect,然后您可以将代码 memcpy 到指定区域。

在运行时修改代码时遇到的更大问题是缓存一致性

ARM 处理器有 2 个您必须担心的缓存,ICache(指令缓存)和 DCache(数据缓存)。当您自行修改代码时,您最终会更改 DCache 中的指令,但不一定在内存中,或者更重要的是 ICache,因此这些缓存变得不同步。您必须采取一些步骤来确保这些缓存“干净”/同步。刷新 DCache 确保在 DCache 中所做的更改被写入内存。

刷新 DCache 会强制 ICache 重新获取指令(也就是修改后的代码)。在 ARM linux 上有一个 syscall 调用cacheflush来处理这个问题。取决于您如何修改内存/在什么上下文中,存在先有鸡还是先有蛋的问题,因为您新修改的代码不能包含缓存刷新,因为缓存已经不同步,因此还有其他方法可以强制执行缓存刷新,例如强制上下文切换,即睡眠,当您无法以编程方式刷新缓存时。

事实上,您需要mprotect(以获得写入代码区域的特权)和 memcpy 或任何其他东西来写入内存。

请注意,ARM 是建立在哈佛架构上的,在编写代码后,您可能需要对代码缓存做一些事情。

看看这个项目。它即时修补 Thumb 和 ARM 指令集。