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 固件 | ❌ |
已实测能做到的事:
- 体积变小:某易语言程序 684032 → 425984 字节(约 62%)。注意这是大文件的效果;
- 图标、版本版权保留:资源节默认不压缩,磁盘图标、文件属性里的版本/版权、运行时窗口标题栏图标与原程序一致;
- 导入表 / 重定位 / TLS 正常还原:自编译测试目标(含导入、重定位、TLS、版本资源)在 x86 与 x64 上加壳后,标准输出与退出码与原件完全一致;
- DLL 可正常加载调用:x86/x64 DLL 加壳后
LoadLibrary/GetProcAddress/ 调用 / 线程通知转发 /FreeLibrary均正常; - 一键解压还原:随时把加壳产物还原成与原件逐字节一致的原始文件(x86/x64 的 EXE 与 DLL 均已验证 0 字节差异)。
一句话:它是"压缩瘦身 + 提高随手破解门槛"的工具,不是防逆向的方案。 下面第五节会把保护强度说清楚,建议先看。
二、它做不到什么(请先看这节)
-
它自带完美脱壳还原器。 ARMOR 提供
--unpack参数,能一键还原出与原文件逐字节一致的原始程序。这意味着任何人拿到你的加壳产物和 ARMOR,都能还原出原始程序。它不能防住"有心人",只能挡住"随手拖进静态分析器"。 -
"加密"是混淆,不是密码学保护。 载荷用 RC4 加密,但 RC4 密钥以明文形式存放在
ARMOR_HEADER.key字段里。它的作用是让 IDA 等工具无法直接看到原始字符串,而不是抵御知道格式的逆向者。 -
反调试是可绕过的常规检测。 检测点包括 PEB
BeingDebugged、NtGlobalFlag、IsDebuggerPresent、NtQueryInformationProcess(DebugPort / DebugObjectHandle / DebugFlags)、调试器窗口名与进程名、计时。这些都是公开多年的成熟检测点,有经验的逆向者可以 patch 掉。 -
反转储只是提高 dump 门槛。 做法是还原后随机化内存中的节名、清零 DOS stub,PE 头仍可被修复后再 dump。
-
易语言特征隐藏其实只掩盖了已知的特征。 内置约 30 条特征,对命中的特征做 RC4 混淆。它不能让一个易语言程序"不再是易语言程序",只能降低被基于这些规则的工具/规则库直接命中的概率。
-
关于杀软误报:无法保证。 任何加壳都可能触发误报。ARMOR 提供可调参数(自定义节名、开关特征隐藏等),但这些参数能否降低误报,没有任何实测数据支撑,需要你用自己的样本自己测。
-
小文件加壳会变大。 外壳本身约 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 图标上就完事了,一条命令都不用敲,还能一次拖多个文件。
- 输出:
原文件名_packed.扩展名,和原文件放一起(app.exe→app_packed.exe); - x86 / x64 / EXE / DLL 全自动识别,DLL 不用额外加参数;
- 默认参数:压缩开(级别 6)、易语言特征隐藏开(auto),另外默认还有载荷加密、反调试、反转储、CRC 校验、保留资源节(图标/版本版权不丢);
- 加壳结束窗口直接关闭,不等按键;结果写进日志文件
ArmorCLI.log(和被加壳文件同一个目录,追加记录,UTF‑8)。
每次拖放一段,记着:时间、输入/输出路径、体积和压缩比、架构与类型、载荷大小、特征隐藏统计、耗时;失败的会写清楚原因。 - 已经加过壳的文件会被拒绝并写进日志,防止重复加壳把体积越滚越大。
命令行下 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 会明确拒绝并说明原因 |
九、注意事项
-
加壳前先备份原文件。 虽然有
--unpack可逐字节还原,但先备份是更稳妥的习惯; -
它的定位是"提高门槛"不是"防破解"。 自带脱壳器、密钥在文件头、反调试可绕过——请在第二节的边界内使用它,配合正版授权校验、服务端验证等手段;
-
杀软误报需自行实测。 可用
--section-prefix=、--hide-features=none等参数调整,但效果没有保证; -
调试自己的程序时加
--anti-debug=none(默认是检测到调试器就退出); -
DLL 加壳需
--allow-dll;DLL 模式下--anti-dump会自动跳过,这是正常设计(宿主进程和GetProcAddress仍需读取 PE 头); -
逐个样本验证。 本项目自测覆盖有限(x86/x64 的 EXE 与 DLL,含导入表、重定位、TLS、版本资源的样本)。你的程序是否在覆盖范围内,请加壳后实际运行验证。
十、获取与使用
- 作者:byHandsome
- 完全自研免费授权使用,只需要一个
ArmorCLI.exe(bin\Win32\Release\与bin\x64\Release\各一份,二者功能相同,都能给 x86 与 x64 目标加壳),无需安装任何依赖;右键文件属性即可看到公司名与版权信息; - 命令行下
ArmorCLI version会输出版本号、作者与版权:
C:\> ArmorCLI version
ARMOR 2.0.0
作者 : byHandsome
Copyright (c) 2026 byHandsome
支持 : x86 (PE32) / x64 (PE32+) 的 EXE 与 DLL
- 命令行风格,Windows 下直接运行,支持中文路径;
- 参数可写进配置文件批量复用,适合接入你自己的发布流程;
- 交流 QQ 群:647765957
- 【下载地址 Armor v2.0】
已验证:x86/x64 EXE 加壳后输出与退出码一致、脱壳逐字节一致;x86/x64 DLL 加载调用与线程通知正常、脱壳逐字节一致;宿主位宽与目标架构无关。
仍在持续迭代,欢迎交流反馈。请注意第二节的能力边界,不要把它当成防逆向方案。