隐藏shell脚本内容的工具 shc详解
从事 linux 开发的同学,经常需要编写 shell 脚本,有时脚本中会涉及到一些敏感内容,比如一些 ip 地址,用户名以及密码等,或者脚本中有一些关键的代码, 所有这些内容你都不想别人阅读或者修改,更进一步,你希望对脚本设置过期时间,超过指定时间时间之后,脚本就无法使用
在不改变脚本内容、功能以及执行方式的情况下,有没有办法实现上面的需求呢?
答案是:有的, 在linux下,我们可以使用 shc
这个工具来实现隐藏shell脚本内容以及设置过期时间的目的
简介
shc
是一个通用shell脚本编译器,它将 shell 脚本编译 可执行的二进制文件,它的功能以及执行方式和原始脚本没有区别
和 gcc
编译器不同的是,shc
并没有把脚本源代码转化成机器码,它只是生成了一份 c
语言代码,这份 c
语言代码中包含了加密的原始shell脚本,并为它添加了过期功能,然后,通过gcc
编译器将c
代码编译成可执行的二进制文件
安装
目前,大多数的 linux 发行版的仓库中都已经包含了 shc
, 只需要使用默认的包管理器就可以安装,具体的安装命令如下:
yum install shc
输入 shc -v
命令,下面的输出表示安装成功
[root@ecs-centos-7 shc_test]# shc -v shc parse(-f): no source file specified shc usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-o outfile] [-rvdsuhcabh] -f script
常用选项
下面是 shc
常用的一些选项以及选项的描述
选项 | 描述 |
---|---|
-f | 待编译的shell脚本文件 |
-o | 指定编译生成的二进制文件 |
-e | 设置过期时间,格式 日/月/年 |
-m | 过期之后,执行脚本时的提示信息 |
-v | 输出编译shell脚本的过程 |
-r | 编译生成可再发行的二进制 |
编译脚本
sehll 脚本编译成可执行的二进制文件之后,只需要把二进制文件提供给执行者即可,这样执行者就无法知道原始脚本代码了,从而实现别人无法阅读和修改代码的目的
新建 func.sh
脚本,往其中添加如下内容:
#!/bin/bash #是否是有效的密码 valid_passwd() { if [ "$1" == "123" ]; then echo 1 else echo 0 fi } #获取最大数量 max_num() { echo 100 } #登录到远程机器 login() { sshpass -p '123456' ssh test@192.168.70.20 } #版本号 ver() { echo "1.0" } if [ $# -ne 0 ]; then name="$1" shift 1 ${name} "$@" fi
执行下面的命令,编译 func.sh
脚本
shc -rf func.sh -o func.bin
编译完之后,当前目录下会出现三个文件
[root@ecs-centos-7 shc_test]# ll -rwxrwxr-x 1 root root 11640 7月 1 00:24 func.bin -rw-r--r-- 1 root root 373 7月 1 00:19 func.sh -rw-r--r-- 1 root root 19811 7月 1 00:24 func.sh.x.c
func.sh
是原始的脚本文件,func.sh.x.c
是生成的 c
语言代码, func.bin
是生成可执行的二进制文件,它的使用方法和原始脚本是一样的
注意: 编译出来的二进制文件func.bin
,如果想让它在其他机器也能运行的话,一定要指定 -r
选项
使用 file
命令分别查看 func.bin 、func.sh.x.c
,结果如下:
脚本对外提供 valid_passwd、 max_num、 login、 ver
这四个接口,脚本中已经注明了每个接口的作用,使用方法是 ./func.bin 接口名 接口参数列表
,下面的两个实例说明了如何使用脚本
实例1
分别执行 ./func.bin ver
和 ./func.sh ver
命令,结果如下
从上图可以看出,无论是用脚本还是二进制,最终的结果都是一样的
实例2
执行 ./func.bin login
命令,结果如下
当传入 login
参数时,就会执行func.sh
脚本中的 login
函数,该函数的作用是使用 ssh 登录到远程机器, 函数体中的 sshpass 是一个自动填充ssh登录密码的工具
从结果可以知道,执行 ./func.bin login
命令之后,就登录到 ip 为 192.168.70.20
机器的 /home/test
目录,后面再输入 exit
从远程机器退回到当前机器的目录
我们把 func.sh
脚本编译成 func.bin
二进制文件的目的就是要隐藏脚本文件中一些敏感信息,比如:脚本中的ssh用户 test
, ip地址 192.168.70.20
以及密码 123456
设置过期时间
shc
除了将把脚本编译成二进制,还能为二进制设置过期时间,下面还是以 func.sh
脚本为例来说明
执行 shc -e 25/6/2021 -m "the script is expired, please contact test@qq.com" -rf func.sh -o func.bin
命令把脚本的过期时间设置为 2021年6月25日,执行过期后的脚本提示语设置为 "the script is expired, please contact test@qq.com"
然后,执行 ./func.bin ver
命令进行测试,结果如下
从上图可以看出,脚本设置过期时间之后,再次执行脚本会提示已经过期了
如何引用二进制脚本
func.sh
编译成了二进制后,其他脚本引用它的方式也要调整下,原来以 source ./func.sh
的使用方式都需要修改,因为 fun.sh
已经由原来的 asicii 文件变成了 二进制文件了,下面给出一个shell脚本引用二进制脚本 func.bin
的实例
新建 test_func.sh
脚本,脚本内容如下:
#!/bin/bash #调用 valid_passwd 函数 ret=$(./func.bin valid_passwd 123) if [ $ret -eq 1 ]; then echo "passwd ok" fi #调用 valid_passwd 函数 ret=$(./func.bin valid_passwd 124) if [ $ret -eq 1 ]; then echo "passwd ok" else echo "passwd fail" fi #调用 max_num 函数 ret=$(./func.bin max_num) echo "max_num:"$ret #调用 ver 函数 ret=$(./func.bin ver) echo "version:"$ret
执行 ./test_func.sh
命令,结果如下
从上图可以看出,test_func.sh
脚本分别调用了二进制文件 fun.bin
中的 valid_passwd、max_num、 ver
函数,根据 func.sh
脚本内容,可以确定结果输出都是正确的
从这个实例可以得出,普通脚本也可以正常使用二进制的脚本
安全性
shc
使用的加密类型是叫做 rc4流密码的一个变体,目前它已经被证实存在弱点,存在被破解的可能,
尤其在 shc
中,密钥被携带到加密脚本本身中,所以,是存在 通过反汇编破解出密钥,进而通过密钥还原原始脚本的可能性
因此,我们不应该依赖 shc
加密的安全性,而是更多的把它当作是shell脚本内容的隐藏或者混淆工具
小结
本文主要介绍了隐藏shell脚本内容的工具 shc
, 虽然它加密的安全性不高,但是我们平常可以把它作为一个shell脚本代码隐藏和混淆工具来使用,也能达到我们的目的, 更多关于 shc
的相关知识请参考网上其他资料
到此这篇关于隐藏shell脚本内容的工具 shc详解的文章就介绍到这了,更多相关shell脚本隐藏内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
上一篇: shell脚本设置防止暴力破解ssh
下一篇: ansible执行shell脚本的方法