CleasbyCode/pdvzip
GitHub: CleasbyCode/pdvzip
将 ZIP 或 JAR 文件嵌入 PNG 图片中创建可执行的多语言文件,支持在社交媒体平台分享后保留嵌入数据并自动提取执行。
Stars: 58 | Forks: 3
# pdvzip
将 ***ZIP*** 或 ***JAR*** 文件嵌入到 ***PNG*** 图像中,以创建***可在推特上发布的***和“[*可执行*](https://github.com/CleasbyCode/pdvzip#extracting-your-embedded-files)”的 ***PNG*** 多语言文件。
在 ***X-Twitter*** 及其他一些兼容平台上分享该图像,这些平台会保留嵌入的归档文件。
*注意:出于兼容性原因,请***不要***使用加密或受密码保护的 ZIP 文件。*
这里还有一个 [***Web 版***](https://cleasbycode.co.uk/pdvzip/app/),你可以立即使用,作为下载和编译 CLI 源代码的便捷替代方案。Web 文件上传限制为 **20MB**。
基于 [***David Buchanan***](https://www.da.vidbuchanan.co.uk/) 的类似想法,源自他最初的 ***Python*** 程序 [***tweetable-polyglot-png***](https://github.com/DavidBuchanan314/tweetable-polyglot-png),
***pdvzip*** 使用不同的方法在 ***PNG*** 图像中[***存储***](https://github.com/CleasbyCode/pdvzip#png-image-requirements-for-arbitrary-data-preservation)和[***提取***](https://github.com/CleasbyCode/pdvzip#extracting-your-embedded-files)嵌入文件。

***致谢:*** *Image* - [***@KCP228***](https://x.com/KCP228) *PowerShell 脚本* - [***@gierrofo***](https://x.com/gierrofo)
***Linux/Windows*** 提取脚本存储在 ***PNG*** 图像的 ***iCCP*** 块中。嵌入的 ***ZIP/JAR*** 文件存储在它自己的 ***IDAT*** 块中,这将是图像文件的最后一个 ***IDAT*** 块。
使用 ***pdvzip***,你可以嵌入最大为 ***2GB**(封面图像 + 归档文件)的 ***ZIP/JAR*** 文件。下面列出的兼容站点有其自己的***更小的***大小限制。
## 兼容平台
*发布大小限制由封面图像 + 压缩数据文件的组合大小来衡量。*
* ***X-Twitter*** (**5MB**)、***Flickr*** (**200MB**)、***ImgBB*** (**32MB**)、***PostImage*** (**32MB**)、***ImgPile*** (**8MB**)。
*图像尺寸限制:*
* ***PNG-32/24*** (*真彩色*) **68x68** 最小 - **900x900** 最大。
* ***PNG-8*** (*索引颜色*) **68x68** 最小 - **4096x4096** 最大。
## 使用方法 (Linux)
```
$ chmod +x compile_pdvzip.sh
$ ./compile_pdvzip.sh
Compiling pdvzip...
Compilation successful. Executable 'pdvzip' created.
$ sudo cp pdvzip /usr/bin
$ pdvzip
Usage: pdvzip
pdvzip --info
$ pdvzip my_cover_image.png document_pdf.zip
Created PNG-ZIP polyglot image file: pzip_55183.png (4038367 bytes).
Complete!
$ pdvzip my_cover_image.png hello_world.jar
Created PNG-JAR polyglot image file: pjar_19662.png (1016336 bytes).
Complete!
```
## 提取嵌入的文件
**重要提示:** 从 ***X-Twitter*** 保存图像时,请点击帖子中的图像以***完全展开它***,然后再进行保存。
以下部分涵盖了嵌入的 ***ZIP*** 文件的提取。***JAR*** 文件将在稍后介绍。
***pdvzip***(适用于 ***Linux***)将尝试为新创建的多语言图像文件***自动设置可执行权限***。
对于从托管站点下载或从另一台机器复制的这些多语言图像,你需要使用 ***chmod*** 手动设置可执行权限。
https://github.com/user-attachments/assets/8feca575-b135-4f58-839a-2159fce09b44
https://github.com/user-attachments/assets/77472a02-52dd-4a5c-a035-b30dcc842cce
https://github.com/user-attachments/assets/a143e694-31f5-4235-ace1-30217fe8ab41
***Linux - 使用 bash (或 sh) shell 环境。***
```
$ ./pzip_55183.png
```
**对于任何其他 Linux shell 环境,你可能需要调用 bash (或 sh) 来运行该图像文件。**
```
mx% bash ./pzip_55183.png
```
替代提取方法(***Linux***)。使用 ***wget*** 直接从托管站点下载并运行该图像。
***X-Twitter*** ***wget*** 示例:**嵌有 python 脚本的图像**。
```
$ wget -O Fibo.png "https://pbs.twimg.com/media/GLXTYeCWMAAA6B_.png";chmod +x Fibo.png;bash ./Fibo.png
```
**Windows** ***(将图像文件扩展名重命名为 '.cmd')***
```
G:\demo> ren pzip_55183.png pzip_55183.cmd
G:\demo> .\pzip_55183.cmd
```
替代提取方法(***Windows***)。使用 ***iwr*** 直接从托管站点下载并运行该图像。
***Flickr*** ***iwr*** 示例:**嵌有 mp4 视频文件的图像。**
```
iwr -o swing.cmd "https://live.staticflickr.com/65535/54025688614_2f9d474cba_o_d.png";.\swing.cmd
```
在桌面打开 ***.cmd*** 文件时,在首次运行时,***Windows*** 可能会显示安全警告。
点击“***更多信息***”然后选择“***仍要运行***”以清除该警告。
为避免安全警告,请从 ***Windows 控制台***运行该文件,如上述示例所示。
***ZIP 归档文件中首先出现在 ZIP 文件记录中的文件(或文件夹)决定了基于文件类型使用哪种提取脚本。***
对于常见的***视频和音频***文件,***Linux*** 将首先尝试使用媒体播放器 ***mpv***,如果没有 ***mpv*** 则使用 ***vlc***。***Firefox*** 作为最后手段。***Windows*** 使用默认媒体播放器。
***PDF*** - ***Linux*** 将使用 ***evince*** 或 ***firefox***。***Windows*** 使用默认的 ***PDF*** 查看器。
***Python*** - ***Linux*** 和 ***Windows*** 使用 ***python3*** 来运行这些程序。
***PowerShell*** - ***Linux*** 使用 ***pwsh***(如果已安装),***Windows*** 使用 ***powershell.exe*** 或 ***pwsh.exe*** 来运行这些脚本。
***文件夹*** - ***Linux*** 使用 ***xdg-open***,***Windows*** 使用 ***powershell.exe*** 及 II(***Invoke-Item***)命令来打开压缩文件夹。
对于你的 ***ZIP*** 文件中的任何其他文件类型,***Linux*** 和 ***Windows*** 将依赖操作系统设置的默认方法/应用程序。显然,压缩/嵌入的文件需要与运行它的操作系统兼容。
如果归档文件是 ***JAR***,或者 ***ZIP*** 归档中的压缩文件类型是 ***PowerShell***、***Python***、***Shell 脚本***或 ***Windows/Linux 可执行文件***,***pdvzip*** 将为你提供选项,以便根据需要为你的文件提供命令行参数。
***命令行参数***将被添加到嵌入在你的 ***PNG*** 封面图像的 ***iCCP*** 块中的 ***Linux/Windows*** 提取脚本中。
确保将包含空格的参数(例如文件和目录名)括在“引号”内。例如。
```
$ ./pdvzip my_cover_image.png jdvrif_linux_executable.zip
For this file type you can provide command-line arguments here, if required.
Linux: -e ../my_cover_image.jpg "../my document file.pdf"
```
此外,请注意,当对压缩的 ***ZIP*** 文件类型(非 ***JAR***)使用参数时,你始终是在一个新创建的名为“***pdvzip_xxxx (例如 pdvzip_5444)***”的子目录中进行操作。
https://github.com/user-attachments/assets/e55e9671-423c-4439-89e6-356c0080b4c1
https://github.com/user-attachments/assets/8d6d97c1-4c70-4f60-bba5-b01fad08b60e
要仅获取 ***ZIP*** 归档中的文件,请将“***.png***”文件扩展名重命名为“***.zip***”。
将 ***ZIP*** 归档视为只读,不要在 ***PNG-ZIP*** 多语言文件中添加或删除文件。
## 执行嵌入的 Java 程序
***Linux 选项 1:***
```
$ java -jar pjar_19662.png
Note: If you use this method to run your embedded Java program, you will have to manually add command-line
arguments (if required) to the end of the command, as your embedded arguments will not work with
this method. e.g.
user1@mx:~/Desktop$ java -jar ./pjar_19662.png -u john_s -a 42 -f "John Smith"
```
***Linux 选项 2a,使用 bash (或 sh) shell 环境:***
```
$ ./pjar_19662.png
Note: This method will execute the embedded Java program and also use any embedded
command-line arguments with the Java program.
```
***Linux 选项 2b,使用任何其他 shell 环境,你需要调用 bash (或 sh) 来执行图像:***
```
mx% bash ./pjar_19662.png
```
***Windows 选项 1:***
```
PS C:\Users\Nick\Desktop\jar_demo> java -jar .\pjar_19662.png
Note: If you use this method to run your embedded Java program, you will have to manually add command-line
arguments (if required) to the end of the command, as your embedded arguments will not work with
this method. e.g.
PS C:\Users\Nick\Desktop\jar_demo> java -jar .\pjar_19662.png -u john_s -a 42 -f "John Smith"
```
***Windows 选项 2:***
```
PS C:\Users\Nick\Desktop\jar_demo> ren .\pjar_19662.png .\pjar_19662.cmd
PS C:\Users\Nick\Desktop\jar_demo> .\pjar_19662.cmd
Note: This method will execute the embedded Java program and will also use any
embedded command-line arguments with the Java program.
```
https://github.com/user-attachments/assets/9451ad50-4c7c-4fa3-a1be-3854189bde00
## 随意数据保存的 PNG 图像要求
***PNG*** 文件大小(图像 + 归档文件)不得超过平台的大小限制。
该站点要么会拒绝上传你的图像,要么会将你的图像转换为 ***jpg***,例如 ***X-Twitter***,
这样你就会丢失嵌入的内容。
***尺寸:***
***PNG-32/24 (真彩色)***
图像尺寸可以设置为 **68 x 68** 最小值和 **900 x 900** 最大值之间。
***注意:*** *被检测为 ***PNG-32/24 真彩色(颜色类型 6 或 2)***
且颜色少于 257 种的封面图像,
将由 ***pdvzip*** 转换为 ***PNG-8 索引颜色(颜色类型 3)*** 图像。
出于兼容性原因执行此操作,因为它应该能防止 ***X-Twitter*** 等平台
也转换你的图像,这会导致嵌入的归档文件丢失。*
***PNG-8 (索引颜色)***
图像尺寸可以设置为 **68 x 68** 最小值和 **4096 x 4096** 最大值之间。
***PNG 块:***
例如,在 ***X-Twitter*** 上,你可以用随意数据***溢出填充***以下 ***PNG*** 块,
只要保持在图像尺寸和文件大小的限制内,平台就会保留这些数据。
***bKGD, cHRM, gAMA, hIST,*** *iCCP (大小受限的块。在 X-Twitter 上最大为 10KB)*,
***IDAT (作为最后一个 IDAT 块使用,位于最终图像 IDAT 块之后),
PLTE (仅与 ***PNG-32/24*** 图像一起使用),
pHYs, sBIT, sPLT, sRGB,*** *tRNS (仅与 PNG-32 图像一起使用).*
*其他平台在保留哪些块以及可以溢出填充哪些块方面可能会有所不同。*
***pdvzip*** 使用 ***iCCP***(存储提取脚本)和 ***IDAT***(存储 ***ZIP/JAR*** 文件)块来存储你的随意数据。
## ***ZIP/JAR*** 文件大小及其他重要信息
要计算出最大的 ***ZIP/JAR*** 文件大小,请从大小限制开始,减去图像大小,再减去 ***1500*** 字节(提取脚本大小)。
***X-Twitter*** 示例:(**5MB** 限制) **5,242,880** - (**307,200** [图像] + **1500** [提取脚本]) = **4,934,180 bytes** 可用于你的 ***ZIP/JAR*** 文件。
* 确保你的 ***ZIP/JAR*** 文件是标准的 ***ZIP/JAR*** 归档文件,兼容 ***Linux*** 的 unzip 和 ***Windows*** 的资源管理器。
* 不要在主 ***ZIP*** 归档中包含多个 ***.zip*** 文件。(***.rar*** 文件可以)。
* 不要在主 ***ZIP*** 归档中包含其他由 ***pdvzip*** 创建的 ***PNG*** 图像文件,因为它们本质上是 ***.zip*** 文件。
* 始终为你的 ***ZIP*** 归档中的文件使用文件扩展名:***my_doc.pdf***、***my_video.mp4***、***my_program.py*** 等。
***ZIP*** 归档中没有扩展名的文件将被视为 ***Linux*** 可执行文件。
## 一个包含 8 个文件的可发推 PNG Polyglot

https://github.com/user-attachments/assets/d1b5888c-fe91-4a58-8ad6-731d9165a57c
前阵子我拼凑了一个包含 8 个文件的(可发推)PNG polyglot 文件。我最近又找到了它,所以想在这里分享给大家。
我对这个 polyglot 进行了一些修改,比如改进了 PowerShell 脚本,并使用了嵌入在图像中的不同 MP4 视频文件(该文件由 PowerShell 脚本提取并播放)。
这个 PNG polyglot 文件由图像本身 - PNG、一个网页、ZIP 归档、MP3 音频文件、JAR(可执行 Java 程序)、RAR 归档、PDF 和一个 PS1 (PowerShell) 脚本组成。
要打开并查看 PNG 图像中嵌入的 PDF 文档,只需将文件扩展名更改为 .pdf,在 Windows 下你应该能够使用大多数 Web 浏览器查看该 PDF,例如 Brave、Chrome 和 Firefox。Linux 也是一样的,包括大多数 Linux PDF 查看器。
要播放音频文件,请将扩展名更改为 .mp3,并在 Windows 下使用 VLC 媒体播放器或 Windows 旧版媒体播放器打开该文件。在 Linux 下,请使用 VLC 媒体播放器。
要运行 Java 程序,请将扩展名更改为 .jar。在 Windows 和 Linux 的桌面上,你应该能够直接双击图标来运行它。它应该会在你的桌面上打开并显示计算器应用程序。
要使用 Windows 访问 ZIP 归档,请将扩展名更改为 .zip 并使用 Windows 资源管理器打开它。你也可以 Windows 终端中的 Expand-Archive 命令。在 Linux 下,请使用 CLI 工具 ***unzip***。
要使用 Windows 访问 RAR 归档,请将扩展名更改为 .rar 并使用 WinRAR 应用程序。在 Linux 下,请使用 ***unrar*** CLI 工具(例如 $ unrar e image_file.rar)。
要查看嵌入的网页,只需将文件扩展名更改为 .htm,然后使用任何浏览器打开并查看它。
要在 Windows 上运行嵌入的 PowerShell 脚本,请将文件扩展名更改为 .ps1,并从终端运行以下命令:
```
PS C:\Users\Nick\Desktop> powershell -ExecutionPolicy Bypass -File .\image_file.ps1
```
要在 Linux 上运行 PowerShell 脚本,首先确保你已安装 PowerShell,因为它默认是不安装的。
同样,将文件扩展名更改为 .ps1。从 Linux 终端运行以下命令:
```
$ pwsh ./image_file.ps1
```
PowerShell 脚本将提取并播放嵌入在图像中的 MP4 视频文件。
视频致谢:PowerShell 示例中使用的视频文件是 [***@doopiidoop***](https://x.com/doopiidoop) 的作品。
## 第三方库
此项目包含以下第三方库:
- **LodePNG**,作者 Lode Vandevenne
- 许可证:zlib/libpng(参见 [***LICENSE***](https://github.com/lvandeve/lodepng/blob/master/LICENSE) 文件)
- 版权所有 (c) 2005-2024 Lode Vandevenne
##
标签:AI合规, DNS 反向解析, DNS 解析, iCCP chunk, IDAT chunk, JAR打包, meg, PNG结构, PNG隐写, Polyglot, Python, Steganography, X-Twitter, ZIP/JAR工具, ZIP隐藏, 信息安全, 图像处理, 多态文件, 应用安全, 数据嵌入, 数据提取, 数据隐藏技术, 文件捆绑, 文件隐藏, 无后门, 社交媒体利用, 网络信息收集, 隐写术工具