gpt4 book ai didi

linux - 将附加代码合并到可执行文件中 (arm-linux)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:12 24 4
gpt4 key购买 nike

我正在尝试将一些额外的日志记录代码合并到一个静态链接的 (android arm linux) 可执行文件中。

(正常的跟踪方法似乎不起作用,因为它是一个守护进程,在做任何有趣的事情之前克隆()s - 告诉 strace 跟随这个只会让它崩溃)。

十六进制编辑现有代码以将跳转指令插入新代码已经过测试并且有效,问题是将新代码以不干扰现有段的方式合并到可执行文件中,并且确实加载到可执行页面。

我已经能够将所有附加代码压缩到一个目标文件部分,但无法弄清楚如何使用 objcopy(或什至 ld)以正确加载的方式合并它 -看来我需要调整和移动现有的负载段,或者添加一个额外的负载段。

在共享库中添加代码可能是另一种选择,如果有一种方法可以将必要的 stub 添加到已经链接且目前静态的可执行文件中(然后我会在跳转指令中对 stub 的已知位置进行十六进制编辑,然后运行时链接器将指向添加的代码)

最佳答案

这很不雅观,所以我对更好的想法很感兴趣,但这里是我已经能够实现的基本工作的总结。

这是一种双管齐下的方法,将一个小的引导有效负载插入到原始 Sprite 的填充中,然后 mmap() 是一个任意大的二进制 blob 来完成实际工作。

第一部分:引导负载

基本上,我在 .ARM.exidx 部分(在代码段的顶部加载)和 .preinit_array 部分之间的一些填充中插入少量代码。这段代码只是打开另一个二进制 blob 和 mmap()s 它是只读的并且可以在我希望是安全的硬编码虚拟地址上执行。

为了让我插入的代码作为主要可执行文件的一部分加载,我必须修改 elf 文件中加载段的大小,在本例中是从 0x54 开始的第二个 phdr 结构。 0x64(0x54+0x20)处的p_filesz和0x68(0x54+0x24)处的p_memsz均已更改。

我还更改了 elf header 中偏移量 0x18 处的 e_entry 起始地址,以指向我插入的代码。我插入的代码在完成设置后会跳转到旧的起始地址(实际上它首先跳转到较大负载中的第二阶段设置,然后跳转到原始地址)。

最后,我为我想要捕获的函数更改了静态链接的系统调用 stub ,以指向我正在 mmap() 进入的较大负载的加载地址的替换。

第二部分:大负载

这实现了所做的任何修改 - 在我的例子中,用在满足特定条件时记录的函数替换系统调用。由于主可执行文件是静态链接的,因此也必须如此——或者更简单地说,它不能使用 C 库。相反,它使用汇编语言为基本 I/O 发出系统调用。我意识到,如果不作为可执行文件加载,我就没有持久的局部变量存储,所以在启动时我 mmap() 一个匿名页面来保存局部变量——主要是我正在登录的文件的 fd 和设备驱动程序 fd 的操作应该记录哪些内容。

编译这部分有点不雅。我正在使用 -S 切换到 gcc 编译为汇编,然后删除所有部分关键字。然后我通过 gcc 将其传回以组装并生成一个对象。我通过链接器运行它,将我的第一个函数的名称指定为入口点 (-e),并使用自定义的常用链接器脚本删除 0x8000 起始偏移量。但是由于 header 的原因仍然存在一些偏移量,在本例中为 128 字节。为了保留修正,我将链接的 Sprite 的内容对象复制到一个二进制 blob 中,从/dev/zero 中 dd 自己 128 个字节,并将其放在开头....

正如我所说的......这很不雅观,所以我愿意接受更好的想法

关于linux - 将附加代码合并到可执行文件中 (arm-linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5757515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com