如何缩小/混淆bash脚本

时间:2012-03-28 12:10:27

标签: bash shell obfuscation minify

当然,bash文件无法真正模糊,并且始终可读。而且我不想将它们包装在一些二进制包中。 重命名局部变量并不值得。

但是有一个可靠的简单bash混淆器或minifier,至少删除所有的缩进,所有空行和所有空格而不破坏任何东西?特别是评论并注释掉了可能包含敏感文档或信息的脚本部分?

我会害怕简单的grep / sed-lines这样做,因为当然不能修改“HEREDOCs”,因此需要进行一些真正的解析。

也许有一个工具可以做到这一点,这太棒了!

7 个答案:

答案 0 :(得分:27)

:这里的P很有趣。

说你的脚本名为origin,而混淆的脚本名为obsf

这里是origin

#!/bin/sh
echo "fooo"

这里是obsf

$ echo "echo $(base64 origin)" > obsf
$ cat obsf
echo IyEvYmluL3NoCmVjaG8gImZvb28iCg==
$ chmod +x obsf

现在rm origin并像这样运行obsf

$ sh obsf | base64 -d | sh
fooo
嘿:3

答案 1 :(得分:8)

这是我为bash脚本缩小创建的工具:https://github.com/precious/bash_minifier - 它尝试删除所有注释以及尽可能多的空格/制表符/换行符。它也可以作为服务https://bash-minifier.appspot.com/使用。

要缩小bash脚本,请运行以下命令:

python minifier.py /path/to/shell/script.sh

答案 2 :(得分:7)

即使这是一个老问题,它似乎在Google上很受欢迎。我也在寻找一个bash minifer / obfuscator,并且不喜欢答案中的那个。

