简介:Detect It Easy(DIE)是一款专业且免费的查壳工具,定位为替代老牌PEID的进阶选择,适合逆向分析初学者与安全爱好者。与PEID相比,它检测能力更强,能一次识别多层加壳,并支持超大文件读取、自定义脚本与插件扩展,兼容多平台。这份资源打包了DIE的完整绿色版,共1362个文件,体积约13.55MB,主要文件类型包括大量检测签名(sg)、可执行程序(exe)、动态库(dll)以及HTML帮助文档、Qt界面与语言文件(qm/qss)等,无需安装即可使用。目前已有4147人学习下载,社区认可度较高。通过该资源可立即获得开箱即用的多语言查壳环境,省去自行配置签名库的麻烦,适合需要频繁查壳、比PEID更高效准确的分析场景。
1. 查壳工具 DIE:为什么我把它放在 PEID 前面
先用一句话说结论:PEID 查不到的壳,DIE(Detect It Easy)大概率能查到;PEID 打开就卡死的文件,DIE 照样能读。这不是夸张,是我把同一个加了多重壳的样本分别丢给两把工具实测后的结果。PEID 在 2006 年前后确实是查壳的代名词,但它的特征库和扫描逻辑停在了那个时代,面对 VMProtect、Themida 的新版本以及各种魔改壳,经常只能给出一个“未知”或者干脆报错。DIE 不一样,它是把“扫特征”和“看数据”两件事结合着做的,特征库更新到近年,还支持脚本二次验证,查壳结果能精确到编译器、加壳工具、甚至加壳工具的版本号。这篇文章不讲大道理,就讲 DIE 怎么装、怎么查、怎么写脚本,以及我在实际拆样本时踩过的那些坑。
2. 从 PEID 到 DIE:检测原理和选型理由
PEID 的核心玩法叫“特征码匹配”:它拿目标文件的一段字节序列,去和 userdb.txt 文本库里记录的已知壳特征做比对,命中就报壳名。这个机制简单直接,但有两个致命弱点。一是特征库太老,新壳、魔改壳基本没见过;二是纯文本行扫描误报率不低,某个开源压缩壳的特征如果恰好出现在一段正常代码里,PEID 就会神经质地报错。
DIE 把检测逻辑拆成了两层:第一层是它的“签名库”,这个库不是简单文本行,而是按 PE、ELF、Mach-O 文件格式的结构化条目来组织的,每条签名可以指定文件偏移、字节掩码、熵值范围等条件;第二层是“启发式和熵分析”,当文件头部被破坏或者壳的入口点被抹掉时,DIE 会计算整个文件或者指定区块的信息熵,结合入口点代码特征做判断。这就是为什么它能做到“查一次查到底”——壳的签名壳在表层,但壳的代码密度、加密段落的熵值分布是藏不住的。
2.1 为什么 DIE 敢说自己能替代 PEID
我做了个对比测试,找了五个常见场景:UPX 壳、ASPack 壳、VMProtect 加壳的 DLL、一个 2GB 的镜像文件、还有一个 PEID 一打开就报“Unknown”的混淆过的 exe。PEID 的测试结果里,UPX 和 ASPack 能识别,VMProtect 只能识别到旧版本号,2GB 文件直接无法打开,混淆 exe 报未知。DIE 在这些场景里的表现是:UPX 和 ASPack 精确到版本号,VMProtect 识别到对应版本,2GB 文件打开和扫描都正常,混淆 exe 给出了“可能为 Themida”的启发式结果。
这里的关键差异在文件读取机制。PEID 用的是传统的文件映射方式,大文件容易在内存映射阶段就出问题;DIE 用的是分段读取结合流式扫描,只有必要时才把整个文件载入内存。配合它的“熵值检测”逻辑,即使文件达到数 GB,也能先看文件头、再看分段熵值分布来决定要不要深扫,这就是它敢说“其他工具打不开的它都能读取”的技术底气。
2.2 安装和界面配置:三分钟上手
DIE 是绿色软件,下载对应系统的版本后直接解压就能运行,不需要安装。首次打开时建议做三件事。第一,切语言:菜单 Options -> Language,选简体中文。第二,确认一下右键菜单有没有加上,方便之后在文件上直接右键“扫描”。第三,把皮肤调成你顺眼的深浅色,这个无所谓,但 DIE 自带的深色皮肤在高分屏下看十六进制数据比较舒服。
一个实用设置是“检测模式”里的阈值调整。菜单里找到“选项 -> 设置 -> 扫描参数”,把“启发式灵敏度”从默认调到高。这样做会让普通文件的扫描速度慢一点点,但对加了花指令的样本,检测率提升明显。我一般处理可疑样本时用高灵敏度,处理常规软件时用默认值,避免误报。
Options -> Language -> 简体中文 Options -> Skin -> 选择你习惯的主题 Options -> Settings -> 扫描参数 -> 启发式灵敏度 -> High这几步配置的意义在于,DIE 的默认灵敏度是平衡型的,适合日常绿色软件检测;而如果你在处理的是对抗性样本(加壳软件的常见目标),高灵敏度才能触发基于熵值和入口点代码的启发式规则。参数调整后不需要重启,立即生效。
3. 实战上手:用 DIE 扫描文件并读懂结果
检测一个文件最简单的动作就是把它拖进 DIE 主窗口。程序会自动识别文件格式,如果是 PE 文件,会按 DOS 头、NT 头、节表、导入表、导出表、资源段、入口点等结构逐项展示。查壳结果会直接显示在最上方摘要区,通常是“编译器/加壳器: xxx [版本号]”这样的行。
3.1 从拖文件到看懂三行关键结果
拖一个 UPX 加壳的 exe 进去,你会看到类似这样的摘要:
文件: sample.exe 类型: PE32+ (x86-64) / EXE 大小: 153,600 字节 入口点: 0x4010A0 时间戳: 2023-05-12 10:22:33 检测结果: UPX(3.96) [Win32 EXE] .UPX0 .UPX1这里最值得注意的不是“UPX”三个字母,而是括号里的版本号 3.96,以及后面跟着的区块名 .UPX0、.UPX1。区块名直接证明了加壳器留下的痕迹:UPX 的标准做法就是生成 .UPX0、.UPX1 两个区块。如果你看到检测结果只显示“UPX”但区块名不是这个,就要怀疑是不是改过区块名的魔改版本,后面手动脱壳时不能直接用通用脱壳机。
如果是 VMProtect 加壳的文件,DIE 的检测结果可能是:
检测结果: VMProtect(2.13.0) [Win32 DLL] .vmp0 .vmp1VMProtect 的检测原理比 UPX 复杂:DIE 不是靠特征字节命中,而是先识别出入口点处那一段特殊的代码混淆模式(通常是 push + jmp 配合栈帧伪指令),再结合区块名和熵值分布综合判断。如果你手头只有一个新版本 VMProtect 的样本,DIE 有时会给出“VMProtect(unknown version)”,这时不要觉得是没查到,它已经确认了壳家族,只是特征库还没收录对应版本的标识字节。
3.2 十六进制查看器:验证检测结果的第一现场
DIE 内置的十六进制查看器不是摆设,它是验证查壳结果最直接的工具。点击主界面的“Hex”标签页,你会看到文件原始字节和右侧的 ASCII 解码区。在 PE 文件里,第一行的“MZ”头是固定标识,偏移 0x3C 处的四字节指向 PE 头起始位置,PE 头的“PE\0\0”标志后面就是机器类型、节表数量、时间戳等结构。
我之前收到过一个样本,直接拖进 DIE 查壳结果报“未知”,但看十六进制数据时,发现文件中间某个位置出现了连续的 0x90 填充(NOP 指令),而且节表里有两个区块的 RawSize 远大于 VirtualSize——这是典型的手动修改过头部的加壳文件。用“Hex”标签页的搜索功能搜“UPX”字符串,会在资源段找到一个残留的版本信息字符串,于是结论明确:这是 UPX 壳,只是入口点被抹掉了,DIE 的签名匹配落空,但残留字符串暴露了真相。
所以我的习惯是:查壳结果出来后,先去十六进制区扫一眼入口点附近的 50 个字节,再看区块表里的名称和大小关系。这两个动作加起来不超过一分钟,能排除掉大部分误报和漏报情况。
3.3 超大文件扫描的边界在哪
DIE 的“超大文件”能力有一个实际的边界:它能打开和扫描 4GB 以上的 PE 文件,但前提是文件格式本身没坏。我实测过一个 2.8GB 的 exe(某些游戏客户端长这样),PEID 打开直接无响应,DIE 大概花了 10 秒完成扫描,结果指向一个不太常见的保护壳。但当我把一个损坏的 3.5GB 镜像文件丢给它时,DIE 能读取文件头部分,但在后续区块扫描时返回“文件结构异常”的提示。这个提示反而有用,说明这文件被人为改过区块大小或破坏了 PE 结构。
超大文件扫描时有一个设置值得改:默认的“完整扫描”模式在大文件上耗时会很长,建议把“扫描模式”改成“快速模式(头+入口点)”。这会让 DIE 只检查文件头和入口点所在区块,耗时从几分钟降到了几秒。当然代价是漏过隐藏在资源段或重叠区块里的壳特征,所以有疑虑的文件还是切回完整模式再扫一遍。
扫描模式: Full Scan(默认) -> 适合常规文件,结果全面 Head + Entrypoint(快速) -> 适合超大文件,速度优先这个模式切换的核心逻辑在于,大多数壳在加壳时都会把真正的入口点代码改写,而文件头和入口点附近又是壳特征最密集的区域,快速模式先扫这两个位置,能覆盖绝大多数常见壳的识别需求。当你面对的是一大批文件要做初步筛查时,这个开关能节省大量时间。
4. 检测到壳之后:借助 DIE 的扩展能力做深入分析
查壳只是第一步,更关键的是知道这是个什么样的壳、能不能快速脱、能不能提取出原始入口点。DIE 在“查壳识别”之外还自带了三个实用层次:插件系统、脚本系统和十六进制编辑。这三个层次从低到高,正好对应了“批量检测 -> 自定义特征 -> 手动修复文件”三种分析需求。
4.1 插件系统:把 DIE 变成你的检测工作台
DIE 的插件是以 DLL 或 .py 脚本形式存放在插件目录里的。安装插件的路径通常在 DIE 安装目录下的 plugins 文件夹,Windows 版本支持 .dll 插件,跨平台版本则支持 .py 脚本插件。插件能做的最有价值的事情是“自动化脱壳”:比如对 UPX 壳的样本,一个合格的插件可以在检测到 UPX 后直接调用脱壳逻辑,把结果写到指定目录。
插件开发方式不算复杂,如果你会 Python,可以写一个脚本监听文件扫描事件:
# 伪代码示例,展示 DIE 插件的基本逻辑 # 放在 plugins 目录下,DIE 启动时会自动加载 import_die_api() def on_scan_completed(file_path, result): # result 里包含 detection.name、detection.version if result.detection.name == "UPX": unpacker = UPXUnpacker() # 调用外部 upx -d 命令,必须做超时控制 success = unpacker.run(file_path, timeout=30) if success: log("Unpacked: " + file_path)这段代码的逻辑是监听到 UPX 壳就自动触发脱壳操作。实际落地时要注意两点:一是弹出的外部进程必须设置超时,否则遇到自修改壳可能无限等待;二是脱壳是否成功不能只看退出代码,要再回调一次 DIE 的检测接口做二次确认。我一般会在脱壳后用 DIE 重新扫描一次输出文件,确认壳特征消失再交付结果。
对不想写脚本的人来说,DIE 自带的几个标准插件已经够用。插件菜单打开后能看到:文件头扫描增强、导入表分析器、资源提取器。资源提取器对分析安装包类样本很有价值,可以把嵌入的资源段完整导出,省去了自己写解析脚本的时间。
4.2 脚本编写:定义你自己的查壳规则
DIE 的脚本系统是它区别于 PEID 的地方之一。脚本用类似 Python 的语法写在 .py 文件里,可以被扫描引擎调用,用于定义“如果满足某些条件,则判定为某种壳”的自定义规则。官方英文文档把这种机制叫“script signatures”,非常准确——它让壳特征从静态的字节模式进化成了可编程的判断逻辑。
一个常见的脚本场景是检测“伪装成 UPX 的魔改 UPX”:普通 UPX 的特征是入口点附近出现 pushad/popad + jmp 的组合,魔改版会删掉 pushad/popad,但保留 .UPX0 区块和特定的节表属性。用脚本写这个规则:
# 自定义魔改 UPX 检测脚本 # 逻辑:区块名 + 节表属性 + 入口点代码特征综合判断 def detect(data, file_offset, args): # data 是目标文件经过 DIE 预处理后的字节流 # 先检查是否存在 .UPX0 和 .UPX1 两个区块名 has_upx_sections = (data.search_section(".UPX0") and data.search_section(".UPX1")) if not has_upx_sections: return None # 再检查入口点附近是否缺少标准 UPX 的 pushad 指令 entry = data.get_entry_point() bytes_at_entry = data.read_bytes(entry, 10) has_pushad = (bytes_at_entry[0] == 0x60) # pushad opcode # 如果区块名符合但入口点不是标准 pushad,判定为魔改版 UPX if not has_pushad: return { "name": "UPX (modified)", "version": "unknown", "detail": "UPX sections found but entrypoint modified" } return None这段脚本的核心逻辑是拿“区块名”和“入口点代码”做交叉验证。DIE 脚本引擎会把这个函数的返回值直接汇入检测结果。写新规则时,建议先用十六进制查看器确认特征字节的偏移,再写进脚本,不然很容易误报。脚本调试也简单,把写好的 .py 文件放进 scripts 目录,重新扫描目标文件,如果结果里没有出现自定义名称,说明脚本没被加载或条件未触发,可以用 print 到 DIE 的日志窗口辅助排查。
4.3 十六进制编辑:手动修复加壳文件的最后手段
遇到自动脱壳工具失效的情况,DIE 内置的十六进制编辑功能能派上用场。它支持对文件字节做原地修改,改完直接保存。这项能力在做“入口点修复”时最实用——很多壳会把原始入口点(OEP,Original Entry Point)加密存储在某个区块里,自动脱壳机识别不到时,你就可以在十六进制界面里手动定位 OEP 数据,把它填写到 PE 头的 AddressOfEntryPoint 字段。
操作路径是:十六进制标签页 -> 定位到 PE 头偏移(通常是 0x3C 处指示的值)-> 找到 +0x28 处的入口点字段 -> 右键编辑这 4 个字节。处理前务必先备份原文件,并把十六进制编辑器的“写保护”关闭。我做这个操作时惯用一组工具配合:先用 DIE 查壳和看区块表和入口点,再用一个轻量十六进制工具去做修改,改完再回 DIE 验证结构是否完整。DIE 的十六进制编辑适合小幅修改,不适合大段算术操作——大范围的数据修复还是交给专业十六进制编辑器,这是工具的边界。
5. 查壳避坑笔记:现象、原因和解决路径
以下五条是处理真实样本时踩过的坑。每条都是一个闭环:现象 -> 原因 -> 解决,直接照搬能少走弯路。
坑一:DIE 报“无可用信息”,但 PEID 报 UPX
- 现象:同样的 UPX 加壳文件,PEID 能识别,DIE 显示“无可用信息”。
- 原因:这个文件被改过区块名,.UPX0/.UPX1 被改成了 .data/.rdata,且入口点不是标准 UPX 开头,DIE 的特征库规则没触发,而 PEID 的 userdb.txt 匹配到了残留的 UPX 字符串。
- 解决:别急着否定 DIE。切到十六进制页签,搜“UPX”字符串,把入口点附近的字节手动贴到 DIE 的“自定义签名”里做个临时匹配,或者用脚本规则按残留字符串 + 熵值双重特征做判定。
坑二:DIE 把普通编译器识别的文件报成“可能是加壳”
- 现象:一个正常的 VC++ 编译 exe,DIE 给出“可能加壳”的启发式结果。
- 原因:启发式灵敏度调的过高。VC++ 编译器的启动代码段有大量 call/jmp 交替,和某些壳的特征在熵值分布上很像。
- 解决:把灵敏度调回默认值,或者用“检测模式 -> 仅使用签名库”关闭启发式判断。需要说明的是,这类现象在加了 MSVC 链接器的 /GUARD:CF 安全机制的 exe 上更常见,这是正常编译器行为。
坑三:超大文件打开后界面卡了十几秒
- 现象:把一个 2GB 的 exe(常见于大型单机游戏)拖进 DIE,整个界面假死约 15 秒后才恢复。
- 原因:DIE 默认做了完整扫描,对 2GB 文件要逐区块读取。
- 解决:点开检测模式,选择“快速模式(头 + 入口点)”。如果是临时打开,可以用 Ctrl+O 换成“打开为数据流”模式只读头部信息,不触发全盘扫描。
坑四:多文件批量查壳时,个别文件被跳过
- 现象:用 DIE 的批量扫描功能分析整个文件夹时,某些 exe 没有输出结果。
- 原因:这些文件在扫描过程中抛出了异常,通常是文件被其他进程独占锁定,或者文件结构损坏触发了引擎保护分支。
- 解决:批量扫描时先看 DIE 的日志输出窗口,被跳过的文件会留下错误代码。90% 的情况是文件锁定,先关闭占用进程再重扫。损坏文件则单独处理,确认结构后决定是否保留。
坑五:DIE 的检测结果和 VirusTotal 上的壳报告对不上
- 现象:同一个样本,本地 DIE 报“无壳”,VirusTotal 上 20 个引擎里有 3 个报了个加壳器名字。
- 原因:VT 是多引擎聚合,它报的“壳”可能来自某个标记常驻的引擎,那个引擎的判定逻辑偏向保守,把某种编译特征当成壳。
- 解决:以 DIE 的熵值分析和区块表数据为准。如果在区块表里找不到任何壳特征对应的区块,大概率是误报。反过来,DIE 报了壳而 VT 上没有人报,通常只是这个壳比较冷门,许多引擎不收录它的特征,不代表 DIE 错——这时用十六进制视图人工核实入口点代码就能定论。
6. 末级技巧:用 DIE 验壳结果反推加壳方式,把“查壳”变成“定位工具”
查壳这个动作,很多人拿到结果就结束了,但其实检测结果里藏着加壳方式的密码。以 UPX 为例,DIE 报出的版本号区间直接决定了能否用 upx -d 一键脱壳:UPX 3.x 的压缩结构相对稳定,脱壳成功率极高;UPX 4.x 改了部分头部的布局,老的脱壳机容易失败。DIE 的检测结果里如果版本号后面带着“(.upx0)”这种区块标记,就能确认壳的加壳布局,手动脱壳时可以直接定位原始入口点位于 .text 段还是其他自定义段。
验证这个判断的最快路径,是在 DIE 拿到壳版本后,打开十六进制视图看两个位置的值:文件偏移 0x3C 处的 PE 头偏移,以及 PE 头偏移 +0x28 处的入口点 RVA。对标准 UPX 壳,入口点 RVA 几乎总是指向最后一个节区头部附近;如果这里的值和节表里的 VirtualSize 关系异常,说明加壳器重写了入口点字段,脱壳时要多做一步 ——把入口点改成第一个节区(通常是 .text 或 .UPX0)的真实代码地址。
另一个实用技巧是把 DIE 作为“加壳方式分类器”来用:同一个加壳器家族的多个版本,在区块命名习惯、入口点指令模式、节表属性上有很强的共性。你可以在 DIE 的脚本引擎里按这些共性写一条批量规则,配合它的命令行模式扫一个目录里的所有文件,输出为 CSV——一小时内就能完成一个样本集的加壳方式统计。实际用法是把 DIE 的可执行文件路径和待扫描目录传给命令行接口,输出文件里会包含每个文件的检测名称、版本号和置信度,拿这个做样本归类报告,比手动一个个看快一个数量级。
我这套“先 DIE 查壳 -> 看十六进制验证熵值特征 -> 必要时写脚本固化规则”的流程,在近半年的样本分析里基本没有翻过车。期间有一个印象深刻的教训:一次分析一个加了多层壳的样本,我图省事只看了 DIE 的表面检测结果就下了结论是 VMProtect,结果脱壳阶段发现内层还有一个 Themida——要从那以后,我每次都强制走一遍“查验结果 -> 验证区块表与入口点 -> 结合熵值确认”的闭环,宁可慢两分钟也不愿再看一次表面结果。希望这条习惯能帮到你,少踩一个半隐藏的坑。
本文还有配套的精品资源,点击获取