当前位置: 首页 > 科技观察

如何隐藏shell脚本内容

时间:2023-03-15 16:44:55 科技观察

本文转载自微信公众号《Linux开发那些事儿》,作者LinuxThings。转载此文请联系Linux开发那些事公众号.从事Linux开发的同学,经常需要编写shell脚本。有时脚本中涉及一些敏感内容,比如一些IP地址、用户名和密码等,或者脚本中有一些关键代码,这些都是你不希望别人阅读或修改的,更进一步,你想为脚本设置一个过期时间。指定时间后,脚本将无法使用。有没有什么办法可以在不改变脚本内容、功能和执行方式的情况下实现上述需求呢?答案是:可以,在Linux下我们可以使用shc工具来隐藏shell脚本的内容和设置过期时间简介shc是一个通用的shell脚本编译器,它将shell脚本编译成可执行的二进制文件,其功能和执行方法与原脚本相同。与gcc编译器不同,shc并不将脚本源代码转换成机器码,它只是生成一段C语言代码,其中包含加密的原始shell脚本,并为其添加过期功能,然后将C代码编译成可执行文件通过gcc编译器生成二进制文件。安装目前大多数Linux发行版的repository中已经包含shc,你只需要使用默认的包管理即可。具体安装命令如下:yuminstallshc输入shc-v命令,出现如下输出说明安装成功【root@ecs-centos-7shc_test]#shc-vshcparse(-f):NosourcefilespecifiedshcUsage:shc[-edate][-maddr][-iiopt][-xcmnd][-llopt][-ooutfile][-rvDSUHCABh]-fscript常用选项以下是一些常用的shc选项及其说明选项说明-f待编译的Shell脚本文件-o指定编译生成的二进制文件-e设置过期时间,格式为日/月/年-m过期后,执行脚本时的提示信息-v输出编译shell脚本的过程-r编译生成可再发行的二进制编译脚本sehll脚本编译成可执行的二进制文件后,只需要将二进制文件提供给执行者即可,执行者无法知道原脚本代码,以免他人读取和修改代码新建一个func.sh脚本,在其中添加如下内容:#!/bin/bash#Isitavalidpasswordvalid_passwd(){if["$1"=="123"];thenecho1elseecho0fi}#获取最大数max_num(){echo100}#登录远程机器login(){sshpass-p'123456'sshtest@192.168.70.20}#版本号ver(){echo"1.0"}if[$#-ne0];thenname="$1"shift1${name}"$@"fi执行以下命令编译func.sh脚本shc-rffunc.sh-ofunc.bin后编译通过,当前目录会出现三个文件file[root@ecs-centos-7shc_test]#ll-rwxrwxr-x1rootroot11640July100:24func.bin-rw-r--r--1rootroot373July100:19func.sh-rw-r--r--1rootroot1981July100:24func.sh.x.cfunc.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接口name接口参数列表,下面两个例子说明如何使用脚本示例1分别执行./func.binver和./func.shver命令,结果如下。最后的结果是一样的。实例2执行./func.bin登录命令,结果如下。当传入login参数时,会执行func.sh脚本中的login函数。该函数的作用是使用SSH登录远程机器,函数体中的sshpass是一个自动填写SSH登录密码的工具。从结果我们可以知道,执行./func.binlogin命令后,登录到ip为192.168.70.20的机器的/home/test目录,然后输入exit,从远程机器返回到目录当前机器。将func.sh脚本编译成func.bin二进制文件的目的是为了在脚本文件中隐藏一些敏感信息,比如:脚本中的SSH用户test,IP地址192.168.70.20,密码123456设置过期时间。除了将脚本编译成二进制文件外,shc还可以为二进制文件设置过期时间。下面以func.sh脚本为例进行说明,执行shc-e25/6/2021-m"脚本已过期,请联系test@qq.com"-rffunc.sh-ofunc.bin命令来设置脚本的过期时间为2021年6月25日,设置脚本执行后的提示为“脚本已过期,请联系测试@qq.com”,然后执行./func.binver命令进行测试,结果如下从上图可以看出,脚本设置过期时间后,如果再次执行脚本,会提示已经过期。如何引用二进制脚本func.sh并编译成二进制文件下载下来后,其他脚本引用它的方式也要调整一下。原来使用source./func.sh的方式需要修改,因为fun.sh已经从原来的ASICII文件变成了二进制文件。下面给出一个shell脚本,引用二进制脚本func.bin的实例新建一个test_func.sh脚本,脚本内容如下:#!/bin/bash#callvalid_passwd函数ret=$(./func.binvalid_passwd123)if[$ret-eq1];thenecho"passwdok"fi#callvalid_passwd函数ret=$(./func.binvalid_passwd124)if[$ret-eq1];thenecho"passwdok"elseecho"passwdfail"fi#callmax_numfunctionret=$(./func.binmax_num)echo"max_num:"$ret#callverfunctionret=$(./func.binver)echo"version:"$ret执行。/test_func.sh命令,结果如下从上图可以看出,test_func.sh脚本分别调用了二进制文件fun.bin中的valid_passwd、max_num、ver函数。根据func.sh脚本的内容,可以判断结果的输出是正确的从这个例子可以看出,普通的脚本也可以正常使用。Binaryscriptsecurityshc使用的加密类型是RC4流密码的变种,已经被证明是弱的,有可能被破解,特别是在shc中,密钥被携带到加密的脚本本身,所以有可能通过反汇编解密密钥,然后通过密钥还原原始脚本。因此,我们不应该依赖shc加密的安全性,而是很多人把它当成一个隐藏或混淆shell脚本内容的工具总结本文主要介绍shc,一个隐藏shell脚本内容的工具。使用混淆工具也可以达到我们的目的。关于shc的更多信息,请参考网上其他资料