シェルスクリプトをバイナリ化する「shc」

シェルスクリプトをバイナリ化する「shc」

Posted at September 21,2023 11:55 PM
Tag:[Linux]

シェルスクリプトをバイナリ化する「shc」の紹介です。

1.はじめに

シェルスクリプト(bash等)はテキスト形式のプログラムのため、スキルのある人が読めば、その内容が解読されてしまいます。

ですが、shc(Shell Script Compiler)を利用すれば、スクリプトがバイナリ化されるので、解読される心配がなくなります。

たとえば、他のサーバにログインする際、知られたくないユーザーやパスワードの記述が可能です。

2.インストール

yumコマンド等でもインストールできるようですが、ここではパッケージをダウンロードしてビルドする手順で説明します。

shcのパッケージは下記のURLよりダウンロードします。

https://neurobin.org/projects/softwares/unix/shc/

Linux環境にアップロードし、ダウンロードしたアーカイブを展開します。

展開するとshc-releaseディレクトリができるので、そのディレクトリに移動し、

# ./configure
# make
# make install

を実施します。
コマンドの実行結果は下記です。

# ./configure
 ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether gcc understands -c and -o together... yes
checking whether make supports the include directive... yes (GNU style)
checking dependency style of gcc... gcc3
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking fcntl.h usability... yes
checking fcntl.h presence... yes
checking for fcntl.h... yes
checking for stdlib.h... (cached) yes
checking for string.h... (cached) yes
checking for unistd.h... (cached) yes
checking for struct stat.st_rdev... yes
checking for stdlib.h... (cached) yes
checking for GNU libc compatible malloc... yes
checking whether time.h and sys/time.h may both be included... yes
checking for sys/time.h... yes
checking for unistd.h... (cached) yes
checking for alarm... yes
checking for working mktime... yes
checking for stdlib.h... (cached) yes
checking for GNU libc compatible realloc... yes
checking for memset... yes
checking for putenv... yes
checking for strchr... yes
checking for strdup... yes
checking for strrchr... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: executing depfiles commands
# make
Making all in src
make[1]: ディレクトリ `/home/hoge/shc/shc-release/src' に入ります
gcc -DPACKAGE_NAME=\"shc\" -DPACKAGE_TARNAME=\"shc\" -DPACKAGE_VERSION=\"4.0.3\" -DPACKAGE_STRING=\"shc\ 4.0.3\" -DPACKAGE_BUGREPORT=\"http://github.com/neurobin/shc/issues\" -DPACKAGE_URL=\"\" -DPACKAGE=\"shc\" -DVERSION=\"4.0.3\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRUCT_STAT_ST_RDEV=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_SYS_TIME_H=1 -DHAVE_UNISTD_H=1 -DHAVE_ALARM=1 -DHAVE_STDLIB_H=1 -DHAVE_REALLOC=1 -DHAVE_MEMSET=1 -DHAVE_PUTENV=1 -DHAVE_STRCHR=1 -DHAVE_STRDUP=1 -DHAVE_STRRCHR=1 -I.     -g -O2 -MT shc.o -MD -MP -MF .deps/shc.Tpo -c -o shc.o shc.c
mv -f .deps/shc.Tpo .deps/shc.Po
gcc  -g -O2   -o shc shc.o
make[1]: ディレクトリ `/home/hoge/shc/shc-release/src' から出ます
make[1]: ディレクトリ `/home/hoge/shc/shc-release' に入ります
make[1]: `all-am' に対して行うべき事はありません.
make[1]: ディレクトリ `/home/hoge/shc/shc-release' から出ます
# make install
Making install in src
make[1]: ディレクトリ `/home/hoge/shc/shc-release/src' に入ります
make[2]: ディレクトリ `/home/hoge/shc/shc-release/src' に入ります
 /bin/mkdir -p '/usr/local/bin'
  /usr/bin/install -c shc '/usr/local/bin'
make[2]: `install-data-am' に対して行うべき事はありません.
make[2]: ディレクトリ `/home/hoge/shc/shc-release/src' から出ます
make[1]: ディレクトリ `/home/hoge/shc/shc-release/src' から出ます
make[1]: ディレクトリ `/home/hoge/shc/shc-release' に入ります
make[2]: ディレクトリ `/home/hoge/shc/shc-release' に入ります
make[2]: `install-exec-am' に対して行うべき事はありません.
 /bin/mkdir -p '/usr/local/share/man/man1'
 /usr/bin/install -c -m 644 shc.1 '/usr/local/share/man/man1'
make[2]: ディレクトリ `/home/hoge/shc/shc-release' から出ます
make[1]: ディレクトリ `/home/hoge/shc/shc-release' から出ます

インストールするとshcコマンドが有効になります。

# shc
shc parse(-f): No source file specified
 
shc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-o outfile] [-rvDSUHCABh] -f script

3.使い方

簡単なサンプルで説明します。

下記の内容を「sample.sh」で保存します。

#!/bin/bash
echo "OK"

このスクリプトをバイナリ化するには、下記のように実行します。

shc -f sample.sh -o sample.sh.x

"-f"にシェルスクリプトを指定し、"-o"に出力ファイルを指定します。

実行すると下記の2つのファイルが生成されます。スクリプトとして使用するのは、sample.sh.xの方です。

  • sample.sh.x.c:C形式のファイル
  • sample.sh.x:バイナリ化されたファイル

拡張子は".sh.x"でなくても問題ないようです。

パラメータは他にも色々あるので、manコマンドで調べて下さい。

4.注意事項

バイナリ化したファイルを他のサーバで再利用したい場合、必ず"-r"オプションをつけてください。

shc -f sample.sh -o sample.sh.x

"-r"オプションを付与せず他のサーバで実行しても正常に動作しません。

関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)