我也不想添加乱码或编译脚本。所以我写了一个在Perl中做了我想要的东西,并把它放在https://github.com/Aralhach/bashobfus/tree/master的GitHub上
它可以:

  • 压扁缩进
  • 删除全行注释(初始hashbang(#!)除外)和空行
  • 重命名基本声明中的所有小写变量(以避免重命名像PATH这样的变量),for循环,数组访问和'read'语句。

可能存在某些失败的情况,但我使用相当大的bash脚本对其进行了测试,并列出了列出的变量替换案例。它还仅在单引号(')中留下变量 - 在打印AWK脚本时弹出 - 但在单引号(')之间替换语句已经在双引号(“) - 内部,当打印MySQL语句时弹出

这让我觉得我已经涵盖了所有大用途,但之前我错了。如果您发现任何错误,请随时报告(或修复它们!:D)。我还在考虑添加一个功能,将短线连接成一个带有“;”的线路。但在截止日期前,案件分析太多了。

我希望人们觉得它很有用!

答案 3 :(得分:2)

混淆shell脚本的工具: http://www.comp.eonworks.com/scripts/obfuscate_shell_script-20011012.html

要做些傻事,但这取决于你。还有一些方法可以将shell脚本“编译”为可执行文件。这个post's接受的答案提供了几个与工具相关的链接。

答案 4 :(得分:2)

原始文件script.sh

#!/usr/bin/env bash
echo "foo"

创建other.sh

$ echo '#!/usr/bin/env bash' > other.sh
$ echo "echo '$(base64 script.sh)' | base64 -d | sh" >> other.sh
$ chmod +x other.sh

结果(cat other.sh):

#!/usr/bin/env bash
echo 'IyEvdXNyL2Jpbi9lbnYgYmFzaAplY2hvICJmb28iCg==' | base64 -d | sh

尝试:

$ ./other.sh
foo

答案 5 :(得分:1)

shell脚本的缩小和混淆是两回事。

缩小意味着通过从源代码中删除所有不必要的字符而不更改其功能来减小脚本的大小。另一方面,混淆意味着使脚本难以阅读(如果不是不可能的话)。

<强>微小:

要缩小大脚本,可以针对要缩小的实际脚本运行以下代码:

#!/bin/sh
Script=${1}
if [ ! -z "${Script}" ] && [ -f ${Script} ] ; then
        CurrenTime=$(date | sed -e 's~ ~_~g' -e 's~:~~g')
        cp ${Script} ${Script}_${CurrenTime}
        #### Remove all empty lines
        #### Remove lines that begin with spaces and a comment sign #
        #### Remove all comment lines (meaning, lines that begin with a "#")
        awk '
                (/.*/ || /#!/) && (!/^#$/) &&
                (!/^#[[:blank:]]/) && (!/^#[a-z]/) && 
                (!/^#[A-Z]/) && (!/^##/) &&
                (!/^\t#/) && (!/^[[:space:]]*$/) &&
                ( /^#.*!/ || !/^[[:space:]]*#/)
        ' ${Script} | sed 's_^[[:space:]]*__g' > ${Script}.tmp 2>/dev/null
        #' ${Script} > ${Script}.tmp 2>/dev/null (comment out the above line and uncomment this line if your HEREDOCS are affected)
        ExitCode=$?
        if [ ${ExitCode} -eq 0 ] && [ -s ${Script}.tmp ] ; then
                echo
                echo "SUCCESS: Your newly [ minified ] script can be found here [ ${Script}.tmp ]."
                echo "Review the script [ ${Script}.tmp ] and if happy with it, replace your original script with it!"
                echo "NOTE: Your original script [ ${Script} ] was backed up as [ ${Script}_${CurrenTime} ]!"
                echo
                exit 0
        else
                echo
                echo "FAILURE: Unable to [ minify ] the specified script [ ${Script} ]!!!"
                echo
                exit 2
        fi
else
        echo
        echo "USAGE: ${0}  <your-script>"
        echo
        exit 3
fi

请注意,只有在缩小的脚本很大的情况下,缩小才会产生差异......有几百甚至几千行。我可以使用上面的代码从脚本中删除几兆字节。

<强>模糊处理:

在完成上述缩小之后,如果缩小尺寸是你想要的,你就可以在那里停下来。但是,如果在缩小之后,您也希望对您的脚本进行模糊处理,那么您可以选择。

混淆脚本的最简单方法是使用加密工具,例如Openssl。

To encrypt your script using Openssl:

    1. cat <your-script> | openssl aes-128-cbc -a -salt -k "specify-a-password" > yourscript.enc

    OR

    2. openssl aes-128-cbc -a-salt -in <path-to-your-script> -k "yourpassword"

To decrypt a script using Openssl (notice the '-d'):

    1. cat yourscript.enc | openssl aes-128-cbc -a -d -salt -k "specify-a-password" > yourscript.dec

    OR

    2. openssl aes-128-cbc -a -d -salt -in <path-to-your-script> -k "yourpassword" > yourscript.dec

<强>加密/模糊处理:

  1. 如果您的最终目标是让其他人难以阅读您的脚本,请尝试pasting it here为您生成加密副本。
  2. 如果您改变了对SHC的看法,最新版本可以是downloaded here

答案 6 :(得分:-1)

基于c00kiemon5ter的想法,这里有脚本

你扭曲的递归思想会喜欢它,因为这不是原始剧本,而是混淆(混淆(原始))

#!/bin/bash
#
# Usage:
#     obfuscate scrript.sh > script_obfuscated.sh
#
PIXIE=$(mktemp)
base64 -d  >${PIXIE}<<DIXIE
IyEvYmluL2Jhc2ggClBJWElFPSQobWt0ZW1wKQpiYXNlNjQgLWQgID4ke1BJWElFfTw8RElYSUUK
SXlFdlltbHVMMkpoYzJnS2FXWWdXeUFnTFdZZ0lpUXhJaUJkSUFwMGFHVnVDbU5oZENBOFBGQkpX
RWxGSUFvaklTOWlhVzR2WW1GegphQ0FLVUVsWVNVVTlYQ1FvYld0MFpXMXdLUXBpWVhObE5qUWdM
V1FnSUQ1Y0pIdFFTVmhKUlgwOFBFUkpXRWxGQ2lRb1ltRnpaVFkwCklDUXhLUXBFU1ZoSlJRcHpi
M1Z5WTJVZ1hDUjdVRWxZU1VWOUNuSnRJQzF5WmlCY0pIdFFTVmhKUlgwS1VFbFlTVVVLWlhocGRD
QXcKQ21acENtTmhkRHc4VGtWU1JBb2dJQ0IxYzJGblpUb2diMkoxYzJOaGRHVWdjMk55YVhCMENn
b2dJQ0JYYVd4c0lHZGxibVZ5WVhSbApJQ0p6WTNKcGNIUXViMkp6YUNJS1RrVlNSQW89CkRJWElF
CnNvdXJjZSAke1BJWElFfQpybSAtcmYgJHtQSVhJRX0K
DIXIE
source ${PIXIE}
rm -rf ${PIXIE}