1. 程式人生 > >shell指令碼中嵌入二進位制檔案

shell指令碼中嵌入二進位制檔案

shell指令碼中嵌入二進位制檔案

2011年02月28日 16:39:00 ssmile 閱讀數:3836 標籤: 指令碼 shell linux 加密 解密 gcc

最近有人問我,一個叢集監控軟體的安裝檔案特別“詭異”,說腳本里有“亂碼”卻能執行,是怎麼回事?我看了才發現這個東西原來是典型的指令碼巢狀程式碼的模式,這裡就講講吧。反正好久沒寫東西了。

某些比較“拽”的單位在釋出Linux軟體時以一種特殊的形式釋出,即在shell指令碼中嵌入二進位制字元,從而使指令碼變得極其詭異,讓某些初學者感覺驚奇。其實,這個原理戳穿了非常簡單,就是在執行指令碼時將二進位制程式碼匯出成一個程式,再執行之就可以。(不過這種行為其實,是違反Linux社群的精神的,像我這種人, 看到什麼軟體第一反應都是想搞到其原始碼



1 簡單嵌入程式

原理:通常程式程式碼處在指令碼的最後位置。指令碼執行時,把它寫出來執行即可。

例:下面的這個原始碼:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
const char* envtagUSER="USER";
printf("Your Username: %s. This is detected by the program %s./n", getenv(envtagUSER), argv[0]);
return 0;
}

這段程式碼可以用來輸出使用者名稱。當然這僅僅是個例子,實際程式設計時用shell就可以得到。現在假設我們想把這段程式碼嵌入一個名叫dofoo.sh的shell指令碼中。首先編譯之:
gcc -Os foo.c -o foo
現在把foo追加到dofoo.sh的末尾:
cat foo >> dofoo.sh   # Not > but >> !
開啟dofoo.sh,新增程式碼:

1 #!/bin/sh
2
3    skip=11
4    prog="/tmp/$0.exe"
5    tail -n +$skip "$0" > $prog
6    chmod u+x $prog
7    $prog
8    rm $prog
9    exit
10
11 ^?EFL^B
...
18 ....AMIC^@data_start^@__libc_csu_fini^@_sta

(11行以後用VI看都是亂碼)
看明白了吧!這程式碼將指令碼中11行以後的東西匯入到了/tmp/dofoo.exe這個檔案中,新增x許可權,執行,然後刪除該檔案。

2 加密偽裝

有時候一個shell中的亂碼並不一定是可執行檔案,那些東西可能是某種壓縮格式,如bz2,gz等等,或者其他的某種加密形式,程式會先把他們匯出來解壓在執行然後刪除,道理是一樣的。有時候,這種解壓程式或者解密程式本身就巢狀在shell腳本里,通常是商業公司乾的事。