yorknong 发表于 2017-5-16 09:49:28

利用shell脚本Hack二进制文件内容

      工作中用到了一个遗留下来的windows平台的交叉编译工具链,是已经离职的同事编译出来的。功能正常,只是工具链中很多二进制命令中包含了“/cygdrive/h/crosstool。。。”这样的绝对路径,当H盘盘符不幸的分配给光驱或者虚拟光驱的时候,编译等过程中会提示“没有媒介”这样的诡异错误,如果没有H盘或者H盘可读则没问题,没有这方面的知识储备,猜测和搜索路径有关。经过反复测试和查看二进制文件,最终才定位到是这个问题。
      接下来就是怎么work around了,重新编译一个工具链自然是最好的办法,但是一方面没做过,另外之前配置好的环境也人去楼空,请人重新做一个也太耗费他人精力和时间了;请每个用户不要设置H盘为光驱,这个就更没有人性,直接pass;最后既然是windows盘符的问题,那就干脆自力更生,把二进制文件中这个h盘盘符改成c盘,虽没有根治(猜测编译时应该能去掉绝对路径依赖,因为另外一个平台的工具链二进制文件中没有绝对路径),但是可以成功绕开。
      想清楚后剩下的事情就比较好办,把上次“利用shell脚本修正代码风格”的脚本借用过来即可,代码记录如下:

#!/bin/sh
list_alldir(){
for file in $1/*
do
#echo "cur:$file"
if [ -d "$file" ]
then
echo "dir:$file"
list_alldir "$file"
elif [ -f "$file" ]
then
#echo "file:$file"
f=`basename $file`
cp -R "$file" "$tmp_dir/$f"
sed -i 's#/cygdrive/h/crosstool/#/cygdrive/c/crosstool/#g' "$tmp_dir/$f"
if ! cmp -s "$file" "$tmp_dir/$f"
then
echo "!!!!++++get a file : $f ++++!!!!"
d=`dirname $file`
mkdir -p "$tmp_dir/$d"
mv "$tmp_dir/$f" "$tmp_dir/$d/"
else
rm -f "$tmp_dir/$f"
fi
fi
done
}
cur=`pwd`
stamp=`date +%Y%m%d_%H%M%S`
tmp_dir="$cur/$stamp"
echo "tmp_dir:$tmp_dir"
mkdir "$tmp_dir"
if [ $# -gt 0 ]
then
list_alldir "$1"
else
list_alldir "."
fi
页: [1]
查看完整版本: 利用shell脚本Hack二进制文件内容