2012-05-08 112 views
8

首先,我已經使用了google代碼,但只找到了一個壓縮文件(例如.tar.gz)嵌入shell腳本的例子。將一個可執行二進制文件嵌入到一個shell腳本中

基本上如果我有一個打印字符串的C程序(hello.c),說Hello World!

我編譯得到可執行的二進制

gcc hello.c -o hello 

現在我有一個shell腳本testEmbed.sh

我所問的是,如果它是可以嵌入二進制(你好)裏面的shell腳本,以便我運行時

./testEmbed.sh 

它執行二進制打印Hello World!

澄清: 一種替代方法是,我將可執行文件壓縮到檔案中,然後在腳本運行時將其解壓縮。我問的是如果沒有這個可以運行程序。

直到現在,我正在嘗試方法here。但它不適合我。我想作者正在另一個架構上使用其他發行版。所以,基本上這不適合我。 :P

此外,如果C程序的工作流程與Java jar不同,我也想知道這一點!

回答

14

是的,這可以做到。它在概念上與您的鏈接文章非常相似。訣竅是使用uuencode將二進制文件編碼爲文本格式,然後將其粘貼到腳本的末尾。

然後,您的腳本以這樣的方式編寫,即它自己運行uudecode以創建二進制文件,然後更改權限並執行它。

uuencodeuudecode最初是爲了將二進制內容轉移到互聯網的前體而創建的,它並沒有很好地處理二進制信息。轉換爲文本意味着它可以作爲shell腳本發送。如果由於某種原因,當您嘗試運行uuencode時,您的分發抱怨,則可能意味着您必須安裝它。例如,在Debian Squeeze上:

sudo aptitude install sharutils 

將爲您獲取相關的可執行文件。這是我經歷的過程。首先創建和編譯的C程序hello.c

pax> cat hello.c 

#include <stdio.h> 
int main (void) { 
    printf ("Hello\n"); 
    return 0; 
} 

pax> gcc -o hello hello.c 

然後創建一個shell腳本testEmbed.sh,這將自身解碼:

pax> cat testEmbed.sh 

#!/bin/bash 
rm -f hello 
uudecode $0 
./hello 
rm -f hello 
exit 

第一rm聲明顯示,正在被這個重新創建的hello可執行腳本,而不是留在你的彙編中。由於您所需要的有效載荷文件中爲好,裝上編碼的可執行到它的結束:

pax> uuencode hello hello >>testEmbed.sh 

之後,當你執行腳本testEmbed.sh,它提取的可執行文件,並運行它。

這部作品的原因是因爲uudecode會在其輸入(beginend)某些標記線,由uuencode放在那裏,所以它只是試圖編碼的程序進行解碼,而不是整個腳本:

pax> cat testEmbed.sh 

#!/bin/bash 
rm -f hello 
uudecode $0 
./hello 
rm -f hello 
exit 

begin 755 hello 
M?T5,[email protected]$!`0````````````(``P`!````$(,$"#0```#`[email protected]```````#0`(``' 
M`"@`'@`;``8````T````-(`$"#2`!`[email protected]````X`````4````$`````P```!0! 
: : : 
M:&%N9&QE`%]?1%1/4E]%3D1?7P!?7VQI8F-?8W-U7VEN:70`7U]B<W-?<W1A 
M<G0`7V5N9`!P=71S0$!'3$E"0U\R+C``7V5D871A`%]?:38X-BYG971?<&-? 
4=&AU;[email protected]`;6%I;@!?:6YI=``` 
` 
end 

還有其他一些你應該擔心的事情,例如你的程序可能需要目標系統上不存在的共享庫,但上面的過程基本上是你需要的。


JAR文件的過程非常相似,只是運行方式不同。它仍然是一個單一的文件,但你需要更換行:

./hello 

與能夠運行的JAR文件,如東西:

java -jar hello.jar 
+2

向shell腳本添加一個'trap'rm -f hello'SIGINT'也是一個好主意,這樣在用戶Ctrl-C的程序中就可以清理臨時文件。 –

+0

是的,我不懷疑您可以對該代碼進行大量的改進,並且這是一個很好的改進。我不想把它複雜得太多,因爲我只是試圖理解這個概念。 – paxdiablo

+0

一個非常好的解釋。謝謝 – Ankit

2

便攜的方式做,這是與printf命令和八進制轉義:

printf '\001\002\003' 

打印字節1,2和3。因爲你很可能不希望所有的手工編寫, od -b命令可用於生成文件的八進制轉儲,然後您可以使用sed腳本剝離垃圾並將正確的反斜槓就位。

+0

用八進制創建字符串的命令是'od - b BINARYFILE | sed -n's%[0-9] \ {4,\} \ \([0-9] \ {3 \}。* \)%\ 1%p'| perl -pe' ^%\\%; s%\%\\%g; s%\ n %%')'。這個創建的八進制字符串是'printf'必須有的參數。 – erik

相關問題