2015年3月25日 星期三

批次檔加密(Compile your script)


我想對於IT人來說,尤其是以MIS或系統管理者來說,撰寫一些能夠把既定事項排程處理的批次檔(bat or shell script),應該是再為熟悉不過的事,不過,或是相同的情境卻是發生在客戶或非自己管理的主機上時,或許面向又不太一樣了!這時候或許就得要考慮把自己撰寫好的批次檔進行加密,以免造成其它不必要的困擾。

這邊我主要還是介紹一下在LINUX上的應用情境,若是用在WINDOWS上的工具,應該只要GOOGLE一下"bat to exe"之類的就有不少。(有什麼工具GOOGLE後會沒有的嗎?)
這邊我一樣用目前我慣用的LINUX系統(CentOS 6.6)來介紹,在LINUX上Compile Shell Script的工具,我自己是實作了shc這隻工具,簡單說它就是把shell script透過gcc的方式打包成執行檔,讓一般人無法得知你撰寫的內容。

相關流程如下:
  1. 安裝gcc及相關套件:
    yum -y install wget gcc glibc-static

  2. 下載shc壓縮檔:
    wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz
    tar -zxvf shc-3.8.9.tgz
    cd shc-3.8.9
  3. 執行安裝:
    make


    結果:
    cc -Wall shc.c -o shc
    *** ▒Do you want to probe shc with a test script?
    *** Please try... make test



    make install


    結果:
    *** Installing shc and shc.1 on /usr/local
    *** ▒Do you want to continue? y
    install -c -s shc /usr/local/bin/
    install -c -m 644 shc.1 /usr/local/man/man1/
    install: target `/usr/local/man/man1/' is not a directory: No such file or directory
    make: *** [install] Error 1

  4. PS:若直接make install會發現有ERROR,主要是因man檔的安裝路徑不存在,可手動先修改makefile後再進行make install

    修改指令如下:


    sed -i -e 's/\/man\/man1\//\/share\/man\/man1\//g' ./makefile
  5. 執行方式:

    shc Usage:
    shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-rvDTCAh] -f script

    主要的使用參數:更多內容可以參考man shc

    -e date

    Expiration date in dd/mm/yyyy format [none]

    -m message
    message to display upon expiration ["Please contact your provider"]

    -f script_name

    File name of the script to compile

     -r
    Relax security. Make a redistribution binary which exe
    cutes on different systems running  the  same  operating system.

     -v
    Verbose compilation


     -T
    Allow  binary  to  be  traceable  (using strace, ptrace,
    truss, etc.)

  6. 實際測試和驗證
    建立一個sh檔:1.sh
    #!/bin/bashecho -e "test shc"exit 0

    執行shc:

    shc -rvT -f 1.sh

    過程如下

    shc shll=bash
    shc [-i]=-c
    shc [-x]=exec '%s' "$@
    shc [-l]=
    shc opts=
    shc: cc 1.sh.x.c -o 1.sh.x
    shc: strip 1.sh.x
    shc: chmod go-r 1.sh.x


    驗證檔案:
    file 1.sh
        1.sh: Bourne-Again shell script text executable

    file 1.sh.x

        1.sh.x: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

    file 1.sh.x.c
        1.sh.x.c: ASCII C program text


    執行結果:

    A. 執行1.sh:sh 1.sh
    test shc

    B. 執行1.sh.x:./1.sh.x
    test shc

  7. 執行靜態連結加密檔  (檔案較大)
    CFLAGS=-static shc -rvT -f 1.sh

    驗證檔案:
    file 1.sh.x1.sh.x: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.18, stripped

    執行結果:
    ./1.sh.x
  8. test shc
  9. 測試可用期限
    shc -e 25/03/2015 -m "InDeepNight TesT shc function" -rvT -f 1.sh

    執行結果:
  10. ./1.sh.x
  11. ./1.sh.x: has expired!
  12. InDeepNight TesT shc function
測試及實作結果如上述所示,希望可以對於有需求的人有些幫助,若有其它更好的應用方式及情境,也歡迎分享告知。