2015-06-21 81 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