如何隐藏shell脚本内容
从事Linux开发的同学,经常需要编写shell脚本,有时脚本中会涉及到一些敏感内容,比如一些IP地址,用户名以及密码等,或者脚本中有一些关键的代码,所有这些内容你都不想别人阅读或者修改,更进一步,你希望对脚本设置过期时间,超过指定时间时间之后,脚本就无法使用
在不改变脚本内容、功能以及执行方式的情况下,有没有办法实现上面的需求呢?
答案是:有的,在Linux下,我们可以使用shc这个工具来实现隐藏shell脚本内容以及设置过期时间的目的简介
shc是一个通用shell脚本编译器,它将shell脚本编译可执行的二进制文件,它的功能以及执行方式和原始脚本没有区别
和gcc编译器不同的是,shc并没有把脚本源代码转化成机器码,它只是生成了一份C语言代码,这份C语言代码中包含了加密的原始shell脚本,并为它添加了过期功能,然后,通过gcc编译器将C代码编译成可执行的二进制文件安装
目前,大多数的Linux发行版的仓库中都已经包含了shc,只需要使用默认的包管理器就可以安装,具体的安装命令如下:yuminstallshc
输入shcv命令,下面的输出表示安装成功〔rootecscentos7shctest〕shcvshcparse(f):NosourcefilespecifiedshcUsage:shc〔edate〕〔maddr〕〔iiopt〕〔xcmnd〕〔llopt〕〔ooutfile〕〔rvDSUHCABh〕fscript常用选项
下面是shc常用的一些选项以及选项的描述
选项
描述
f
待编译的shell脚本文件
o
指定编译生成的二进制文件
e
设置过期时间,格式日月年
m
过期之后,执行脚本时的提示信息
v
输出编译shell脚本的过程
r
编译生成可再发行的二进制编译脚本
sehll脚本编译成可执行的二进制文件之后,只需要把二进制文件提供给执行者即可,这样执行者就无法知道原始脚本代码了,从而实现别人无法阅读和修改代码的目的
新建func。sh脚本,往其中添加如下内容:!binbash是否是有效的密码validpasswd(){if〔1123〕;thenecho1elseecho0fi}获取最大数量maxnum(){echo100}登录到远程机器login(){sshpassp123456sshtest192。168。70。20}版本号ver(){echo1。0}if〔ne0〕;thenname1shift1{name}fi
执行下面的命令,编译func。sh脚本shcrffunc。shofunc。bin
编译完之后,当前目录下会出现三个文件〔rootecscentos7shctest〕llrwxrwxrx1rootroot116407月100:24func。binrwrr1rootroot3737月100:19func。shrwrr1rootroot198117月100:24func。sh。x。c
func。sh是原始的脚本文件,func。sh。x。c是生成的c语言代码,func。bin是生成可执行的二进制文件,它的使用方法和原始脚本是一样的
注意:编译出来的二进制文件func。bin,如果想让它在其他机器也能运行的话,一定要指定r选项
使用file命令分别查看func。bin、func。sh。x。c,结果如下:
脚本对外提供validpasswd、maxnum、login、ver这四个接口,脚本中已经注明了每个接口的作用,使用方法是。func。bin接口名接口参数列表,下面的两个实例说明了如何使用脚本实例1
分别执行。func。binver和。func。shver命令,结果如下
从上图可以看出,无论是用脚本还是二进制,最终的结果都是一样的实例2
执行。func。binlogin命令,结果如下
当传入login参数时,就会执行func。sh脚本中的login函数,该函数的作用是使用SSH登录到远程机器,函数体中的sshpass是一个自动填充SSH登录密码的工具
从结果可以知道,执行。func。binlogin命令之后,就登录到ip为192。168。70。20机器的hometest目录,后面再输入exit从远程机器退回到当前机器的目录
我们把func。sh脚本编译成func。bin二进制文件的目的就是要隐藏脚本文件中一些敏感信息,比如:脚本中的SSH用户test,IP地址192。168。70。20以及密码123456设置过期时间
shc除了将把脚本编译成二进制,还能为二进制设置过期时间,下面还是以func。sh脚本为例来说明
执行shce2562021mThescriptisexpired,Pleasecontacttestqq。comrffunc。shofunc。bin命令把脚本的过期时间设置为2021年6月25日,执行过期后的脚本提示语设置为Thescriptisexpired,Pleasecontacttestqq。com
然后,执行。func。binver命令进行测试,结果如下
从上图可以看出,脚本设置过期时间之后,再次执行脚本会提示已经过期了如何引用二进制脚本
func。sh编译成了二进制后,其他脚本引用它的方式也要调整下,原来以source。func。sh的使用方式都需要修改,因为fun。sh已经由原来的ASICII文件变成了二进制文件了,下面给出一个shell脚本引用二进制脚本func。bin的实例
新建testfunc。sh脚本,脚本内容如下:!binbash调用validpasswd函数ret(。func。binvalidpasswd123)if〔reteq1〕;thenechopasswdokfi调用validpasswd函数ret(。func。binvalidpasswd124)if〔reteq1〕;thenechopasswdokelseechopasswdfailfi调用maxnum函数ret(。func。binmaxnum)echomaxnum:ret调用ver函数ret(。func。binver)echoversion:ret
执行。testfunc。sh命令,结果如下
从上图可以看出,testfunc。sh脚本分别调用了二进制文件fun。bin中的validpasswd、maxnum、ver函数,根据func。sh脚本内容,可以确定结果输出都是正确的
从这个实例可以得出,普通脚本也可以正常使用二进制的脚本安全性
shc使用的加密类型是叫做RC4流密码的一个变体,目前它已经被证实存在弱点,存在被破解的可能,尤其在shc中,密钥被携带到加密脚本本身中,所以,是存在通过反汇编破解出密钥,进而通过密钥还原原始脚本的可能性
因此,我们不应该依赖shc加密的安全性,而是更多的把它当作是shell脚本内容的隐藏或者混淆工具小结
本文主要介绍了隐藏shell脚本内容的工具shc,虽然它加密的安全性不高,但是我们平常可以把它作为一个shell脚本代码隐藏和混淆工具来使用,也能达到我们的目的,更多关于shc的相关知识请参考网上其他资料
EOF