|
| 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 | + |
| 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 | + |
| 28 | + |
| 29 | + |
| 30 | +## 移除调试符号 |
| 31 | + |
| 32 | + |
| 33 | +HimitsuShell 和 shc 都移除了调试符号。 |
| 34 | + |
| 35 | +## 动态库挂钩防护 |
| 36 | + |
| 37 | + |
| 38 | +HimitsuShell 不依赖动态库,而 shc 则依赖动态库。 |
| 39 | +因此 shc 容易受到挂钩攻击。 |
| 40 | + |
| 41 | +## 调试器检测 |
| 42 | + |
| 43 | + |
| 44 | + |
| 45 | + |
| 46 | +HimitsuShell 和 shc 都能检测并阻止调试器(如 gdb、strace 等)。 |
| 47 | + |
| 48 | +## 字符串、常量混淆 |
| 49 | + |
| 50 | + |
| 51 | + |
| 52 | + |
| 53 | +在 Ghidra 中提取字符串列表可以清楚地看出两者的差异。 |
| 54 | +HimitsuShell 对字符串进行了混淆处理,而 shc 生成的二进制文件中,敏感字符串则原样暴露。 |
| 55 | +此外,HimitsuShell 提供常量混淆功能,而 shc 并不提供。 |
| 56 | + |
| 57 | +## 高级混淆(控制流平坦化、虚假代码插入等) |
| 58 | + |
| 59 | + |
| 60 | + |
| 61 | + |
| 62 | +在 Ghidra 中查看 main 函数的控制流图,差异一目了然。 |
| 63 | +HimitsuShell 经过混淆处理后,控制流几乎无法被识别。 |
| 64 | +相反,shc 的控制流较为简单,容易被分析。 |
| 65 | + |
| 66 | +## 操作系统层面的日志记录/挂钩 |
| 67 | + |
| 68 | + |
| 69 | +使用 auditd 监控 shc 生成的二进制文件的系统调用(如 execve)时,Shell 脚本会被原样记录下来。 |
| 70 | +由于其结构依赖系统 Shell,因此容易受到操作系统层面的日志记录/挂钩攻击。 |
| 71 | + |
| 72 | + |
| 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 不会将解释器提取到二进制文件之外,因此更为安全。 |
0 commit comments