シェルスクリプトをバイナリ化する「shc」
シェルスクリプトをバイナリ化する「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"オプションを付与せず他のサーバで実行しても正常に動作しません。
- VMをundefineできない場合の対処
- cpanflute2でエラーになる場合の対処
- OpenSSLで文字列を暗号化・複号化する方法
- sshログインに時間がかかる場合の対処
- vi/vimで範囲指定して置換する方法
- vi/vimでマークした行に移動する方法
- vi/vimで複数行を一括削除する方法
- LinuxでOSキャッシュをクリアする方法
- lessで検索文字列だけを表示する方法
- tailコマンドでファイルがローテートされても追従する方法
- svnでファイルやディレクトリを削除する方法
- phpMyAdminで「unknown system variable 'lc_messages'」となる場合の対処
- Linux(CentOS)でapxsがみつからない場合の対処
- PHP7.3とApacheを連携させる方法
- CentOS 6にPHP7.3をインストールする方法