首页 > Shell > 在shell中嵌入二进制文件

在shell中嵌入二进制文件

Shell 2013-03-03

将二进制文件打包到shell脚本
之前因为要用支付宝更新浏览器插件,直接下载了一个aliedit.sh脚本,直接执行脚本,便搞定了插件的安装,正要称赞阿里的开发人员人性化了,转念一下,一个shell脚本就能搞定的安装,岂不是可以直接cat脚本就可得知支付宝监控工具的代码啦.
直接cat结果如下:

main()
{
 SetStrings
 Mkdir
 ARCHIVE=`awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' "$0"`
 tail -n+$ARCHIVE "$0" | tar xzvm -C $TMP_DIR > /dev/null 2>&1 3>&1
 if [ $? -ne 0 ]
 then
 echo $PACKAGE_BAD
 Quit
 fi
 CUR_DIR=`pwd`
 cd $TMP_DIR
 ./install.sh
 #cd "$CUR_DIR"
 rm -rf $TMP_DIR
 exit 0

}
main

#This line must be the last line of the file
__ARCHIVE_BELOW__
2�^��^M�.�Ɠ��jz���Y�Zi(�#;S4#C^��?*oX#���`����jW�u��_���#p��#�`<span style="font-family: 'Lohit Hindi';">י��#n�UY������,c���d��II���

shell脚本后面跟了一些乱码,莫非是直接加密了shell,通过阅读代码可以看出脚本后的乱码其实一个tar.gz的二进制:

ARCHIVE=awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' "$0"
tail -n+$ARCHIVE "$0" | tar xzvm -C $TMP_DIR > /dev/null 2>&1 3>&1

首先是用awk获取脚本代码的开始行号,使用tail获取所有二进制码(所以脚本才会有如此注释:#This line must be the last line of the file),通过管道传给tar命令解压到制定目录.

oen@oen ~/code/shell/aliedit/install $ du -a
4 ./README
12 ./install.sh
268 ./lib/libaliedit64.so
244 ./lib/libaliedit32.so
516 ./lib
536 .

如上可以看到,真正执行是通过解压到临时目录的install.sh 实现的,同时真正玄机在libaliedit64下,是看不到了.

不得不说的一个偶然出现的问题:脚本执行完成之后会把临时目录删除,通过vim注释掉删除语句,结果提示包错误,但是怀疑是难道是有脚本校验,但脚本包错误提示是因为tar失败发出的,原来是二进制的乱码通过vi编辑后保存,二进制便彻底变成乱码了,所以tar解包失败.
具体使用方式如下:

oen@oen ~/code/shell/aliedit/install/lib $ echo "oenhan.com blog code" > example.sh
oen@oen ~/code/shell/aliedit/install/lib $ tar -zcvm * >> example.sh
example.sh
libaliedit32.so
libaliedit64.so
oen@oen ~/code/shell/aliedit/install/lib $ cat example.sh | head -n 3
oenhan.com blog code
#A#3Q#��ePO�����-@p�#��kpw��5�#�<span style="font-family: 'Lohit Hindi';">ݝ#����u

其实这个脚本就是一个自解压包,同理你可以把很多文件的二进制搞出来,脚本中找个命令接受转义即可.

当然还有专门的命令可以搞定在脚本嵌入二进制文件: uuencode

uuencode /home/oenhan.com.1.tar /home/oenhan.com.2.tar  > /home/oenhan.com.txt

将 oenhan.com.1.tar编码到 oenhan.com.txt,将来解码到 oenhan.com.2.tar.
具体实现:
首先需要写一个脚本example.sh的头:

#!/bin/bash
uudecode $0
cd /home/
tar xvf  oenhan.com.2.tar
exit

然后将自解压代码编码到脚本中

uuencode /home/oenhan.com.1.tar /home/oenhan.com.2.tar  >> /home/example.sh

如此一个自解压脚本做成了, uuencode和tar解压没有本质区别,uudecode 自己完成了tar找寻二进制代码的过程,看似很自动化却需要用户安装一个包sharutils,从简易度上得不偿失,不如用tar的方式搞定shell的二进制代码嵌入.


在shell中嵌入二进制文件来自于OenHan,链接为:http://oenhan.com/shell-pack-bin
更多阅读