如何缩小/模糊bash脚本

如何缩小/模糊bash脚本,bash,shell,obfuscation,minify,Bash,Shell,Obfuscation,Minify,当然,bash文件不能被真正地混淆,并且总是可读的。我不想用二进制软件包来包装它们。 而重命名局部变量也不值得这么麻烦 但是,是否有一个可靠的简单bash模糊器或缩小器,它至少可以在不破坏任何内容的情况下删除所有缩进、所有空行和所有空白?尤其是脚本中可能包含敏感文档或信息的注释和注释部分 我害怕用简单的grep/sed行来做这件事,因为当然不能修改“”,所以需要一点真正的解析 也许有一个工具可以做到这一点,那将是伟大的 混淆shell脚本的工具: 这样做有点傻,但这取决于你。还有一些方法可以将

当然,bash文件不能被真正地混淆,并且总是可读的。我不想用二进制软件包来包装它们。 而重命名局部变量也不值得这么麻烦

但是,是否有一个可靠的简单bash模糊器或缩小器,它至少可以在不破坏任何内容的情况下删除所有缩进、所有空行和所有空白?尤其是脚本中可能包含敏感文档或信息的注释和注释部分

我害怕用简单的grep/sed行来做这件事,因为当然不能修改“”,所以需要一点真正的解析


也许有一个工具可以做到这一点,那将是伟大的

混淆shell脚本的工具:


这样做有点傻,但这取决于你。还有一些方法可以将shell脚本“编译”为可执行文件。这个被接受的答案提供了一些工具链接

:p这里有件有趣的事

假设您的脚本名为
origin
,而混淆的脚本名为
obsf

这里是
原点

#!/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

尽管这是一个老问题,但在谷歌上似乎很流行。我还想找一个bash minifer/obfuscator,但不喜欢答案中的那个

我也不想添加胡言乱语,也不想编译脚本。因此,我编写了一个在Perl中实现我想要的功能的程序,并将其放在GitHub上
它可以:

  • 压扁压痕
  • 删除整行注释(除了初始的hashbang(#!))和空行
  • 为循环、数组访问和“读取”语句重命名基本声明中的所有小写变量(以避免重命名PATH等变量)。
在某些情况下它可能会失败,但我用一个相当大的bash脚本对它进行了测试,并弹出了变量替换的列表。它还将变量单独保留在单引号(')中——这是在打印AWK脚本时弹出的——但是在语句已经位于双引号(“))中时替换单引号(')——这是在打印MySQL语句时弹出的。

这让我觉得我已经涵盖了所有大的用例,但我以前就错了。如果你发现任何bug,请随时报告(或修复它们!:D)。我还考虑添加一个功能,将短线连接到一个带有“;“但是这些案例太多了,我在截止日期前无法进行分析


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

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
!/bin/sh
脚本=${1}
如果[!-z“${Script}”]&&&[-f${Script}];则
CurrentTime=$(日期| sed-e's~~~~~~g'-e's~:~~g')
cp${Script}${Script}{CurrenTime}
####删除所有空行
####删除以空格和注释符号开头的行#
####删除所有注释行(即以“#”开头的行)
awk'
(/.*/ || /#!/) && (!/^#$/) &&
(!/#[:blank:]/)和&(!/#[a-z]/)和
(!/#[A-Z]/)和&(!/###/)&&
(!/^\t#/)&&(!/^[[:空格:]*$/)&&
(/^#。*!/| |!/^[:空格:]*./)
'${Script}| sed's_^[:space:]*.\uu g'>${Script}.tmp 2>/dev/null
#'${Script}>${Script}.tmp 2>/dev/null(如果您的HEREDOCS受到影响,请注释掉上面的一行并取消注释这一行)
ExitCode=$?
如果[${ExitCode}-eq 0]&&&-[s${Script}.tmp];则
回声
echo“成功:可以在[${script}.tmp]中找到您新的[minified]脚本。”
echo“检查脚本[${script}.tmp],如果满意,用它替换原始脚本!"
echo“注意:您的原始脚本[${script}]已备份为[${script}{CurrenTime}]!"
回声
出口0
其他的
回声
echo“失败:无法[缩小]指定的脚本[${script}]!!!"
回声
出口2
fi
其他的
回声
echo“用法:${0}”
回声
出口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
使用Openssl加密脚本:
1.cat | openssl aes-128-cbc-a-salt-k“指定密码”>yourscript.enc
或
2.openssl aes-128-cbc-a-salt-in-k“您的密码”
要使用Openssl解密脚本(请注意'-d'):
1.cat yourscript.enc | openssl aes-128-cbc-a-d-salt-k“specify-a-password”>yourscript.dec
或
2.openssl aes-128-cbc-a-d-salt-in-k“yourpassword”>yourscript.dec
加密/模糊处理:

  • 如果您的最终目标是让他人难以阅读您的脚本,请尝试为您生成加密副本
  • 如果您改变了对SHC的看法,可以使用最新版本
  • 原创的
    #!/usr/bin/env bash
    echo "foo"
    
    $ echo '#!/usr/bin/env bash' > other.sh
    $ echo "echo '$(base64 script.sh)' | base64 -d | sh" >> other.sh
    $ chmod +x other.sh
    
    #!/usr/bin/env bash
    echo 'IyEvdXNyL2Jpbi9lbnYgYmFzaAplY2hvICJmb28iCg==' | base64 -d | sh
    
    $ ./other.sh
    foo
    
    python minifier.py /path/to/shell/script.sh
    
    #!/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}