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

我尝试使用Google搜索来检查操作方法,但找不到任何东西。我不需要完整的答案,我需要的是:应该使用哪些功能,我可以自己解决其余功能。

平台是ARM7处理器,特别是运行手机Android操作系统。

预先感谢您。

评论

您可能是说“ ARMv7”,而不是ARM7(是的,有区别)。 ARM7 CPU无法运行Android。

ARM7是非常老的微体系结构,而ARMv7是新的指令集(在ARMv8之前)

#1 楼

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

运行较大的问题在运行时修改代码时要考虑的是缓存一致性。ARM处理器有2个您需要担心的缓存,即ICache(指令缓存)和DCache(数据缓存)。当您自行修改代码时,最终将在DCache中更改指令,但不一定在内存中或更重要的是在ICache中更改指令,因此这些缓存不同步。您必须采取一些步骤来确保这些缓存是“干净的” /同步的。刷新DCache可以确保将DCache中所做的更改写入内存。

刷新DCache会强制ICache重新获取指令(也就是您修改后的代码)。在ARM linux上,有一个系统调用cacheflush来解决这个问题。根据您修改内存的方式/在何种情况下,会出现鸡或蛋的问题,因为您新修改的代码无法包含缓存刷新,因为缓存已经不同步了,因此还有其他方法可以强制执行高速缓存刷新,例如,当您无法以编程方式刷新高速缓存时,强制执行上下文切换(即睡眠)。

评论


非常感谢您提供有关缓存和刷新的详细信息。很有帮助。

– Jeroen Wiert Pluimers
2014-2-26 13:41



#2 楼

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

请注意,ARM是在哈佛体系结构上构建的,并且在编写代码之后您可能需要对代码缓存进行一些操作。

#3 楼

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