LEDE中的Bash外壳混淆器

时间:2018-09-27 08:44:38

标签: bash

我正在寻找一个bash shell脚本混淆器,并找到了它,但是我想知道如何使它适应我的脚本,以便它对我也能正常工作

https://github.com/ActiveState/code/tree/master/recipes/Bash/578986_Obfuscation_In_Bash_Shell

如何使其运行,以便获得加密的代码?抱歉,我仅从论坛上学习了基本的bash,并且我的知识有限

非常感谢

1 个答案:

答案 0 :(得分:2)

  

如何使其运行

链接回购的作者未提供任何自动混淆脚本的方法。您必须自己做,但我不建议您这样做。

混淆概念

您的链接混淆方法将每个字符替换为包含该字符的变量。这样,将构建一个与原始命令相等的字符串。然后,将所述字符串传递到eval。示例:

cmd a "b c"

变成类似

Ba=a; Bb=b; Bc=c; Bm=m; Bd=d; Cs=' '; Cq='"'
eval $Bc$Bm$Bd$Cs$Ba$Cs$Cq$Bb$Cs$Bc$Cq

为什么链接混淆不好?

  • 撤消非常容易。将所有eval替换为printf '%s\n',然后运行脚本。该脚本将打印其原始源代码。
  • 您必须确保脚本和混淆方法之间没有变量名冲突。
  • 编写混淆器时,您必须想出一种方法来混淆更高级的构造。例如,跨越多行 的循环不能拆分成多个eval。您必须进行预处理。可以使用;替换换行符,也可以使用heredoc <<END

替代

混淆只是一个障碍,而永远不会完全阻止某人理解或修改混淆后的代码。我强烈建议您不要混淆。但是,如果您感觉更好,可以使用以下方法。

您可以压缩脚本A并将压缩后的版本嵌入另一个脚本B中。在执行B时,它将解压缩并执行A。从安全角度而言,此方法与链接的混淆方法一样糟糕。压缩很容易撤消。但是,没有名称冲突和预处理之类的缺点。此外,混淆的脚本似乎是二进制文件,可能会阻止某些编辑器打开它们。

以下是使用gzip压缩混淆bash脚本的脚本:

obfuscate.sh:

#! /bin/bash
loader='#! /bin/bash
source <(gzip -c -d <(tail -n+"$((LINENO + 2))" "$BASH_SOURCE"));
status="$?"; return "$status" 2> /dev/null || exit "$status"
'
for original; do
        obfuscated="$original-obfuscated.sh"
        gzip -c "$original" | cat <(printf %s "$loader") - > "$obfuscated"
        chmod u+x "$obfuscated"
done

用法./obfuscate.sh myScript.sh在当前目录中创建混淆的脚本myScript.sh-obfuscated.sh

如果目标系统不支持进程替换<( ),则可以使用以下替代版本。

#! /bin/bash
loader='#! /bin/bash
tail -n+"$((LINENO + 2))" "$BASH_SOURCE" | gzip -c -d | source /dev/stdin;
status="$?"; return "$status" 2> /dev/null || exit "$status"
'
for original; do
        obfuscated="$original-obfuscated.sh"
        printf %s "$loader" > "$obfuscated"
        gzip -c "$original" >> "$obfuscated"
        chmod u+x "$obfuscated"
done

如果目标系统具有bash >4.0/dev/stdin,这应该可以工作。如果不满足这些要求,请用| source /dev/stdin替换bash -s - "$@"。这样做的唯一缺点是,无法再获取(. script.shsource script.sh)这个经过混淆的脚本。