侵权投诉

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

开关电源芯片 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

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

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

收藏 人收藏
分享:

评论

相关推荐

怎样用printf 函数和getchar 函数去简化STM32串口数据的传输呢

printf 函数和getchar 函数有何功能? 怎样用printf 函数和getchar 函数去简化STM32串口数据的传输呢? ...
发表于 10-22 07:49 0次 阅读

怎样去设计一种基于单片机的智能窗帘呢

怎样去设计一种基于单片机的智能窗帘呢?怎样去编写其主函数代码呢?...
发表于 10-22 07:29 0次 阅读

怎样去修改arm下的mac地址呢

怎样去修改arm下的mac地址呢? 怎样去修改arm下的ip地址呢? ...
发表于 10-22 06:39 0次 阅读

详细介绍go语言中的闭包的实现

什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关....
的头像 马哥Linux运维 发表于 10-20 16:18 223次 阅读

简述Python加速运行小窍门

Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,....
的头像 Linux爱好者 发表于 10-20 15:28 590次 阅读

简述ElasticSearch的实现

1.近实时搜索 1.1 实时与近实时 实时搜索(Real-time Search)很好理解,对于一个....
的头像 马哥Linux运维 发表于 10-20 14:45 235次 阅读

Python协程与JavaScript协程的对比及经验技巧

前言以前没怎么接触前端,对 JavaScript 的异步操作不了解,现在有了点了解。一查发现 Pyt....
的头像 马哥Linux运维 发表于 10-20 14:30 168次 阅读

简述图像梯度的基本原理

当用均值滤波器降低图像噪声的时候,会带来图像模糊的副作用。我们当然希望看到的是清晰图像。那么,清晰图....
的头像 新机器视觉 发表于 10-19 16:22 153次 阅读
简述图像梯度的基本原理

一文了解Cortex-M中断向量表对齐原则

来源 | 痞子衡嵌入式 一、Cortex-M中断向量表对齐原则   中断向量表就是一个集中保存系统全....
的头像 strongerHuang 发表于 10-19 11:06 222次 阅读
一文了解Cortex-M中断向量表对齐原则

有什么方法可以实现时间戳转日期的算法呢

有什么方法可以实现时间戳转日期的算法呢?怎样去实现时间戳转日期的算法呢? ...
发表于 10-19 09:23 0次 阅读

STM32F407ZG串口配置有哪些步骤

STM32F407ZG串口操作相关库函数是什么? STM32F407ZG串口配置有哪些步骤?...
发表于 10-19 08:14 0次 阅读

中断优先级配置的函数有哪几种

中断优先级配置的函数有哪几种? 怎样去比较抢占优先级与响应优先级呢? ...
发表于 10-19 08:02 0次 阅读

怎样在JetSon TX2上移植Vins-Mono与RTAB-Map呢

怎样在JetSon TX2上移植Vins-Mono与RTAB-Map呢? 怎样在在JetSon TX2上去运行VINS-Mono呢? ...
发表于 10-19 07:40 0次 阅读

怎样通过循环次数计算延迟函数的延迟时间呢

单片机不同晶振怎么计算延迟时间?怎样通过循环次数计算延迟函数的延迟时间呢?有什么方法吗?...
发表于 10-19 06:08 0次 阅读

怎样去使用GOTO语句呢

什么是goto语句?为什么goto语句这么不受待见呢?...
发表于 10-18 08:35 0次 阅读

怎样去开发一种基于STM32的贪吃蛇小游戏

怎样去开发一种基于STM32的贪吃蛇小游戏?
发表于 10-18 06:42 0次 阅读

关于Python18个你不知道的高效编程技巧

初识Python语言,觉得python满足了我上学时候对编程语言的所有要求。python语言的高效编....
的头像 马哥Linux运维 发表于 10-15 11:23 266次 阅读

动态内存分配的注意事项及本质是什么

C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态....
的头像 C语言编程学习基地 发表于 10-13 15:37 274次 阅读
动态内存分配的注意事项及本质是什么

快速提高数据质量的数据清洗小技巧

原始数据中如果夹杂着大量的空格,可能会在我们筛选数据或统计时带来一定麻烦。如何去掉多余的空格,仅在字....
发表于 10-13 11:38 18次 阅读

ACL2021的跨视觉语言模态论文之跨视觉语言模态任务与方法

来自:复旦DISC 引言 本次分享我们将介绍三篇来自ACL2021的跨视觉语言模态的论文。这三篇文章....
的头像 深度学习自然语言处理 发表于 10-13 10:48 249次 阅读
ACL2021的跨视觉语言模态论文之跨视觉语言模态任务与方法

一文详解虚函数及其相关知识点

