我们写的shell脚本里面通常会包含帐号密码等信息或者你不想让别人看到的信息,那么把写好的shell脚本进行简单的加密显得有些必要了。
常用的shell加密方法有两种,一种是通过gzexe加密,另一种是通过shc加密。
我们先给一个简单的脚本,然后用它来进行加密解密演示,脚本abc.sh内容如下
1 2 | #!/bin/bash echo "hello world!" |
---|
gzexe加密与解密shell脚本
(tips:绿色为输出内容)
1 2 3 4 5 6 7 8 9 | bash abc.sh # 执行后显示内容 hello world! gzexe abc.sh # 压缩 abc.sh: 18.8% ls -l # 压缩完成后, abc.sh~ 是原文件 , abc.sh 是压缩后的二进制文件 abc.sh abc.sh~ mv abc.sh abc sh abc # 压缩后再执行正常 hello world! |
---|
我们只需要把abc这个二进制文件传到机器上执行就可以了,并不需要关心它的源码,别人也不能通过这个文件看到shell代码,我们cat显示一下这个文件发现内容全部乱码,如图(乱码内容未全部截图出来)。
但是通过gzexe加密的shell脚本并不是很安全,细看我们如何通过abc这个乱码的执行文件还原成原来的shell脚本。
但是通过gzexe加密的shell脚本并不是很安全,细看我们如何通过abc这个乱码的执行文件还原成原来的shell脚本。
我们看到内容中有一行叫skip=44,这一行非常重要,它告诉我们从第44行起才是原来压缩之前文件的内容,前面都是压缩软件附加上去的内容。虽然从44行往后面也全部都是乱码,我们也读不懂这些内容,但是gzip程序会告诉我们的。
首先我们把第44行以后的内容过滤出来生成一个.gz结尾文件,然后解压,文件内容就都出来了。
(tips:绿色为输出内容)
1 2 3 4 5 6 | tail -n +44 abc > /tmp/a.gz # 我们把第44行以后的文件写成一个.gz结尾的压缩文件 cd /tmp gunzip a.gz # 解压生成的文件 cat a # 解压后的文件和压缩文件同名 #!/bin/bash echo "hello world!" |
---|
我们看到解压之后,文件里面的内容和原来压缩之前是一样的,成功完成解密。
shc加密shell脚本
shc是比gzexe安全的多的加密软件,不过网络说通过gdb调试也是可以显示内容的,不过我没有尝试,网上也没啥资料。
shc官方网站:http://www.datsi.fi.upm.es/~frosal/sources/
shc安装过程
1 2 3 4 5 | wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz tar zxvf shc-3.8.9.tgz cd shc-3.8.9 mkdir -p /usr/local/man/man1/ # 这个是必须的,帮助文件会写到这里,没这个目录会报错 make install |
---|
安装完成后,我们再创建个文件做测试,文件123.sh内容如下
1 2 | #!/bin/bash echo "hello ITDHZ.COM" |
---|
还是只有一行echo命令,简单就好,哈哈~~ , 下面是测试
1 2 3 | shell > shc -r -f 123.sh shell > ls 123.sh 123.sh.x 123.sh.x.c |
---|
通过shc加密后,原文件123.sh还在,又另外生成两个文件,123.sh.x是加密后可执行的二进制文件,123.sh.x.c 是 123.sh.x 的源文件(注意是C语言版本的源文件)
文件加密是成功了,但是加密后的文件执行时啥也不显示,郁闷鸟。还好shc有比较好的帮助文件,通过shc -h看了下,发现编译的时候少了个参数-T,这样才能回显echo的内容。
1 | shc -r -T -f 123.sh |
---|
另外shc在加密的过程中还可以设置生成二进制执行文件的过期时间和过期说明,例如
1 2 3 4 | shc -r -T -e "31/10/2004" -m "this file is expiration date." -f 123.sh ./123.sh.x ./123.sh.x: has expired! this file is expiration date. |
---|
更多shc的用法,请大家自行研究shc的帮助文件。
另外要注意的一点是:
gzexe生成的二进制文件 可以通过 /bin/bash xxx 命令来执行。
shc生成的二进制文件只能通过 ./xxx 命令来执行,不能通过 /bin/bash xxx 来执行。