Linux環境下腳本加密軟件SHC的解密方法

Linux環境下腳本加密軟件SHC的解密方法

 

2016/08/06:更新一個新的解密腳本php

https://github.com/yanncam/UnSHchtml

自從我在博客裏面發佈了一些免流相關的東西以後,很多博友都加我QQ想了解如何解密通過SHC加密後的腳本。博主在這裏須要跟你們說明的一點是:博主真的不是什麼高手或大牛!博主解密這些腳本的方法都是搜索一下就可以找到的東西,我只是彙總了一下分享給你們,這個沒什麼技術含量可言的。另外,博主對於Linux的瞭解也就僅限於正常的使用。因此,不要一加QQ就諮詢解密啦,我真的知道的很少,並且最新的解密腳本都是一些博友發給個人。linux

收到博友的反饋說是解密腳本有些能解,有些不能解,具體緣由我不太清楚,今天就給你們瞭解下SHC解密的另外一個思路(在上一篇文章中我提供的是一個現成的腳本)。固然,要想知道如何解密SHC,最好仍是要了解下SHC是個啥東西,怎麼工做的,咱先來科普一下吧。git

SHC簡單介紹及安裝使用

SHC是一個用於加密linux腳本的軟件,在某種程度上來講能夠提升安全性。若是您不但願本身編寫的shell腳本里面的相關信息透露出來,或者不肯意讓人看到和修改shell代碼,就可使用shell加密。實際上SHC是一個腳本編譯程序,使用RC4加密代碼加密shell, 並把shell轉換爲二進制可執行文件(支持動態連接和靜態連接)github

如何安裝和使用SHC?shell

SHC官網地址:http://www.datsi.fi.upm.es/~frosal/sources/安全

能夠在直接從官網上WGET下載最新的源碼到本機進行編譯,執行步驟以下:bash

wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9b.tgz
tar vxf shc-3.8.9b.tgz
cd shc-3.8.9b
make test
make strings
make install

安裝的時候可能會出現下面的狀況,能夠直接無視,通常沒什麼影響,只是少了對應的幫助文檔。dom

***     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

SHC加密程序使用參數:加密

-e date (指定過時時間)
-m message  (指定過時提示的信息)
-f  script_name (指定要編譯的shell路徑)
-r  relax security  (在不一樣操做系統執行)
-v  Verbose compilation (輸出編譯的詳細狀況)

簡單使用實例:用SHC加密當前目錄下的 abc.sh 文件

shc -v -f abc.sh
shc -e 28/01/2012 -m "過時" -f abc.sh

若是須要用靜態連接,只須要只需SHC加密的時候前面加上代碼:CFLAGS=-static

靜態連接加密實例:

CFLAGS=-static shc -v -f abc.sh

使用shc加密Shell腳本

 

[root@martin shc-3.8.7]# ./shc -v -r -T -f random.sh
shc shll=bash
shc [-i]=-c
shc [-x]=exec '%s' "$@"
shc [-l]=
shc opts=
shc: cc  random.sh.x.c -o random.sh.x
shc: strip random.sh.x
shc: chmod go-r random.sh.x

 

運行後會生成兩個文件,script-name.x 和 script-name.x.c
script-name.x是加密後的可執行的二進制文件
script-name.x.c是生成script-name.x的原文件(c語言)

[root@martin shc-3.8.7]# ll random.sh*
-rwxr-xr-x 1 root root   146 Aug  2 10:26 random.sh
-rwx--x--x 1 root root  9424 Aug  2 10:30 random.sh.x
-rw-r--r-- 1 root root 10080 Aug  2 10:30 random.sh.x.c

執行加密後的腳本

[root@martin shc-3.8.7]# ./random.sh.x 
How many random numbers do you want to generate?3
28955
21487
29513

還不完善,只能全路徑執行shc命令或者進入目錄內,加入全局環境變量/etc/profile未生效

SHC解密的一些方法

2016/8/13日更新:根據博友反饋本方法運行出錯,解密思路是一個朋友給的,目前尚未回覆,等到回覆了會第一時間更新。

雖然使用SHC對SHELL腳本進行RC4加密編譯能夠從必定程度上防止腳本程序被修改,可是這種加密方式並非堅不可破的,心中無碼纔是最高境界,固然,國內環境你們懂的,在這裏就不扯開話題了。

通過SHC加密的腳本可以被解密的緣由是:在執行加密腳本的時候,仍是會在內存中解密所有的shell代碼,因此解密的思路就是從內存中獲取解密後的代碼

好了,解密的思路有了,下面就來一步一步探討下怎麼從內存中獲取解密後的代碼。

那麼有啥方法能夠從內存中讀取數據呢?通過一番搜索以後,找到了Core Dump這個神器。

什麼是Core dump
Core dump翻譯過來就是核心轉儲,當程序運行過程當中發生異常, 程序異常退出時, 由操做系統把程序當前的內存情況存儲在一個core文件中, 叫core dump。core dump在應用crash掉以後對問題的診斷是頗有幫助的。多數狀況下Core dump默認是關閉狀態的。

