gpt4 book ai didi

c++ - 作弊 Linux : executables and dependent libraries via LD_PRELOAD

转载 作者:IT王子 更新时间:2023-10-29 00:55:45 27 4
gpt4 key购买 nike

对标题感到抱歉,真的想不出其他任何东西来描述这个问题:)

好的,事情是这样的:我正在尝试在 Linux 下使用专有的免费软件应用程序(因此出现了问题;如果我有源代码,我可以重建它)。此外,我试图在不受支持的 Linux 版本上运行它,并且应用程序的几乎所有组件都单独工作,但不能一起工作(如果应用程序完全运行,它们应该如此)。

让我澄清一下。有一个 GUI,可以在不受支持的操作系统中正常启动。然后,从这个 GUI 中,您可以调用一堆命令行工具 - 有用的是,GUI 还会吐出在每种情况下调用的命令行。

现在,从 GUI 调用其中一些命令失败了 - 然而,因为我调用了实际的命令行(假设:“extprogram -arg1 1 -arg2 2 ...”),我可以从终端重复这些。因此,我发现整个应用程序都带有自己的 libc 库;并使用这些库,(一些)命令(从终端运行)往往会失败 - 但是,我发现从命令行,这通常适用于那些失败的命令:

LD_PRELOAD=/usr/lib/libstdc++.so.6 extprogram -arg1 1 -arg2 2 ...

# or alternatively, this works too:
# LD_LIBRARY_PATH=/usr/lib extprogram -arg1 1 -arg2 2 ...

(换句话说,使用系统 libstdc++ 而不是应用程序提供的库,往往可以解决问题)

所以,现在如果我可以说服 GUI 使用“LD_PRELOAD”/“LD_LIBRARY_PATH”调用这些工具 - 我想,一切都会正常...

不幸的是,GUI 不调用将进一步调用这些可执行文件的脚本,我可以直接更改这些可执行文件(据我通过 grepping 所见)- 看起来,它是 GUI 可执行文件创建系统调用;我尝试了“strace”-ing,但我找不到类似临时脚本或任何我可以更改的内容...

所以,我想也许我可以通过制作可执行的 bash 脚本来“作弊”;所以我移动可执行文件 - 并创建一个脚本,该脚本应该使用 LD_ 前缀调用移动的可执行文件:

mv extprogram extprogram.old
cat > extprogram <<EOF
LD_LIBRARY_PATH=/usr/lib extprogram $@
EOF

...但这失败了;显然 GUI 应用程序识别出了一些不对的地方。

所以,我在想 - 是否有可能以某种方式拥有 C/C++ 代码“包装器”,以某种方式“加载”此可执行文件,但在具有“LD_LIBRARY_PATH=/usr/lib"设置 - 并将其参数传递给它(并返回它的返回值)?然后我可以在操作系统上本地构建这个“包装器”,使用与原始可执行文件相同的名称 - 并让整个工作正常,而无需触及原始可执行文件(重命名除外)。

非常感谢您的回答,
干杯!

最佳答案

你很接近。您忘记了 shebang 并使脚本可执行。您还调用了错误的外部程序。最后,我将使用旧脚本的绝对路径,因为您不知道 GUI 的 CWD 是什么。

mv extprogram extprogram.old
cat > extprogram <<EOF
#!/bin/sh
LD_LIBRARY_PATH=/usr/lib exec /psth/to/extprogram.old "$@"
EOF
chmod +x extprogram

关于c++ - 作弊 Linux : executables and dependent libraries via LD_PRELOAD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7988552/

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