合并精灵共享对象

逆向工程 linux 小精灵
2021-07-04 05:18:41

假设我有 libA.so 和 libB.so,有什么方法可以让我将它们组合成一个共享库 libC.so,其中包含 libA.so 和 libB.so 的所有导出符号?

1个回答

坦率地说,这更像是一个开发(即 StackOverflow)问题而不是 RCE,但是让我根据您在问题中提供的信息水平给出我可以给出的建议水平。

问题是您想要实现的目标是通过单个库让这些符号完全可用,还是您不关心这两组符号如何对您的程序可用。

如果您坚持使用该库,您可以简单地编写一个共享库并通过浅层包装函数从中导出符号,但使用动态加载程序从原始共享对象中找到它们(请查看ldd相关手册页)。找到所有带有readelf --dyn-syms <elf-file>/ 的符号名称并不太难readelf --syms --use-dynamic <elf-file>(Ubuntu/Debian 上的软件包是elfutils)。从它的输出中,您可以编写一个版本脚本以在您的链接器中使用(例如gcc -Wl,--version-script,script.map ...)。

但是,假设您使用不涉及额外魔法的默认 Linux 工具,您还可以滥用ld-linux/ld.so定位符号的方法。如果您编写一个简单的包装器 shell 脚本来设置LD_PRELOAD,您可以简单地预先加载两个共享对象,并且它们应该 - 在正常情况下 - 优先于其他符号。它也常被用作调试技术。

我强烈建议您阅读 Michael Kerrisks 的优秀著作“Linux 和 Unix 系统编程权威指南”的第 41 和 42 章,通俗地称为TLPI在您的情况下,相应的源示例也可能会派上用场。