【发布时间】:2011-04-22 16:20:41
【问题描述】:
我正在尝试将一些额外的日志记录代码合并到一个静态链接的(android arm linux)可执行文件中。
(正常的跟踪方法似乎不起作用,因为它是一个守护进程,它在做任何有趣的事情之前 clone()s - 告诉 strace 跟随它只会崩溃)。
十六进制编辑现有代码以将跳转指令插入新代码已经过测试和工作,问题在于将新代码合并到可执行文件中,这样它不会干扰现有段,并且确实加载到可执行页面中。
我已经能够将所有附加代码压缩到单个目标文件部分,但无法弄清楚如何使用 objcopy(甚至 ld)以正确加载的方式合并它 -看来我需要调整现有负载段的大小并移动,或者添加一个额外的负载段。
在共享库中添加代码可能是另一种选择,如果有办法将必要的存根添加到已链接且当前为静态的可执行文件中(然后我会在跳转指令中对存根的已知位置进行十六进制编辑,然后运行时链接器将指向添加的代码)
【问题讨论】:
-
不一定适用于我想做的所有事情,我想要一个相当通用的方法。但我可能有足够的空间来编码系统调用 mmap() 从外部文件生成可执行页面并十六进制编辑启动代码以跳转到该页面。
-
为什么不直接重新编译内核...?
-
@Turbo J 这不是内核代码。在无法从备用闪存位置引导内核的设备上检测内核以监视用户代码既是激烈的,而且在尚未发布精确内核的源代码时(正如在设备启动之前应该完成的那样)是困难的销售)。
-
在程序集中直接编码的 mmap(2) svc 调用中的修补是有效的,但我必须弄清楚如何生成一个目标 blob 以在其更广泛的范围内加载正确的内部修复(编译自-C) 代码。顺便说一句,Linux 系统调用不遵循 arm abi ......通常第 5 和第 6 个参数进入 r4 和 r5
标签: linux arm elf binutils objcopy