那如何打開Core Dump呢?

方法一:直接執行命令行開啓:

ulimit -c 70000
echo "/core_dump/core.%e.%p" > /proc/sys/kernel/core_pattern

經過上面的命令就開啓了core dump,同時限制文件大小爲7000k,也就是限制單個文件大小爲7M左右,通常的腳本沒那麼大的。

方法二:配置profile文件,打開/etc/profile文件,在裏面能夠找到

ulimit -S -c 0 > /dev/null 2>&1

將它修改爲下面這樣就能夠了。

ulimit -S -c unlimited > /dev/null 2>&1

固然,對於像咱們這樣的菜鳥來說,仍是方法一比較實際。

開啓了Core Dump,咱們就能夠進行猥瑣的解密工做了。

首先設置下執行腳本並中斷,假如你須要解密的二進制腳本文件名爲abc

(請注意:博友反饋這一步執行不了)

./abc (sleep 0.2 && kill -SIGSEGV $!)

輸出腳本執行信息和腳本代碼到文件

cd /core_dump
cat ./core.***.**** | strings > ~/abc.sh
***.***是你執行代碼後的隨機值(對應的PID等)

好了,輸出後的abc.sh文件就是從內存裏面取出的解密後的代碼,固然裏面仍是有些多餘文本內容,本身稍微動手剔除後就獲得解密後的腳本了。

上面是手工方式得到解密代碼,固然也是最穩妥的,下面再給你們送上一份一個一鍵解密腳本,固然,博主不保證可以解密成功,也是拿出來參考參考而已。

最後,若是各位博友解密了腳本的話,歡迎發我一份。

#!/bin/sh  
##############################################################  
# Used to unzip script files generated by shc                #  
# Modified by cuterhei at 2014-02-26: 目錄遍歷               #  
# Created by cuterhei at 2014-02-25 : 建立                   #  
##############################################################  
  
shcd_help()  
{  
    echo "  Used to unzip script file generated by shc."  
    echo "  Usage:"  
    echo "    0. shcd -h|?|-help       ---- Current you see"  
    echo "    1. shcd inputfile        ---- 解壓單個文件(輸出文件inpfile.bat)"  
    echo "    2. shcd inpfile outpfile ---- 解壓單個文件(輸出文件outpfile)"  
    echo "    3. shcd -d               ---- 深層目錄遍歷解壓(輸出文件*.bat)"  
    echo "    4. shcd -a               ---- 當前目錄遍歷解壓(輸出文件*.bat)"  
    exit 0  
}  
  
get_skip()  
{  
    skip=0  
    while read skip_line  
    do  
        let "skip -= 1"  
        skl_f="none"  
        skipstrlist=$(echo $skip_line|tr "=" "\n")  
        for xs in $skipstrlist; do  
            if [ "$skl_f" = "none" ]; then  
                if [ "$xs" = "skip" ]; then  
                    skl_f="found"  
                else  
                    break;  
                fi  
            elif [ "$skl_f" = "found" ]; then  
               skip=$xs;  
               break  
            else  
               break  
            fi  
        done  
        if [ "$skl_f" = "found" ] || [ $skip -le -2 ]; then  
            break  
        fi  
    done < "$1"  
    echo $skip  
}  
  
ucount=0  
  
uncomp_shc()  
{  
    skipline=$(get_skip $1)  
    if [ "$skipline" = "" ] || [ $skipline -le 1 ]; then  
        echo "%>_<% Skip flag not found: $1"  
    else  
        if tail -n +"$skipline" "$1" | gzip -cd > "$2"; then  
            let "ucount += 1"  
            echo "^_^ $ucount. Unzip $1<skip=$skipline> to $2"  
        else  
            echo "%>_<% Unzip $1<skip=$skipline> failed"  
        fi  
    fi  
}  
  
uncshc_dir()  
{  
    echo "......Enter dir '$1' ......"  
    for file in $1/*  
    do  
        if [ -f $file ]; then  
            uncomp_shc "$file" "$file.bat"  
        elif [ -d $file ] && [ "$2" = "-d" ]; then  
            uncshc_dir "$file" "$2"  
        fi  
    done  
    echo "......Leave dir '$1' ......"  
}  
  
# now start to work  
  
if [ "$#" = "0" ] || [ "$1" = "-?" ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then  
    shcd_help  
elif [ -f $1 ]; then  
    if [ "$#" = "2" ]; then  
        uncomp_shc "$1" "$2"  
    else  
        uncomp_shc "$1" "$1.bat"  
    fi  
elif [ "$1" = "-d" ] || [ "$1" = "-a" ]; then  
    uncshc_dir . $1  
else  
    echo "File $1 is not exist."  
fi  
  
echo "$ucount files are unzipped."  
  
exit  
  
# end of job
相關文章
相關標籤/搜索