Skip to content

Commit 18ef456

Browse files
committed
add 2026-08-07-shc-vs-himitsushell.md
1 parent 4a3de23 commit 18ef456

14 files changed

Lines changed: 95 additions & 6 deletions

File tree

‎_posts/2026-08-07-hello.md‎

Lines changed: 0 additions & 6 deletions
This file was deleted.
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
---
2+
layout: post
3+
title: "Shell 脚本保护工具对比:shc vs HimitsuShell"
4+
---
5+
6+
[shc](https://github.com/neurobin/shc/tree/master)(Shell 脚本编译器)是一款将 Shell 脚本转换为二进制文件、防止代码泄露的工具。但在实际使用中存在以下局限性。
7+
- 不提供混淆功能,容易受到逆向工程的攻击。
8+
- 依赖系统 Shell(如 /bin/sh),容易受到日志记录/挂钩(hooking)攻击。
9+
10+
[HimitsuShell](https://github.com/HimitsuShell/HimitsuShell) 正是为弥补这些不足而开发的。它应用了基于 llvm 的多种混淆技术,并且不依赖系统 Shell。
11+
12+
下面按项目逐一进行对比。
13+
14+
## 测试环境
15+
在 ubuntu 24.04 环境下使用以下 Shell 脚本。
16+
17+
![测试用 Shell 脚本](/assets/images/shc-vs-himitsushell/1.png)
18+
19+
HimitsuShell 使用默认选项,[shc 则按照以下方式,以最高安全强度进行测试](https://github.com/neurobin/shc/blob/master/man.md)。
20+
21+
```shell
22+
shc -Uf launcher.sh -o shc_binary
23+
```
24+
25+
如下所示,HimitsuShell 和 shc 生成的二进制文件均能正常运行。
26+
27+
![二进制文件运行检测](/assets/images/shc-vs-himitsushell/2.png)
28+
29+
30+
## 移除调试符号
31+
![调试符号检测](/assets/images/shc-vs-himitsushell/3.png)
32+
33+
HimitsuShell 和 shc 都移除了调试符号。
34+
35+
## 动态库挂钩防护
36+
![动态库检测](/assets/images/shc-vs-himitsushell/4.png)
37+
38+
HimitsuShell 不依赖动态库,而 shc 则依赖动态库。
39+
因此 shc 容易受到挂钩攻击。
40+
41+
## 调试器检测
42+
![调试器检测 1](/assets/images/shc-vs-himitsushell/5.png)
43+
44+
![调试器检测 2](/assets/images/shc-vs-himitsushell/6.png)
45+
46+
HimitsuShell 和 shc 都能检测并阻止调试器(如 gdb、strace 等)。
47+
48+
## 字符串、常量混淆
49+
![字符串、常量混淆检测 1](/assets/images/shc-vs-himitsushell/7.png)
50+
51+
![字符串、常量混淆检测 2](/assets/images/shc-vs-himitsushell/8.png)
52+
53+
在 Ghidra 中提取字符串列表可以清楚地看出两者的差异。
54+
HimitsuShell 对字符串进行了混淆处理,而 shc 生成的二进制文件中,敏感字符串则原样暴露。
55+
此外,HimitsuShell 提供常量混淆功能,而 shc 并不提供。
56+
57+
## 高级混淆(控制流平坦化、虚假代码插入等)
58+
![高级混淆检测 1](/assets/images/shc-vs-himitsushell/9.png)
59+
60+
![高级混淆检测 2](/assets/images/shc-vs-himitsushell/10.png)
61+
62+
在 Ghidra 中查看 main 函数的控制流图,差异一目了然。
63+
HimitsuShell 经过混淆处理后,控制流几乎无法被识别。
64+
相反,shc 的控制流较为简单,容易被分析。
65+
66+
## 操作系统层面的日志记录/挂钩
67+
![日志记录、挂钩检测 1](/assets/images/shc-vs-himitsushell/11.png)
68+
69+
使用 auditd 监控 shc 生成的二进制文件的系统调用(如 execve)时,Shell 脚本会被原样记录下来。
70+
由于其结构依赖系统 Shell,因此容易受到操作系统层面的日志记录/挂钩攻击。
71+
72+
![日志记录、挂钩检测 2](/assets/images/shc-vs-himitsushell/12.png)
73+
74+
相反,在相同条件下,HimitsuShell 生成的二进制文件不会记录 Shell 脚本。
75+
这是因为它不依赖系统 Shell,而是使用内置在二进制文件中的 Shell。
76+
77+
## 结论
78+
由此可见,shc 和 HimitsuShell 在安全强度上存在明显差异。
79+
80+
| |shc|HimitsuShell|
81+
|---|---|---|
82+
|移除调试符号|O|O|
83+
|动态库挂钩防护|X|O|
84+
|调试器检测|O|O|
85+
|字符串、常量混淆|X|O|
86+
|高级混淆(控制流平坦化、虚假代码插入等)|X|O|
87+
|操作系统层面日志记录/挂钩防护|X|O|
88+
89+
## 补充对比
90+
还有一个对 shc 进行改进的项目,叫 [ssc](https://github.com/liberize/ssc)。
91+
它弥补了部分问题(动态库挂钩防护、字符串混淆),但在高级混淆和操作系统层面的日志记录/挂钩防护方面仍存在局限性。
92+
93+
**尤其是 ssc 虽然不依赖系统 Shell,但运行时会将解释器(如 /bin/sh 等)提取到 /tmp/ssc/XXXXXX 路径下,并通过它传递 Shell 脚本。因此,只要对该路径进行日志记录/挂钩,就有可能窃取 Shell 脚本。**
94+
95+
相比之下,HimitsuShell 不会将解释器提取到二进制文件之外,因此更为安全。
4.13 KB
Loading
36.2 KB
Loading
10.9 KB
Loading
99.1 KB
Loading
3.01 KB
Loading
2.23 KB
Loading
5.8 KB
Loading
4.73 KB
Loading

0 commit comments

Comments
 (0)