This repository has been archived on 2023-11-13. You can view files and clone it, but cannot push or open issues or pull requests.
blog/_posts/2022-04-11-shc.md
2023-06-03 15:58:09 +08:00

81 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
layout : post
title : "SHell脚本加密"
subtitle : "Open source? That depends..."
date : 2022-04-11 20:57:40
author : "Manford Fan"
catalog : false
header-img : "img/post-bg-universe.jpg"
tags :
- Shell
- Encryption
---
有人说Shell时最简单的编程语言之一我认为这里有个预设那就是对Linux操作系统有一定的认识。如果说Linux是一块上好的木材我愿称Shell为雕刻这块木材必备的利刃它几乎和是操作系统融为一体的。虽然Shell是一种解释型语言执行速度相对于CC++等这些编译型语言慢很多更不用提汇编也没有精巧的数据结构无法完成复杂算法的实现而且程序稍微一长就让人很容易迷惑。尽管Shell有很多缺点但是每一种语言都有其适用的领域[ABS](https://tldp.org/LDP/abs/html/index.html)中详细的阐述了什么时候不适合用Shell以及什么时候适合。Shell的语法简单调试容易需要掌握技巧能很快的实现较为简单稍微复杂的也可以的任务。
由于Shell是一种解释型语言这个特性就注定它的源码是公开的可是有时候我们编写的脚本中包含一些密码给别人用的同时不想透露给别人其中的私密信息。这个时候就需要对Shell脚本进行加密。[SHC](http://www.datsi.fi.upm.es/~frosal/sources/)工具能很好地完成这一加密工作它是由西班牙的Francisco Javier Rosales García先生编写的能满足绝大多数使用场景但是正如在工具简介中不止一次的说"Use with care""CHECK YOUR RESULTS CAREFULLY BEFORE USING"而且也给出了到目前为止发现的一个bug。所以最好只是用于私人环境生产环境还是要谨慎使用。
## 1. 编译安装SHC
`shc`工具的原理是讲Shell脚本解释称C语言源码然后通过编译C语言源码得到二进制文件。加密完成后生成了两个文件一个是.x文件是一个二进制可执行文件名称可以任意修改另一个是.x.c文件是C语言的源码文件可以删除。编译过程如下`make`之后目录下会有一个`shc`可执行文件,执行`./shc -h`即可看到帮助信息。
```bash
wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9b.tgz
tar -xzf shc-3.8.9b.tgz
cd shc-3.8.9b
make
```
----
通过编译实验发现源码安装的可执行文件加密Shell脚本后不能得到正确的输出最后偶然发现可以通过软件包管理工具直接安装——`apt/yum install shc`,🙃🙃,行吧。
## 2. SHC用法介绍
#### 语法规范
```bash
shc [ -e date ] [ -m addr ] [ -i iopt ] [ -x cmnd ] [ -l lopt ] [ -o outfile ] [ -ABCDhUv ] -f script
```
#### 命令选项
|选项|功能|
|:-|:-|
|-e <ins>date</ins>|指定过期时间,格式是**dd/mm/yyyy**|
|-m <ins>message</ins>|当过期时展示的消息提示,默认是"Please contact your provider"|
|-f <ins>script file</ins>|要加密的脚本文件|
|-i <ins>inline option</ins>|shell编译器指定的内联选项|
|-x <ins>command</ins>|eXec command, as a printf format i.e: exec(\\'%s\\',@ARGV);|
|-l <ins>last option</ins>|Last shell option i.e: --|
|-o <ins>outfile</ins>|指定输出文件名|
|-r|使用宽松的安全策略生成一个可重新分发的二进制文件不能跨平台但可以运行在本版相差不大的Linux上|
|-v|显示详细的编译过程|
|-D|Switch on debug exec calls|
|-U|Make binary to be untraceable (using strace, ptrace, truss, etc.)|
|-B|Compile for BusyBox|
## 3. 示例展示
```bash
[ 0 root@aliyun ~]# cat > test.sh << EOF
> #!/bin/bash
> passcode='123457asdf'
> echo -n \$passcode | md5sum | awk '{print \$1}'
> EOF
[ 0 root@aliyun ~]# bash test.sh
7c2dd6ea4593cea88b2a4dae1a581e1b
[ 0 root@aliyun ~]# shc -r -U -f test.sh -o gen_md5
[ 0 root@aliyun ~]# ls
gen_md5 test.sh test.sh.x.c
[ 0 root@aliyun ~]# ./gen_md5
7c2dd6ea4593cea88b2a4dae1a581e1b
```
## 4. 安全性
安全相关方面,主要担心两个问题:一个就是指定过期时间之后,用户手动调整系统时间,导致加密程序误以为当前时间未过期,从而能继续使用;另一个是加密程序是否足够安全,如非对称加密一般,理论上可破解,但实际上无法做到?
针对第一个问题可以在编写的脚本中调用第三方工具重新设定系统时间为正确的时间或者直接获取网络当前时间针对第二个问题GitHub上确实有对应的[unshc](https://github.com/yanncam/UnSHc)破解程序但是作者也坦言高版本的shc程序改变了程序架构并使用了内核相关的安全机制使得当前的破解程序无法正常的工作另外即使再完美的加密程序只要技术能力足够都是能够被破解的所以最重要的还是写好自己的shell程序任何防控措施都是只防好人不防坏人。