0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文剖析隐藏shell脚本内容的工具shc

开关电源芯片 来源:Linux开发那些事儿 作者:LinuxThings 2021-08-14 10:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

从事 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,结果如下:

72f8698a-fc4d-11eb-9bcf-12bb97331649.png

脚本对外提供 valid_passwd、 max_num、 login、 ver 这四个接口,脚本中已经注明了每个接口的作用,使用方法是 。/func.bin 接口名 接口参数列表,下面的两个实例说明了如何使用脚本

实例1

分别执行 。/func.bin ver 和 。/func.sh ver 命令,结果如下

7322ba6e-fc4d-11eb-9bcf-12bb97331649.png

从上图可以看出,无论是用脚本还是二进制,最终的结果都是一样的

实例2

执行 。/func.bin login 命令,结果如下

73405d44-fc4d-11eb-9bcf-12bb97331649.png

当传入 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 命令进行测试,结果如下

735acddc-fc4d-11eb-9bcf-12bb97331649.png

从上图可以看出,脚本设置过期时间之后,再次执行脚本会提示已经过期了

如何引用二进制脚本

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 命令,结果如下

7378843a-fc4d-11eb-9bcf-12bb97331649.png

从上图可以看出,test_func.sh 脚本分别调用了二进制文件 fun.bin 中的 valid_passwd、max_num、 ver 函数,根据 func.sh 脚本内容,可以确定结果输出都是正确的

从这个实例可以得出,普通脚本也可以正常使用二进制的脚本

安全性

shc 使用的加密类型是叫做 RC4流密码的一个变体,目前它已经被证实存在弱点,存在被破解的可能, 尤其在 shc 中,密钥被携带到加密脚本本身中,所以,是存在 通过反汇编破解出密钥,进而通过密钥还原原始脚本的可能性

因此,我们不应该依赖 shc 加密的安全性,而是更多的把它当作是shell脚本内容的隐藏或者混淆工具

小结

本文主要介绍了隐藏shell脚本内容的工具 shc, 虽然它加密的安全性不高,但是我们平常可以把它作为一个shell脚本代码隐藏和混淆工具来使用,也能达到我们的目的, 更多关于 shc 的相关知识请参考网上其他资料

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4423

    浏览量

    68064
  • RC4
    RC4
    +关注

    关注

    0

    文章

    4

    浏览量

    7442
  • 脚本
    +关注

    关注

    1

    文章

    414

    浏览量

    29320

原文标题:如何隐藏 shell 脚本内容

