
Blenny 是一款面向 Windows 的概念验证型载荷混淆工具,它可以将可执行载荷数据隐藏在可执行文件的图标中。其名称来源于剑齿鳚,这种鱼会模仿清洁鱼的行为和外貌,以捕食毫无防备的鱼类。
我已经记不清故事的具体经过,但一位名叫 retr0id(@DavidBuchanan314)的黑客提出了将载荷隐藏在可执行文件图标中的想法。由于 PNG 文件的种种特殊性质,再加上 Windows 图标文件可以包含 PNG 数据,我意识到可以相当轻松地实现这个想法,只是需要费些功夫。为此,我创建了 Facade 库——一个专门用于在 PNG 文件中生成载荷的库。
最终成果是一个紧凑的载荷文件和构建系统,可用于定制面向 Windows 的基础投放器/执行器载荷。
Blenny 使用 Facade 库 从图标文件创建载荷,因此在获取仓库时,需要初始化子模块(及其子模块):
$ git clone https://github.com/frank2/blenny.git
$ cd blenny
$ git submodule update --init --recursive
这就是初始化仓库以进行构建所需的全部操作。
这个项目从设计上就是为 CMake 而生的,因此在构建此项目之前,你绝对需要获取并安装 CMake。否则项目很可能无法正常工作(除非你真的愿意手动设置所有这些 CMake 定义)。你还需要一份 Visual Studio 来编译该项目。
此项目使用大量 CMake 变量来配置构建过程。要获得一个基本的演示载荷——一只可爱的小羊朋友会出现在你的桌面上——你可以在项目主目录中运行以下命令:
$ mkdir build
$ cd build
$ cmake -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
$ ./Release/blenny.exe
默认情况下,它会从可执行文件的图标中提取一个名为“blenny.exe”的可执行文件到当前用户的临时目录,然后执行它。默认载荷是 @AdrianoTiger 的 DesktopPet,这是对 90 年代经典 esheep.exe 的专门重建。
实现这一切的所有变量都是可定制的!必须设置一个载荷变量(BLENNY_TRAILING_PAYLOAD、BLENNY_TEXT_PAYLOAD、BLENNY_ZTEXT_PAYLOAD 或 BLENNY_STEGO_PAYLOAD)。该变量控制载荷最终如何被塞入图标中。有关这些技术的详细信息,请参阅 Facade 库。例如,要使用自己的载荷,请执行以下操作:
$ cmake -D BLENNY_PAYLOAD_FILE="path/to/your/payload.exe" -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
以下是所有可配置项、默认值及作用的表格。
| 标志 | 类型 | 默认值 | 用途 |
|---|
| BLENNY_PAYLOAD_FILE | 字符串 | "${PROJECT_SOURCE_DIR}/res/defaultpayload.exe" | 要嵌入到图标文件中的载荷。注意: 由于最终执行技术是 ShellExecuteA,因此它可以是任何能从文件资源管理器启动的文件,例如批处理脚本! |
| BLENNY_ICON_FILE | 字符串 | "${PROJECT_SOURCE_DIR}/res/defaulticon.ico" | 用作可执行文件的图标,并在其中嵌入载荷。注意: 并非所有图标都适用!图标文件中必须包含 PNG 图像数据。请在十六进制编辑器中检查目标图标的数据,确认其中是否包含 PNG 图像! |
| BLENNY_TRAILING_PAYLOAD | 布尔型 | OFF | 启用图标 PNG 文件中的尾部数据载荷。 |
| BLENNY_TEXT_PAYLOAD | 布尔型 | OFF | 启用图标 PNG 文件中的 tEXt 数据块载荷。 |
| BLENNY_ZTEXT_PAYLOAD | 布尔型 | OFF | 启用图标 PNG 文件中的 zTXt 数据块载荷,这是一种经过压缩的 tEXt 载荷。 |
| BLENNY_STEGO_PAYLOAD | 布尔型 | OFF | 启用图标 PNG 文件中的隐写载荷。注意: 由于大多数图标的图像大小被限制为 256x256,并非所有载荷都能通过此选项容纳! |
| BLENNY_PAYLOAD_KEYWORD | 字符串 | "blenny" | 对于 text/ztext 载荷,设置用于标记载荷数据的关键字。 |
| BLENNY_ADMIN | 布尔型 | OFF | 启用 runas 关键字,以管理员身份运行载荷。 |
| BLENNY_PATH | 字符串 | "%TEMP%" | 执行前存放载荷的路径。环境变量将在执行时展开。 |
| BLENNY_FILENAME | 字符串 | "blenny" | 提取时为载荷指定的文件名。 |
| BLENNY_RANDOM_FILENAME | 布尔型 | OFF | 启用后,在提取时为载荷生成随机文件名。 |
| BLENNY_RANDOM_FILENAME_LENGTH | 整型 | 8 | 调整随机文件名的长度。 |
| BLENNY_RANDOM_FILENAME_RANDOM_LENGTH | 布尔型 | OFF | 在提取时让文件名具有随机长度。 |
| BLENNY_PAYLOAD_ARGS | 字符串 | "" | 执行时传递给载荷文件的参数。 |
| BLENNY_FILE_ATTRIBUTES | 整型 | 0x80 (即 FILE_ATTRIBUTE_NORMAL) | 创建文件时赋予该文件的文件属性。 |
| BLENNY_CMD_SHOW | 整型 | 5 (即 SW_SHOW) | 执行时载荷文件的显示方式。另一个示例是 SW_HIDE,其值为 0。 |