![bash 文件包含可执行/二进制代码](https://linux22.com/image/159820/bash%20%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E5%8F%AF%E6%89%A7%E8%A1%8C%2F%E4%BA%8C%E8%BF%9B%E5%88%B6%E4%BB%A3%E7%A0%81.png)
我找到了这个工具当我下载它时,它是一个包含二进制代码的 bash 可执行文件。
首先我不知道这是可能的。有谁知道谁可以做到这一点?另外,我不确定这通常有多安全,因为我无法真正确定 bash 文件包含什么
答案1
这是一个独立的 Java 程序,它依赖于一些“技巧”:
- Java 程序可以打包为 JAR 文件,这些文件是包含清单 (
META-INF/MANIFEST.MF
) 的 ZIP 文件,该清单指定要启动的 Java 类; java -jar
给定一个 JAR 文件,将查看清单并启动相应的类,从 JAR 文件和 Java 运行时加载任何其他所需的资源(也可以指定要运行的另一个类,但这与这里无关);- ZIP 文件可以以任意数据开头;这就是自解压可执行文件的工作原理(可执行 ZIP 文件在运行时会自行解压)。
svg2png
JAR 文件也是如此,但带有前置的 shell 脚本:
#!/bin/sh
exec java -Xmx1G -jar "$0" "$@"
运行时,这将运行一个 shell,然后将其自身替换为java -Xmx1G -jar
“脚本”的名称(svg2png
使用任何使用的路径)以及任何参数。在本例中,-Xmx1G
设置堆大小,并-jar
告诉 JVM“运行”给定的 JAR 文件。svg2png
其余的svg2png
是 JAR 文件;特别是,它包含以下清单:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: sterlp
X-Compile-Target-JDK: 1.8
X-Compile-Source-JDK: 1.8
Created-By: Apache Maven 3.3.3
Build-Jdk: 1.8.0_51
Main-Class: org.sterl.svg2png.Main
这指示 JVM 运行该类org.sterl.svg2png.Main
,从而启动该程序。
您将找到有关 ZIP 格式的更多详细信息在维基百科上,特别是结构描述,显示该格式如何允许在文件开头(以及其他位置)放置任意数据。 ZIP 文件由其“中心目录”标识,该目录位于结束文件的。