ARMOR —— x86 / x64 通用的 PE 压缩保护壳

作者:byHandsome | ArmorCLI.exe 文件属性里的公司名、版权信息,以及 ArmorCLI version 的输出,均带有该署名
支持 x86(32 位)与 x64(64 位),支持 EXE 与 DLL,默认保留图标与版本版权
与 UPX、VMProtect 怎么选?以及它做不到什么

一、ARMOR 是什么

ARMOR 是一款针对 Windows PE 程序(尤其易语言静态编译程序)压缩 + 入门级保护 壳:一条命令,把原始 EXE(或 DLL)变成加壳后的文件。

支持范围(按 PE 格式自动判定,不看扩展名):

输入 支持
x86(PE32)EXE / x64(PE32+)EXE
x86 / x64 DLL ✅(需--allow-dll
扩展名是.com / .scr 等、但本身是 x86/x64 PE 的文件
内核驱动.sys / Native 子系统
.NET 程序(含 CLR 头)
16 位 DOS COM / DOS MZ / Win3.x NE
ARM / ARM64 / IA64 等其它架构的 PE、EFI 固件

已实测能做到的事:

一句话:它是"压缩瘦身 + 提高随手破解门槛"的工具,不是防逆向的方案。 下面第五节会把保护强度说清楚,建议先看。

二、它做不到什么(请先看这节)

为了不误导,把边界写在前面:
  1. 它自带完美脱壳还原器。 ARMOR 提供 --unpack参数,能一键还原出与原文件逐字节一致的原始程序。这意味着任何人拿到你的加壳产物和 ARMOR,都能还原出原始程序。它不能防住"有心人",只能挡住"随手拖进静态分析器"。

  2. "加密"是混淆,不是密码学保护。 载荷用 RC4 加密,但 RC4 密钥以明文形式存放在ARMOR_HEADER.key 字段里。它的作用是让 IDA 等工具无法直接看到原始字符串,而不是抵御知道格式的逆向者。

  3. 反调试是可绕过的常规检测。 检测点包括 PEB BeingDebuggedNtGlobalFlagIsDebuggerPresentNtQueryInformationProcess(DebugPort / DebugObjectHandle / DebugFlags)、调试器窗口名与进程名、计时。这些都是公开多年的成熟检测点,有经验的逆向者可以 patch 掉。

  4. 反转储只是提高 dump 门槛。 做法是还原后随机化内存中的节名、清零 DOS stub,PE 头仍可被修复后再 dump。

  5. 易语言特征隐藏其实只掩盖了已知的特征。 内置约 30 条特征,对命中的特征做 RC4 混淆。它不能让一个易语言程序"不再是易语言程序",只能降低被基于这些规则的工具/规则库直接命中的概率。

  6. 关于杀软误报:无法保证。 任何加壳都可能触发误报。ARMOR 提供可调参数(自定义节名、开关特征隐藏等),但这些参数能否降低误报,没有任何实测数据支撑,需要你用自己的样本自己测

  7. 小文件加壳会变大。 外壳本身约 32 KB(x86)/ 36 KB(x64),几 KB 的小程序加壳后体积会明显增加。压缩收益只对较大的程序成立。

三、核心特性一览

# 特性 状态
1 x86 / x64 双架构:同一条命令,按 PE 格式自动选择外壳与产物格式 ✅ 已实测
2 EXE / DLL 加壳:DLL 保留导入/导出/重定位表 ✅ 已实测
3 压缩:自研 DEFLATE(zlib 兼容),级别 1..9 ✅ 已实测
4 保留图标与版本版权:资源节默认不压缩 ✅ 已实测
5 一键解压还原:还原结果与原文件逐字节一致 ✅ 已实测
6 载荷 RC4 混淆:密钥在文件头明文,属混淆非强加密 ⚠️ 见第二节
7 反调试:PEB / API / 窗口 / 进程名 / 计时,两档强度 ⚠️ 可绕过
8 反转储:还原后混淆内存 PE 头与节名 ⚠️ 可绕过
9 易语言特征隐藏:内置约 30 条规则,RC4 混淆命中字符串 ⚠️ 仅掩盖已知的特征
10 载荷 CRC 校验:防止产物被篡改(校验值同样在文件头,防篡改不等于防篡改绕过)
11 自定义产物节名.arm0/.armr/.arm1.shield0/...,避开固定特征串
12 配置文件:参数写进 INI,--config= 复用,命令行可覆盖
13 拖放加壳:把 EXE / DLL 直接拖到 ArmorCLI.exe 上即按默认参数加壳(保留压缩与特征隐藏),加壳后的文件名: 原名_packed.扩展名 ✅ 已实测
14 完全零依赖:日常使用只需一个 ArmorCLI.exe(x86 与 x64 版都能给两种架构加壳)

四、快速上手

最省事:直接拖

把 EXE 或 DLL 拖到 ArmorCLI.exe 图标上就完事了,一条命令都不用敲,还能一次拖多个文件。

命令行下 ArmorCLI.exe <文件路径> 走的是同一套逻辑:

ArmorCLI.exe app.exe
ArmorCLI.exe a.exe b.dll        :: 一次处理多个
拖放模式固定使用上面的默认参数,不读 armor.ini。想调压缩级别、节名前缀、反调试强度这些,用下面的命令行。

命令行

::: x86 程序
ArmorCLI.exe pack 你的程序.exe 你的程序_packed.exe
::: x64 程序(同一条命令,外壳自动切换为 x64 版)
ArmorCLI.exe pack app64.exe app64_packed.exe
::: DLL(x86 / x64 均可)
ArmorCLI.exe pack my.dll my_packed.dll --allow-dll
::: 一键解压还原
ArmorCLI.exe unpack 你的程序_packed.exe 还原.exe
::: 先看目标信息再决定(架构 / 类型 / 将使用的外壳)
ArmorCLI.exe scan 你的程序.exe

默认配置:载荷加密、反调试(exit)、反转储、CRC 校验、易语言特征隐藏(auto)、保留资源节

五、调用参数(完整)

参数 说明 默认
pack <输入> <输出> 加壳
unpack <加壳文件> <还原文件> 一键解压还原(等价--unpack
scan <输入> 只扫描分析,不写文件
--level=N 压缩级别 1..9 6
--encrypt=0|1 载荷 RC4 混淆 1
--anti-debug=none|exit|fake 反调试动作 exit
--anti-debug-level=1|2 反调试强度(2 增加窗口/进程名/计时) 1
--anti-dump=0|1 反转储 1
--hide-features=模式 易语言特征隐藏:auto|none|all|名称;名称 auto
--keep-manifest=0|1 保留清单资源(权限/视觉样式) 1
--keep-rsrc=0|1 资源节不压缩(保留图标/版本版权) 1
--crc=0|1 解包前校验载荷 CRC 1
--force 忽略"重复加壳"等告警
--allow-dll 允许对 DLL 加壳(x86/x64 均可)
--stub=<映像> 使用外部外壳映像(架构须与目标一致) 内嵌
--section-prefix=<前缀> 自定义产物节名前缀(1..6 个字母数字) arm
--unpack 一键解压还原(等价独立子命令unpack
--config=<路径> 从配置文件加载参数(命令行优先)

常用组合:

::: 最高压缩比
ArmorCLI.exe pack app.exe app_packed.exe --level=9
::: 自定义节名 + 增强反调试
ArmorCLI.exe pack app.exe app_packed.exe --anti-debug-level=2 --section-prefix=shield
::: 关闭反调试(自己调试程序时)
ArmorCLI.exe pack app.exe app_packed.exe --anti-debug=none
::: 全部参数写进配置文件复用
ArmorCLI.exe pack app.exe app_packed.exe --config=armor.ini

armor.ini 示例:

level=9
anti-debug=exit
anti-debug-level=2
anti-dump=1
keep-rsrc=1        ; 保留图标/版本版权
crc=1
section-prefix=shield
allow-dll=0        ; 给 DLL 加壳时设为 1
unpack=0           ; 设为 1 时该次调用做一键解压还原

退出码:0 成功、1 参数错误、2 输入输出错误、3 不支持的目标、4 处理失败。

六、与 UPX 的区别

UPX 是应用最广的开源压缩壳。先说结论:如果你只要"压小",UPX 通常是更好的选择——它免费、开源、跨平台跨架构、兼容性经过二十多年全球验证,压缩率在多数样本上也更高。ARMOR 的差异在于它多做了一些保护动作,以及对易语言生态的针对性处理。

维度 ARMOR UPX
定位 压缩 + 载荷混淆 + 反调试 + 反转储 通用压缩壳,主打减小体积
支持架构 x86 / x64 的 PE(不支持 .NET、驱动) 多平台多架构,覆盖面远大于 ARMOR
压缩率 大文件约压到 60%;小文件会因附加外壳而变大 多数样本上更高(请以自己的样本实测)
是否自带一键脱壳 ✅ 自带--unpack(这是刻意的取舍,也说明它不防逆向) upx -d
载荷加密 RC4,密钥明文存在文件头,属混淆 不加密
资源处理 默认保留资源节不压缩 默认一并压缩资源(通常也能正常显示;也可用参数不压资源)
易语言适配 内置特征库与特征隐藏 无针对性处理
成熟度 自用工具,样本覆盖有限 全球广泛使用,兼容性久经验证
费用 免费 开源免费(GPL)
关于"杀软误报":加壳普遍会提高误报概率,UPX 因使用广泛、特征被大量规则库收录而常被标记。这不代表 ARMOR 的误报就一定更低——两者都需要你用自己的样本实测,此处不做保证。

七、与 VMProtect(VMP)的区别

VMProtect 是商业代码虚拟化保护壳。如果目标是真正防逆向核心逻辑,VMP 是量级更高的方案,ARMOR 不能替代它。

维度 ARMOR VMProtect
保护思路 压缩 + 载荷混淆 + 反调试 + 反转储(解壳后原生执行 代码虚拟化 + 指令混淆 + 授权管理
保护强度 入门级:挡"随手静态分析",挡不住有经验的逆向者(且自带脱壳器) 商业级:可显著提高核心逻辑的逆向成本
体积 大文件变小;小文件变大 通常增大(虚拟化代码膨胀)
运行开销 启动期解压一次,之后原生执行 虚拟化部分解释执行,开销取决于虚拟化范围
兼容性风险 相对小(保留资源、开关可控),但仍需逐个样本验证 反调试/反虚拟机检测更激进,兼容问题与误报更常见
费用 免费 商业付费授权

两者不冲突:可以用 ARMOR 做整体瘦身,再对最关键的算法/逻辑用 VMP 虚拟化——一个管体积,一个管核心。但要注意反过来是没用的:先用 VMP 再套 ARMOR,会让 ARMOR 的脱壳器把 VMP 壳整个还原出来。

八、怎么选

需求 推荐 说明
只求把程序压小 UPX 压缩率、成熟度、平台覆盖都优于 ARMOR
压小 + 默认保住图标/版本 + 挡住随手静态分析 ARMOR 这是它最主要的适用场景
给易语言程序加壳 ARMOR 内置特征隐藏 + 资源默认保留
给 DLL 加壳(x86/x64) ARMOR --allow-dll,导出/导入/重定位表保留
核心算法高强度防逆向 VMProtect ARMOR 做不到,别指望它
内核驱动.sys / .NET 程序 都不行 ARMOR 会明确拒绝并说明原因

九、注意事项

  1. 加壳前先备份原文件。 虽然有 --unpack 可逐字节还原,但先备份是更稳妥的习惯;

  2. 它的定位是"提高门槛"不是"防破解"。 自带脱壳器、密钥在文件头、反调试可绕过——请在第二节的边界内使用它,配合正版授权校验、服务端验证等手段;

  3. 杀软误报需自行实测。 可用 --section-prefix=--hide-features=none 等参数调整,但效果没有保证;

  4. 调试自己的程序时--anti-debug=none(默认是检测到调试器就退出);

  5. DLL 加壳--allow-dll;DLL 模式下 --anti-dump 会自动跳过,这是正常设计(宿主进程和 GetProcAddress 仍需读取 PE 头);

  6. 逐个样本验证。 本项目自测覆盖有限(x86/x64 的 EXE 与 DLL,含导入表、重定位、TLS、版本资源的样本)。你的程序是否在覆盖范围内,请加壳后实际运行验证。

十、获取与使用

C:\> ArmorCLI version
ARMOR 2.0.0
作者    : byHandsome
Copyright (c) 2026 byHandsome
支持    : x86 (PE32) / x64 (PE32+) 的 EXE 与 DLL
已验证:x86/x64 EXE 加壳后输出与退出码一致、脱壳逐字节一致;x86/x64 DLL 加载调用与线程通知正常、脱壳逐字节一致;宿主位宽与目标架构无关。
仍在持续迭代,欢迎交流反馈。请注意第二节的能力边界,不要把它当成防逆向方案。