文章出处:【微信号:gh_3980db2283cd,微信公众号:开关电源芯片】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux Shell文本处理神器合集:15个工具+实战例子,效率直接翻倍

    在 Linux 系统中,文本是数据交互的 “通用语言”—— 日志文件、配置文件、数据报表、程序输出几乎都以文本形式存在。手动编辑文本不仅繁琐,还容易出错,而掌握 Shell 文本处理工具,能让你用几行命令完成批量筛选、数据提取、统计分析,甚至复杂的文本清洗。
    的头像 发表于 02-03 15:42 3323次阅读
    Linux <b class='flag-5'>Shell</b>文本处理神器合集:15个<b class='flag-5'>工具</b>+实战例子,效率直接翻倍

    m脚本太长,有什么办法个m脚本包含另外个呀

    m脚本太长,有什么办法个m脚本包含另外个呀
    发表于 01-22 13:48

    【EASY EAI Nano-TB(RV1126B)开发板试用】命令行功能测试-shell脚本进行IO控制-红绿灯项目-实现开机起动

    0接上文【EASY EAI Nano-TB(RV1126B)开发板试用】命令行功能测试-shell脚本进行IO控制-红绿灯项目 Linux 起动系统下 init 系统大多数 Linux 发行版
    发表于 11-03 17:25

    【EASY EAI Nano-TB(RV1126B)开发板试用】命令行功能测试-shell脚本进行IO控制-红绿灯按钮项目

    0接上文【EASY EAI Nano-TB(RV1126B)开发板试用】命令行功能测试-shell脚本进行IO控制-红绿灯项目-实现开机起动 EASYEAINano-TB(RV1126B)是款专为
    发表于 11-03 10:00

    关于系统链接脚本的介绍

    、队伍介绍 本篇为蜂鸟E203系列分享第四篇,本篇介绍的内容是系统链接脚本。 二、如何实现不同的下载模式? 实现三种不同的程序运行方式,可通过makefile的命令行指定不同的链接脚本
    发表于 10-30 08:26

    【技术分享】正确编写SysV Init脚本以实现Systemd兼容(上)

    嵌入式的ubuntu系统如何写好SysVInit脚本呢?与system服务又有什么差别呢?起随着文章来探究吧。问题背景许多传统Linux服务仍使用SysVInit脚本(/etc/init.d
    的头像 发表于 10-28 11:45 935次阅读
    【技术分享】正确编写SysV Init<b class='flag-5'>脚本</b>以实现Systemd兼容(上)

    shell基本介绍及常用命令之shell基本介绍

    执行结果呈现给用户;同时Shell也是种解释性的编程语言或者脚本语言,开发容易可以在短时间内完成功能强大又好用的脚本,可以在不同的系统上移植非常方便。
    发表于 09-28 09:05

    LuatOS脚本开发入门:嵌入式运行框架全解析!

    想搞懂LuatOS如何运行Lua脚本?本文深入剖析其嵌入式运行框架,涵盖虚拟机加载、任务协程、系统初始化等关键环节,适合初学者。 、LuatOS 编程起步 1.1 底层固件怎么启动 LuatOS
    的头像 发表于 09-26 17:45 725次阅读
    LuatOS<b class='flag-5'>脚本</b>开发入门:嵌入式运行框架全解析!

    嵌入式开发新选择:LuatOS脚本框架入门教程

    LuatOS正成为嵌入式开发的新趋势!本教程带你从基础入手,全面了解其基于Lua的脚本开发模式与轻量级运行框架。 、LuatOS 编程起步 1.1 底层固件怎么启动 LuatOS 脚本
    的头像 发表于 09-26 17:34 864次阅读
    嵌入式开发新选择:LuatOS<b class='flag-5'>脚本</b>框架入门教程

    CubeMX移植RT-Thread 3.1.5件重复怎么解决?

    CubeMX6.7.0内移植RT-Thread Nano3.1.5件重复,主要是两个部分 1、 和 两个地方重复rtconfig.h 2、shell相关的文件也会重复 和 请问下各位有没有办法可以解决这个问题的?
    发表于 09-24 07:11

    ALM(应用生命周期管理)解析:了解其概念、关键阶段及Perforce ALM工具推荐

    什么是ALM(应用生命周期管理)?它远不止是SDLC!了解其概念、关键阶段以及如何借助Perforce ALM这类工具,实现端到端的可追溯性、加速发布并保障合规性。
    的头像 发表于 09-19 11:03 2315次阅读
    ALM(应用生命周期管理)解析:<b class='flag-5'>一</b><b class='flag-5'>文</b>了解其概念、关键阶段及Perforce ALM<b class='flag-5'>工具</b>推荐

    Dirsearch 安全实战指南

    挖掘 Web 隐藏资源的核心工具。本文从实战角度,讲解其核心原理、使用技巧、扫描策略及合规要点。   隐藏资源探测的核心价值   Web 服务器中,
    的头像 发表于 09-02 10:31 1013次阅读

    【RA-Eco-RA6M4开发板评测】移植shell实现命令交互

    代码见 . 前言前面我们实现了标准输入输出,为了进步方便交互调试,我们继续来实现个精简的shellShell的实现参考https:
    发表于 07-19 22:47

    3500W 与6000W 高档开关电源的剖析

    :功率因数校正;Buck-Boost 变换器;分段式控制 获取完整文档资料可下载附件哦!!!!如果内容有帮助可以关注、点赞、评论支持下哦~
    发表于 06-04 17:10

    Shell脚本入门指南

    Shell块包裹着系统核心的壳,处于操作系统的最外层,与用户直接对话,把用户的输入, 解释给操作系统,然后处理操作系统的输出结果,输出到屏幕给与用户看到结果。
    的头像 发表于 06-03 10:47 1493次阅读
    <b class='flag-5'>Shell</b><b class='flag-5'>脚本</b>入门指南