本期是C++基础语法分享的第七节,今天给大家来分享一下: (1)虚析构函数; (2)纯虚函数; (3....
的头像 C语言编程学习基地 发表于 10-13 10:14 234次 阅读

什么是MicroPython 它能做什么有什么局限

随着Python成为主流的编程语言,MicroPython在嵌入式系统领域也越来越热门起来,尤其是大....
的头像 电子森林 发表于 10-12 11:44 272次 阅读

如何在Colab中使用SQL

如今,编码测试在数据科学面试过程中几乎是标准的。 作为一名数据科学招聘经理,我发现一个20-30分钟....
的头像 智能感知与物联网技术研究所 发表于 10-12 09:39 205次 阅读
如何在Colab中使用SQL

Python的时间处理模块中处理日期与时间的全面总结

Python的时间处理模块在日常的使用中用的较多,但是使用的时候基本上都是要查资料,还是有些麻烦的,....
的头像 马哥Linux运维 发表于 10-12 09:24 225次 阅读
Python的时间处理模块中处理日期与时间的全面总结

C语言中驱动法编程的代码案例

数据压倒一切。如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明。编程的核心是数据....
的头像 硬件攻城狮 发表于 10-12 09:21 241次 阅读

一本教你怎么写出让同事无法维护的代码

‍对,你没看错,本文就是教你怎么写出让同事无法维护的代码。一、程序命名 容易输入的变量名 。比如:F....
的头像 Linux爱好者 发表于 10-11 15:45 200次 阅读

探究关于数字电路的一些基础知识

1.常用门电路图 2.逻辑代数的基本定理----化简时比较好用 反演定理:对于任意一个逻辑式 Y,若....
的头像 FPGA设计论坛 发表于 10-11 15:04 313次 阅读
探究关于数字电路的一些基础知识

开发一个鸿蒙版仿苹果计算器教程.附代码

众所周知鸿蒙 JS 框架是非常轻量级的 MVVM 模式。通过使用和 Vue2 相似的属性劫持技术实现....
的头像 HarmonyOS技术社区 发表于 10-11 14:17 258次 阅读
开发一个鸿蒙版仿苹果计算器教程.附代码

Linux内核热补丁安全隐患的探索

Linux 内核热补丁可以修复正在运行的 linux 内核,是一种维持线上稳定性不可缺少的措施,现在....
的头像 Linux阅码场 发表于 10-11 11:54 226次 阅读
Linux内核热补丁安全隐患的探索

SystemVerilog语言介绍汇总

作者:limanjihe  https://blog.csdn.net/limanjihe/arti....
的头像 FPGA之家 发表于 10-11 10:35 254次 阅读

剖析verilog2005的骚操作之对数函数

小技巧分享: verilog下取对数其实可用$clog2这个系统函数,和自己找代码里面写入funct....
的头像 玩儿转FPGA 发表于 10-09 15:29 280次 阅读
剖析verilog2005的骚操作之对数函数

C语言指针作为形参怎么改变其指向的地址

就是一个函数的输入参数是一个指针,该函数需要改变该指针指向的地址,如: 现在有一个全局数组b,现在需....
的头像 嵌入式ARM 发表于 10-09 11:54 2232次 阅读

脉冲发生器的分类及特点

脉冲发生器是用来发生信号的系统,产生所需参数的电测试信号仪器。按其信号波形分为四大类。 正弦信号发生....
的头像 ss 发表于 10-02 17:59 228次 阅读

如何用walsh码完成多用户的扩频

那么如何用walsh码完成多用户的扩频呢?用了以后效果会有哪些改变呢?这也是后续需要展示的程序以及理....
的头像 通信工程师专辑 发表于 09-30 17:17 241次 阅读

C++中的资源泄露问题

在Modern C++之前,C++无疑是个更容易写出坑的语言,无论从开发效率,和易坑性,让很多新手望....
的头像 Linux爱好者 发表于 09-30 17:03 273次 阅读

C++输入和输出的真实面目

C++输入和输出 在C++里std::cin、std::cout、std::cerr和std::en....
的头像 Android编程精选 发表于 09-29 15:22 233次 阅读

在C++中如何用虚函数实现多态

01 — C++虚函数探索 C++是一门面向对象语言,在C++里运行时多态是由虚函数和纯虚函数实现的....
的头像 Android编程精选 发表于 09-29 14:18 249次 阅读

系统调用具体是如何实现的

系统调用就是调用操作系统提供的一系列内核功能函数,因为内核总是对用户程序持不信任的态度,一些核心功能....
的头像 Linux阅码场 发表于 09-29 11:10 275次 阅读

剖析C语言中scanf函数常见问题

在写C代码时难免对一些知识点不熟悉,导致犯错,今天分享几点小知识给大家。 空白符问题        ....
的头像 STM32嵌入式开发 发表于 09-24 16:45 294次 阅读

简述物联网设备OTA软件升级之:完全升级和增量升级

各位看官好,上一篇文章我们聊了一下关于 OTA 升级过程中,新的软件包是如何从开发者的电脑上,安全的....
的头像 安芯教育科技 发表于 09-24 15:08 313次 阅读

Crypto算法库使用技巧之基于STM32 AES GCM应用提示

引言 X-CUBE-CRYPTOLIB 是基于 STM32 的 Crypto 算法库,支持对称密钥、....
的头像 STM32单片机 发表于 09-24 14:23 791次 阅读

OpenHarmony HDF传感器模型框架介绍与传感器驱动开发指导

作者介绍 刘飞虎(kevin),担任OpenHarmony社区SIG_DriverFramework....
的头像 OpenAtom OpenHarmony 发表于 09-24 11:21 313次 阅读
OpenHarmony HDF传感器模型框架介绍与传感器驱动开发指导

一篇让你看懂数字信号模拟信号

数电模电是电子信息类专业的专业基础课。但是由于比较难,所以很多人学的并不是很好,今天阿斌就来带大家先....
的头像 硬件攻城狮 发表于 09-24 10:57 4081次 阅读
一篇让你看懂数字信号模拟信号

C++中const以及this指针的使用

const 作用 修饰变量,说明该变量不可以被改变; 修饰指针,分为指向常量的指针(pointer ....
的头像 C语言编程学习基地 发表于 09-23 11:39 288次 阅读

如何在在RISCV中使用DSP指令

1.概述 DSP有相关的专业芯片,能够专门实现计算功能,相比于通用处理器,DSP芯片专门用于计算,可....
的头像 嵌入式IoT 发表于 09-22 14:28 3776次 阅读

浅析离散时间信号与系统

理论必须结合实际!因此在2018年就有了第六部分的讲解,目的就是让同学们看到学到的理论知识怎么在计算....
的头像 通信工程师专辑 发表于 09-22 11:30 844次 阅读
浅析离散时间信号与系统

51单片机的启动代码究竟里面写了什么

在我们使用kei c51创建一个51单片机项目时,会有如下图所示的提示:   keil创建新项目时,....
的头像 strongerHuang 发表于 09-22 10:15 314次 阅读
51单片机的启动代码究竟里面写了什么

介绍3种方法跨时钟域处理方法

跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者....
的头像 FPGA设计论坛 发表于 09-18 11:33 2059次 阅读
介绍3种方法跨时钟域处理方法

C语言中struct的用法有哪些

定义结构体变量       下面举一个例子来说明怎样定义结构体变量。                ....
的头像 STM32嵌入式开发 发表于 09-15 09:41 1277次 阅读

C++基础语法友元类和友元函数

本期是C++基础语法分享的第五节,今天给大家来分享一下: (1)explicit(显式)关键字; (....
的头像 C语言编程学习基地 发表于 09-12 09:52 302次 阅读

C++基础语法之inline 内联函数

上节我们分析了C++基础语法的const,static以及 this 指针,那么这节内容我们来看一下....
的头像 C语言编程学习基地 发表于 09-09 09:38 278次 阅读

如何使用C++语法中的volatile

volatile volatile int i = 10; volatile 关键字是一种类型修饰符....
的头像 C语言编程学习基地 发表于 09-09 09:38 334次 阅读

C++语法中的inline内联函数详解

上节我们分析了C++基础语法的const,static以及 this 指针,那么这节内容我们来看一下....
的头像 C语言编程学习基地 发表于 09-09 09:33 1407次 阅读

Kitronik ARCADE游戏手柄实现连连看

连连看相信大家都玩过,但这个用Kitronik AR CADE游戏手柄来玩连连看的项目你相信是一个高....
的头像 电子森林 发表于 09-08 11:47 398次 阅读
Kitronik ARCADE游戏手柄实现连连看

函数信号发生器的功能及优势

函数信号发生器是一种信号发生装置,能产生某些特定的周期性时间函数波形 ( 正弦波、方波、三角波、锯齿....
发表于 09-08 11:35 273次 阅读

Spark SQL的概念及查询方式

一、Spark SQL的概念理解 Spark SQL是spark套件中一个模板,它将数据的计算任务通....
的头像 数据分析与开发 发表于 09-02 15:44 300次 阅读
Spark SQL的概念及查询方式

你们知道指针和引用正确的使用场景吗

先解决两个疑问 ◆ 指针和引用的不同之处是什么? ◆ 何时用用指针?何时用引用? 指针和引用的不同之....
的头像 STM32嵌入式开发 发表于 09-02 14:37 306次 阅读
你们知道指针和引用正确的使用场景吗

为什么要进行单相机标定

为什么要进行单相机标定? 广义:畸变矫正和一维和二维测量 畸变矫正: 在几何光学和阴极射线管(CRT....
的头像 新机器视觉 发表于 09-02 09:45 411次 阅读

分享一个最新的的Python对象序列化方式

许多Python标准库都有一些未被赏识的精华。其中之一是允许简单优雅的基于参数类型的函数分发。这一特....
的头像 马哥Linux运维 发表于 09-01 15:19 1071次 阅读
分享一个最新的的Python对象序列化方式

shell脚本常用的调试方法介绍

shell 是用户和操作系统交互的一个程序,经常用于执行一些自动化或者重复繁琐的任务,现在所有的 L....
的头像 开关电源芯片 发表于 09-01 10:43 226次 阅读