是的,這可以做到。它在概念上與您的鏈接文章非常相似。訣竅是使用uuencode
將二進制文件編碼爲文本格式,然後將其粘貼到腳本的末尾。
然後,您的腳本以這樣的方式編寫,即它自己運行uudecode
以創建二進制文件,然後更改權限並執行它。
uuencode
和uudecode
最初是爲了將二進制內容轉移到互聯網的前體而創建的,它並沒有很好地處理二進制信息。轉換爲文本意味着它可以作爲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
會在其輸入(begin
和end
)某些標記線,由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
向shell腳本添加一個'trap'rm -f hello'SIGINT'也是一個好主意,這樣在用戶Ctrl-C的程序中就可以清理臨時文件。 –
是的,我不懷疑您可以對該代碼進行大量的改進,並且這是一個很好的改進。我不想把它複雜得太多,因爲我只是試圖理解這個概念。 – paxdiablo
一個非常好的解釋。謝謝 – Ankit