2015-06-21 78 views
6

我下載了一個archive file。在檔案中會有一個文件,其中有一個.sh。延期。當我打開該文件與VI,我發現下面的代碼在文件的開頭:帶有jar文件的shell腳本

#!/bin/sh 
MYSELF=`which "$0" 2>/dev/null` 
[ $? -gt 0 -a -f "$0" ] && MYSELF="./$0" 
java=java 
if test -n "$JAVA_HOME"; then 
    java="$JAVA_HOME/bin/java" 
fi 
exec "$java" $java_args -jar $MYSELF "[email protected]" 
exit 1 

我可以通過做java -jar file或`./file」運行jar。

有人能解釋我發生了什麼事嗎?你怎麼能創建這樣的文件?

+1

嗯,我很驚訝,那有效。我認爲JAR文件只是一個帶有不同擴展名的ZIP文件,而ZIP需要以特定的頭文件開頭。你可以給一個鏈接下載? – Thomas

+0

命令'file '的輸出是什麼? –

+0

@EugeniuRosca它打印數據。如果你想測試它,我添加了一個指向文件的鏈接 – Hunsu

回答

3

請自行嘗試以下命令。開始用任何內容創建一個正常的jar文件,或者使用你擁有的人。我將它命名爲 「myjar.jar」

接下來,創建一個文件 「hello.sh」 的內容:

#!/bin/bash 

exec echo hello 

現在,在一個新的jar文件的開頭添加此文件:

cat hello.sh myjar.jar > mytrick.jar 
chmod 700 mytrick.jar 

最後,有趣的部分,類型:

./mytrick.jar 
jar -tf mytrick.jar 
unzip mytrick.jar 
換句話說

,通常JAR /解壓跳過任何內容,直到自己的頭呃。而且,shell腳本「結束」在調用「exec」的行中(因爲shell解釋器此時被exec行中的命令替換)。

但是,這個技巧是基於jar/unzip可能超出標準的行爲。請注意,舉例來說,這種說法失敗(沒有效果):

jar -xf mytrick.jar 
3

如果提取tar文件後的文件是start-superbeam.sh嘗試做chmod +x start-superbeam.sh && ./start-superbeam.sh/bin/sh ./start-superbeam.sh

如果程序有參數,在最後提供它們。它將運行java上的superbeam.sh作爲最後的jar文件。

如果您需要設置特殊的java參數(如內存大小),則可以將它們設置在環境變量java_args中。

至於發生了什麼事情,這是一個shell腳本,在exit後面有一個jar文件。若要從ReallyExecutable Jars引用:

長期以來人們一直在某些圈子裏已知的黑客攻擊,但沒有得到廣泛的 知道,使罐真正的可執行文件,在使用chmod + X檢測。破解 利用了這個事實,即jar文件是zip文件,並且zip文件允許任意的cruft被添加到zip文件本身 (這是自解壓zip文件的工作方式)。

至於如何創建,請參閱接受的答案或鏈接。

+0

如果您添加了您鏈接的文章中給出的詳細信息,我會接受您的答案。 – Hunsu