web-dev-qa-db-ja.com

bashスクリプトを縮小/難読化する方法

もちろん、bashファイルは本当に難読化することはできず、常に読み取り可能です。そして、私はそれらをいくつかのバイナリパッケージにラップしたくありません。また、ローカル変数の名前を変更しても問題はありません。

しかし、少なくともすべてのインデント、すべての空の行、およびすべての空白を、何も壊さずに削除する、信頼性のある単純なbash難読化ツールまたはミニファイアはありますか?特に、機密文書や機密情報が含まれている可能性のあるスクリプトのコメントやコメントアウトされた部分はどうですか。

" HEREDOCs "はもちろん変更してはならないので、これを行うには単純なgrep/sed-linesが怖いので、少し実際の解析が必要です。

多分これを行うためのツールがあります、それは素晴らしいでしょう!

22
Christian

ここに私がbashスクリプトの縮小化のために作成したツールがあります: https://github.com/precious/bash_minifier –すべてのコメントと可能な限り多くのスペース/タブ/改行を削除しようとします。こちらからもサービスとして利用できます https://bash-minifier.appspot.com/

Bashスクリプトを縮小するには、次のコマンドを実行します。

python minifier.py /path/to/Shell/script.sh
10
Vsevolod Kulaga

:Pここで何かおかしいです。

スクリプトの名前がOriginで、難読化されたスクリプトの名前がobsfだとします。

ここにOriginがあります:

#!/bin/sh
echo "fooo"

こちらがobsfです

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

rm Originobsfを次のように実行します。

$ sh obsf | base64 -d | sh
fooo

へ3:

28
c00kiemon5ter

これは古い質問ですが、Googleで人気があるようです。また、bash minifer/obfuscatorも探していましたが、答えが気に入らなかった。

意味不明なものを追加したり、スクリプトをコンパイルしたりしたくありませんでした。だから私はPerlで私がやりたいことをしたものを書いて、それをGitHubの https://github.com/Aralhach/bashobfus/tree/master に置きました
できる:

  • インデントを平らにする
  • 全行コメント(最初のハッシュバング(#!)を除く)と空白行を削除します
  • ループ、配列アクセス、および「読み取り」ステートメントに対して、基本的な宣言(PATHなどの変数の名前変更を回避するため)のすべての小文字変数の名前を変更します。

失敗するケースもあるかもしれませんが、かなり大きなbashスクリプトでテストしたところ、リストされた変数置換のケースがポップアップしました。また、変数を単一引用符( ')内に残す-これは、AWKスクリプトを印刷するときにポップアップ表示されます-しかし単一引用符の間で置換ステートメントがすでに二重引用符( ")]内にある場合の引用符( ')-これは、MySQLステートメントを出力するときにポップアップします

これは、すべての大きなユースケースをカバーしたと思いますが、以前は間違っていました。バグを見つけたら、遠慮なく報告してください(または修正してください!:D)。また、短い行を「;」で結合する機能を追加することも考えていました。しかし、私の締め切りに間に合うようにケースが多すぎて分析できませんでした。

皆様のお役に立てれば幸いです。

7
Daniel Gray

元のファイル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
Eduardo Cuomo

シェルスクリプトを難読化するツール: http://www.comp.eonworks.com/scripts/obfuscate_Shell_script-20011012.html

ばかげたことはありますが、それはあなた次第です。シェルスクリプトを実行可能ファイルに「コンパイル」する方法もあります。この post's 受け入れられた答えは、それを行うためのツールといくつかのリンクを提供します。

2
linuxnut

シェルスクリプトの縮小と難読化は、2つの異なるものです。

縮小とは、機能を変更せずにソースコードからすべての不要な文字を削除することにより、スクリプトのサイズを縮小することを意味します。一方、難読化は、不可能ではないにしても、スクリプトを読みにくくすることを意味します。

縮小:

大きなスクリプトを縮小するには、縮小したい実際のスクリプトに対して次のコードを実行します。

#!/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. 最終的な目標が他のユーザーにスクリプトを読みにくくすることである場合は、暗号化されたコピーが生成されるように ここに貼り付ける を試してください。
  2. SHCについて気が変わった場合は、最新バージョンを ここからダウンロード にすることができます。
1
RoyMWell