隐藏shell脚本内容的工具 shc详解

目录
  • 简介
  • 安装
  • 常用选项
  • 编译脚本
  • 实例1
  • 实例2
  • 设置过期时间
  • 如何引用二进制脚本
  • 安全性
  • 小结

从事 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脚本隐藏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Powershell中显示隐藏文件的方法

    支持PS3.0及以后版本. 当你使用 Get-ChildItem 检索文件,默认是不显示隐藏文件的. 要包含隐藏文件,请使用 –Force 参数. 复制代码 代码如下: PS> Get-ChildItem -Path $home -Force 如果只需要显示隐藏文件,可以使用参数-Hidden ,但它只支持PS3.0. 复制代码 代码如下: PS> Get-ChildItem -Path $home -Hidden Directory: C:\Users\Tobias Mode        

  • PowerShell显示隐藏文件和系统文件的方法

    在PowerShell中,列出文件的cmdlet是Get-ChildItem,别名为dir.比如我们使用"dir $env:windir"可以显示Windows目录的文件和文件夹. 命令: 复制代码 代码如下: PS >dir $env:windir 输出: 复制代码 代码如下: 目录: C:\Windows Mode                LastWriteTime     Length Name ----                -------------   

  • PowerShell隐藏不显示窗口的多种方法

    启动PowerShell时隐藏自己的窗口 假如我在计划任务中定时通过Powershell.exe来执行一个脚本文件,我想隐藏这个窗口,此时我们可以考虑使用PowerShell.exe的选项参数: 复制代码 代码如下: -WindowStyle  将窗口样式设置为 Normal.Minimized.Maximized 或 Hidden. 复制代码 代码如下: PowerShell.exe -WindowStyle Hidden -file '您的脚本.ps1' 在PowerShell启动其它进程时

  • PowerShell设置文件只读、隐藏属性的方法

    本文介绍一个PowerShell中如何设置文件属性.我们知道文件的属性有只读.隐藏.系统.存档和无内容索引等5个,只读和隐藏用得比较多,另外三个用得比较少. 一.文件的属性 不知道大家有没有用过attrib.exe这个cmd下的小程序,它可以用来设置文件的属性.建议大家先去了解一下这个attrib小程序.可以参考文章:使用attrib设置文件只读.隐藏和系统属性 下面我们来看看如何在PowerShell中设置文件只读.隐藏和系统属性. 我们知道,获取一个文件对象可以使用Get-Item这个cmd

  • 隐藏shell脚本内容的工具 shc详解

    目录 简介 安装 常用选项 编译脚本 实例1 实例2 设置过期时间 如何引用二进制脚本 安全性 小结 从事 Linux 开发的同学,经常需要编写 shell 脚本,有时脚本中会涉及到一些敏感内容,比如一些 IP 地址,用户名以及密码等,或者脚本中有一些关键的代码, 所有这些内容你都不想别人阅读或者修改,更进一步,你希望对脚本设置过期时间,超过指定时间时间之后,脚本就无法使用 在不改变脚本内容.功能以及执行方式的情况下,有没有办法实现上面的需求呢? 答案是:有的, 在Linux下,我们可以使用 s

  • Linux 在Shell脚本中使用函数实例详解

    Linux 在Shell脚本中使用函数实例详解 Shell的函数 Shell程序也支持函数.函数能完成一特定的功能,可以重复调用这个函数. 函数格式如下: 函数名() { 函数体 } 函数调用方式: 函数名 参数列表 实例:编写一函数add求两个数的和,这两个数用位置参数传入,最后输出结果. root@ubuntu:/home/study# vi test3 #!/bin/bash add(){ a=$1; b=$2; z=`expr $a + $b`; echo "The sum is $z&

  • 利用Python+Java调用Shell脚本时的死锁陷阱详解

    前言 最近有一项需求,要定时判断任务执行条件是否满足并触发 Spark 任务,平时编写 Spark 任务时都是封装为一个 Jar 包,然后采用 Shell 脚本形式传入所需参数执行,考虑到本次判断条件逻辑复杂,只用 Shell 脚本完成不利于开发测试,所以调研使用了 Python 和 Java 分别调用 Spark 脚本的方法. 使用版本为 Python 3.6.4 及 JDK 8 Python 主要使用 subprocess 库.Python 的 API 变动比较频繁,在 3.5 之后新增了

  • shell脚本之sed详细用法详解

    目录 sed的作用 sed使用方法介绍 命令行格式 举例说明 对文件进行增.删.改.查操作 增加文件内容 对文件进行搜索替换操作 其他命令 其他选项 sed结合正则使用 补充扩展总结 总结 sed的作用 sed是Stream Editor(流编辑器)的缩写,简称流编辑器:用来处理文件的 sed是一行一行读取文件内容并按照要求进行处理,把处理后的结果输出到屏幕 首先sed读取文件中的一行内容,把其保存在一个临时缓存区中(也称为模式空间) 然后根据需求处理临时缓冲区中的行,完成后把该行发送到屏幕上

  • 如何通过shell脚本自动生成vue文件详解

    前言 最近在写nuxt项目时候每次新建页面都要去新建然后引入各种需要的依赖很是麻烦,所以想写一个脚本自动生成文件 省去手动新建 现写下实现方法 给大家参考 Mac下可直接运行 Windows下需要安装Cygwin类软件且配置环境变量后运行 使用方法 1.需要修改package.json 的scrpts 加一条create 或者自定义名字 主要是为了我们在terminal中输入指令后运行对应的脚本 package.json 2.在项目根目录新建一个template文件夹放自己的模板文件 文件内容根

  • linux shell脚本学习xargs命令使用详解

    xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据.xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代. xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子. 1.

  • Linux文本处理工具使用详解

    1.统计出/etc/passwd文件中其默认shell为非/sbin/nologin的用户个数,并将用户都显示出来 grep是一个文本工具,是通过一行一行来匹配文本进行处理的: 通过grep命令,借助-v参数显示不匹配的行: getent passwd | grep -Ev /sbin/nologin$ 2.查出用户UID最大值的用户名.UID及shell类型 Sort用于排序,添加特定的参数可以根据不同需求排序: head 用户取前几行的: cut 是用于取特定列的: sort -k3 -t"

  • python开发的自动化运维工具ansible详解

    目录 ansible 简介 ansible 是什么? ansible 特点 ansible 架构图 ansible 任务执行 ansible 任务执行模式 ansible 执行流程 ansible 命令执行过程 ansible 配置详解 ansible 安装方式 使用 pip(python的包管理模块)安装 使用 yum 安装 ansible 程序结构 ansible配置文件查找顺序 ansible配置文件 ansuble主机清单 ansible 常用命令 ansible 命令集 ansible

  • PHP调试及性能分析工具Xdebug详解

    程序开发过程中,一般用得最多的调试方法就是用echo.print_r().var_dump().printf()等将语句打印出来.对PHP脚本的执行效率,通常是脚本执行时间.对数据库SQL的效率,通常是数据库Query时间,但这样并不能真正定位和分析脚本执行和数据库查询的瓶颈所在?对此,有一个叫Xdebug(www.xdebug.org)的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况. 一.以windows平台对此模块的安装做简单的介绍: 1. 下载PH

  • Bootstrap 响应式实用工具实例详解

    Bootstrap 提供了一些辅助类,以便更快地实现对移动设备友好的开发.这些可以通过媒体查询结合大型.小型和中型设备,实现内容对设备的显示和隐藏. 需要谨慎使用这些工具,避免在同一个站点创建完全不同的版本.响应式实用工具目前只适用于块和表切换. 实例 下面的实例演示了上面所列举的帮助器类的用法.调整浏览器的窗口大小,或者在不同的设备上加载实例,测试响应式实用工具类. <div class="container" style="padding: 40px;"&

随机推荐