基本使用
安装请参考这篇文章: https://blog.csdn.net/juluwangriyue/article/details/108617283
patchelf 修改 elf 文件加载指定版本的libc库
先用 --set-interpreter 这个选项来将旧的 ld.so(加载器) 替换为要加载的 ld.so
patchelf --set-interpreter /opt/libs/2.27-3ubuntu1_amd64/ld-2.27.so ./加载的
然后使用 --replace-needed这个选项将旧的 libc库 替换成要加载的 libc库
#第2个参数是程序原本的动态链接库的路径,可以用 ldd 命令查看目标文件获取,第3个参数是新的动态链接库的路径,第4个参数为要修改文件的路径。
patchelf --replace-needed libc.so.6 /opt/libs/2.27-3ubuntu1_amd64/libc-2.27.so ./patchelf
但是这样挺麻烦的,我们可以通过编写一个shell脚本实现快速使用
脚本调用
将代码保存为sh为后缀名的shell脚本即可。
如果每次通过路径调用脚本也非常麻烦,所以我们可以给脚本路径起一个别名实现快速调用。
如下
利用alias命令给脚本路径起别名,就像自定义了一个patch命令一样
这样我们在使用patch命令(原系统没有这个命令)的时候就是调用脚本的时候
如果你使用的是bash,只需要将下面这行代码添加到家目录下的.bashrc,然后 source .bashrc重载.bashrc文件即可
如果是zsh,就添加到家目录下的.zshrc即可。
注意:后面应该是你自己脚本存放的路径
这样调用的时候只需要第一个参数指定加载器和libc库的目录,第二个参数指定文件路径即可。
接下来演示一下,可以看到 s 文件原来的 libc 路径和 ld 加载器路径
通过patch修改
查看修改结果,可以看到修改成功
脚本
#!/bin/bash
set -x
libc_path=$1
elf_path=$2
patchelf_bin_path="/usr/local/bin/patchelf"
# 检查参数
if [ -z "$libc_path" ] || [ -z "$elf_path" ]; then
echo "Usage: $0 <libc_path> <elf_path>"
exit 1
fi
# 找到 ld 文件
ld_file=$(ls ${libc_path}/ld-2.*.so 2>/dev/null | head -n 1)
if [ -f "$ld_file" ]; then
$patchelf_bin_path --set-interpreter "$ld_file" "$elf_path"
fi
# 找到 libc 文件
libc_file=$(ls ${libc_path}/libc-2.*.so 2>/dev/null | head -n 1)
if [ -f "$libc_file" ]; then
$patchelf_bin_path --replace-needed libc.so.6 "$libc_file" "$elf_path"
fi
set +x
后言
这里先给大家道个歉
因为这两天放假回家,导致时间很少,所以这几天会有点水
等后面到家再二开一下