如何在运行时为 ELF 共享对象修补 ARM7 二进制代码?详细地说,我想在运行时为我自己的应用程序修补一个特定的例程。
我试着用谷歌搜索来检查如何做到这一点,但我找不到任何东西。我不需要完整的答案,我需要的是:我应该使用哪些功能,其余的我可以自己弄清楚。
平台为ARM7处理器,具体为运行Android操作系统的手机。
先感谢您。
如何在运行时为 ELF 共享对象修补 ARM7 二进制代码?详细地说,我想在运行时为我自己的应用程序修补一个特定的例程。
我试着用谷歌搜索来检查如何做到这一点,但我找不到任何东西。我不需要完整的答案,我需要的是:我应该使用哪些功能,其余的我可以自己弄清楚。
平台为ARM7处理器,具体为运行Android操作系统的手机。
先感谢您。
根据内存是否受到保护,您必须授予自己写入指定区域的权限,mprotect,然后您可以将代码 memcpy 到指定区域。
在运行时修改代码时遇到的更大问题是缓存一致性
ARM 处理器有 2 个您必须担心的缓存,ICache(指令缓存)和 DCache(数据缓存)。当您自行修改代码时,您最终会更改 DCache 中的指令,但不一定在内存中,或者更重要的是 ICache,因此这些缓存变得不同步。您必须采取一些步骤来确保这些缓存“干净”/同步。刷新 DCache 确保在 DCache 中所做的更改被写入内存。
刷新 DCache 会强制 ICache 重新获取指令(也就是修改后的代码)。在 ARM linux 上有一个 syscall 调用cacheflush
来处理这个问题。取决于您如何修改内存/在什么上下文中,存在先有鸡还是先有蛋的问题,因为您新修改的代码不能包含缓存刷新,因为缓存已经不同步,因此还有其他方法可以强制执行缓存刷新,例如强制上下文切换,即睡眠,当您无法以编程方式刷新缓存时。
看看这个项目。它即时修补 Thumb 和 ARM 指令集。