ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

EXE解压工具全解析:用7-Zip等提取安装包文件

EXE解压工具全解析:用7-Zip等提取安装包文件 简介这是一款面向开发者、逆向工程师及软件分析人员的EXE文件解压工具核心功能是从Windows可执行程序中提取内嵌的资源与数据便于查看图片、文本、音频或其他二进制文件适用于程序结构分析、资源复用与调试教学等场景。资源包共167个文件以txt说明、exe主程序、unp解压引擎、dll动态库及wcx插件为主另有少量doc、ini、htm等配置与文档压缩包整体仅5.14MB轻量易用。目前已有3501人学习下载受到一定关注。工具内含UniExtract主程序、语言配置文件、许可协议、更新日志以及bin和docs目录提供了较完整的解压组件与使用文档覆盖多种压缩格式支持可帮助用户快速探索EXE内部结构并提取所需资源使用时可结合具体文件组合灵活调用各模块。1. 解压 EXE 这件事比你想的更接近拆快递拿到一个setup.exe双击前你大概率想知道里面装了什么是几个散文件还是打包了依赖运行库又或者只是套了一层壳的绿色软件大多数人以为可执行文件是个整体但实际上相当一部分 EXE 本身就是个“快递盒”把安装脚本、资源文件、动态库甚至另一个压缩包塞在一起。所谓 EXE 可执行文件解压工具干的就是拆盒子的活——不碰代码逻辑只把里面的东西原样掏出来。这个方向真正适合三类人运维要排查安装包改过什么文件、想给软件做绿色免安装版分析人员要快速查看可疑程序的文件构成开发者在做 bat to exe、pyinstaller 打包这类事情后反过来想验证打包产物里到底有没有泄露源码或多余文件。今天这篇把原理、命令和翻车现场一次说透读完你会知道什么包能拆、用什么拆、拆完怎么验证以及哪些 exe 拆了也是白拆。2. 先看清 EXE 属于哪种容器选错工具等于白干2.1 自解压包、安装器与单文件程序三者的本质差异把 EXE 当压缩包解压前提是它确实是个“包”。从业界常见做法看可执行文件大致分三类一类是真正的 PE 程序代码和数据都在里面没有外部载荷这种用解压工具只会拆出资源段拿不到业务文件另一类是自解压包本质是解压器 压缩数据拼在一起7-Zip 这类通用压缩软件能直接识别还有一类是安装器由 Inno Setup、NSIS、InstallShield 等工具生成它们不只是把文件压在一起还会写入注册表、创建快捷方式提取时需要用专门的解析工具。判断一个 EXE 能不能拆、用什么拆只看图标和文件描述不靠谱。我一般先看文件大小和版本信息里有没有线索安装器通常几 MB 到几十 MB带“Setup”“Install”字样自解压包常见于免安装软件、游戏汉化补丁双击是解压行为而不是安装行为单文件程序则往往出现在 .NET、Go 或 PyInstaller 打包产物里。PyInstaller 打的包有个鲜明特征体积偏大且启动时会往临时目录释放资源这类“假单文件”恰恰是 exe 解压工具能大展拳脚的对象。2.2 用 t 命令先探路解压前必须做的两步探测拿到一个来路不明的 EXE别急着双击也别急着上重型工具。我习惯先做两步探测第一步看 PE 头第二步用 7-Zip 的 ttest模式试水。PE 头可以用任意十六进制编辑器看文件开头是MZ是基本常识但真正有用的是 PE 头里的e_lfanew字段指向的 PE 签名位置在那边能看到这个文件链接了哪些 DLL。不过对普通用户来说更直接的探测方法是让 7-Zip 直接测7z t D:\downloads\unknow_setup.exe如果输出显示文件类型是 PE32 且检测到 SFX 前缀还会列出“Scan WIMs/RARs/EXEs”之类的提示说明这把能拆如果输出只有“Everything is Ok”却没有列出任何内部文件路径那它多半是个普通 PE解压工具无从下手。这个测试过程不实际写入文件安全性上也比直接双击强得多。第二步看安装器类型推荐在虚拟机或沙箱里挂一个 Universal Extractor 2UniExtract2它能自动识别 Inno Setup、NSIS、MSI 等常见封装格式并调用对应后端。识别结果的优先级比我手动猜格式高得多因为 NSIS 安装器在 7-Zip 里也能看到部分内容但真正的安装逻辑脚本和自定义 UI 资源必须用 7z 之外的专用工具才能完整抽出这直接决定后文选哪条路。2.3 六种常见封装的识别特征速查表下表整理了我平时判断封装类型的几个硬指标配合 7-Zip 的 t 输出和文件字符串检索使用。封装类型典型特征首选解压工具能否直接运行提取物7-Zip SFX文件尾部含.7z标识t 模式可列出完整树7-Zip多数能依赖集中在包内WinRAR SFX含 RAR 签名双击为解压界面WinRAR / 7-Zip多数能Inno Setup字符串含Inno Setup资源段有空闲空间标记innoextract按目录还原运行需注册表配合NSIS字符串含Nullsoft尾部有脚本区7-Zip部分nsisunpack文件完整快捷方式需手动建MSI文件头是 Windows Installer 数据库不是 MZlessmsi / dark文件可解出依赖 Feature 表PyInstaller体积大有pyi-runtime字符串pyinstxtractor解出的是 pyc不能直接运行这个表不是让你背而是提醒你解压 EXE 这件事的成败90% 取决于第一步的格式判断。格式判断错了后面所有操作都是给安装包添乱。3. 用 7-Zip 命令行拆自解压包最省事的最小复现路径3.1 一条命令拆出全部文件但别忽略三个参数7-Zip 是 EXE 可执行文件解压工具里最常用的通用后端它支持解 7z、zip、rar、cab更重要的是能直接处理大部分 SFX 自解压包。命令行比图形界面好在可重复、可写脚本也方便在解压后立即做文件清单核对。常用最小命令是7z x -y -oD:\extracted\my_app D:\downloads\my_app_setup.exe参数x表示完整路径解压保留包内目录结构-y覆盖已存在文件不弹确认-o指定输出目录注意等号后面没有空格目录要加引号防路径带空格。如果是想先看包里有什么而不急着解压把x换成l只列目录7z l -slt D:\downloads\my_app_setup.exe | findstr Path Size-slt输出技术信息配合findstr过滤出路径和大小适合脚本里自动对比文件差异。解压完成后第一件事是检查解压目录里是不是有一个跟原 EXE 同名的可执行文件——很多 SFX 包会把主程序本体和一个自解压头拼在一起解压出来那个才是真正要运行的 PE。注意一个常见误解7-Zip 能解 SFX不代表它能解一切 EXE。Inno Setup 的安装器在 7-Zip 的 t 命令下通常显示 0 个文件因为它的数据块是自定义格式的不是标准压缩流。这种情况下再执着地换 7-Zip 版本就是浪费时间直接跳到下一章用专用工具。3.2 嵌套解压解压出来的还是压缩包怎么办实际项目中经常遇到“套娃”式封装外层是 7-Zip SFX解开后里面还有一个 MSI 或 InstallShield 包再解开才是真正的程序文件。手工操作很容易漏掉这层导致明明解压成功了却找不到主程序。我的做法是写一个递归探测脚本先统一解一层再对新产生的文件做格式嗅探for /f delims %%f in (dir /b /s D:\extracted\*.*) do ( 7z t %%f nul 21 echo %%f D:\extracted\nested_archives.txt )逻辑不复杂对输出目录下每个文件跑一次7z t如果返回值是 0 说明它本身还是可解压的压缩包就把路径记到列表里。nul 21是为了不刷屏保证只在测试成功时记录。拿到列表后逐个处理处理顺序建议从最内层往外解因为往往内层才是真实的版本资源外层 SFX 只是分发壳。这里有个容易翻车的细节某些安装器解压出来的文件扩展名不是.zip或.7z而是无扩展名或.bin但文件头是标准压缩签名。7-Zip 的 t 模式按文件头嗅探不吃扩展名这一套所以上面的脚本依然能准确识别。但如果遇到的是加密压缩包7z t会要求输密码脚本就卡住了这种情况需要在命令里加-p密码参数字段。3.3 解压后文件对不上版本号先查文件版本资源解压完发现提取出的主程序版本号和安装器文件名标的版本不一致这种事遇多了就明白安装器分发的包里经常同时存在多个版本的 DLL由安装脚本按条件决定最终拷贝哪个。解压工具只是把包内容掏出来不会执行安装脚本所以解压目录里看到的很可能是“全量文件”而不是安装后的最终状态。要确认哪个文件才是实际运行版本可以用 PowerShell 读取 PE 的版本资源(Get-Item D:\extracted\my_app\app.exe).VersionInfo.FileVersion把这条命令分别跑在解压目录里几个可疑的 exe 和 dll 上输出结果和安装器属性页显示的版本号比对。这个动作能帮你少走很多弯路——尤其是做绿色软件封装时把不用的旧版本 DLL 一起打包发出去轻则体积膨胀重则引发 DLL 冲突。4. 拆 Inno Setup、MSI 和 NSIS从安装器里抠出原始文件4.1 innoextract 解 Inno Setup先列表再提取避免解出一堆无用文件Inno Setup 生成的安装器在 Windows 生态里占比极高Freeware 和小工具尤其爱用。7-Zip 对它的支持时好时坏稳定做法是用 innoextract。这个工具是命令行程序支持 Windows 和 Linux核心参数是innoextract -e D:\downloads\app_setup.exe -d D:\extracted\inno-e表示提取文件-d指定输出目录也可以加-I app.exe只提取指定文件。我在实际项目中总会多做一个动作——先运行innoextract --list看包内清单因为 Inno Setup 脚本里可以声明“只在安装时生成”的文件这类文件并不存在于包里直接提取会得到不完整的目录列表后能看到文件数量和大小方便判断有没有加密段或者自定义消息 DLL。Inno Setup 有个特殊点安装脚本本身.iss编译后的形式也会被解出通常是个叫setup.iss或embedded的文本资源。新手容易忽略这玩意但它价值很高——里面记录了文件安装到哪个目录、注册表写了什么键、创建了哪些快捷方式相当于拿到了安装过程的施工图。做软件绿化时照着它还原注册表项成功率远高于盲目复制文件。4.2 lessmsi 解 MSI处理 Windows Installer 依赖关系MSI 不是 MZ 开头的 PE而是复合文档格式直接改扩展名或用 7-Zip 硬解只能看到一堆_File表里的编号文件文件名全部丢失。这里我一般用 lessmsi它能把 MSI 里的文件按原始名称和目录结构还原出来lessmsi x D:\downloads\app.msi D:\extracted\msi\输出目录会生成SourceDir文件夹里面是按 Feature 划分的目录树。MSI 解压有个与众不同的坑文件的最终位置不完全由包内目录决定而是由Directory表动态映射安装时可能因为系统版本、用户配置被重定向到别的路径。所以解出来的目录结构只能作为参考最终安装行为的核对还是要打开 MSI 的Property表和InstallExecuteSequence看。普通场景下没必要研究那么深知道“MSI 解压 ≠ 安装结果”就够了。如果遇到的是patch补丁型的 MSI文件名带_p.msplessmsi 也能解但解出的文件只是补丁变更集不是完整程序。这种包的正确用法是提取出内部文件后跟原始目录做差异比对用来确认更新到底改了哪些 DLL。4.3 拆 NSIS 安装器别迷信 7-Zip脚本资源要另找工具NSIS 是另一个高占比安装器7-Zip 对它的支持一直在变有时能列出文件但解不全有时干脆不支持。常见做法有两个第一是直接用 7-Zip 的 x 命令试一把能完整解开就算走运第二是解不开时换用 nsisunpack——它会输出文件数据同时还原 NSIS 脚本里的InstallDir、RegKey等安装动作。两个工具的输出可以互补7-Zip 给文件本体nsisunpack 给安装行为。nsisunpack D:\downloads\nsis_app.exe -d D:\extracted\nsisNSIS 包提取的一个典型特征是文件经常压在$PLUGINSDIR里里面是 NSIS 插件和临时释放文件很多插件会在安装完成后自删所以解压目录里会看到残留的 dll 和 ini这些不是程序本身的组成部分。判断哪些是插件残留、哪些是真实程序文件看路径名最容易带Plugins、nsis字样的大概率是框架文件真正的主程序通常路径简单文件名也跟产品名一致。4.4 三种安装器的适用场景对比安装器类型提取完整度还原安装行为适用人群Inno Setup高含脚本资源能从脚本读注册表和快捷方式做绿色版、分析安装逻辑MSI文件完整目录由表映射需对照 Directory 表人工还原企业分发、补丁差异分析NSIS文件完整插件残留多靠 nsisunpack 读脚本定制安装包、逆向免安装不要试图用一个工具通吃所有安装器每种封装格式背后的压缩算法和安装语义都不一样。备好这三板斧市面上九成 EXE 都能在十分钟内拆干净。5. 避坑指南解压 EXE 常见的六个翻车现场5.1 解压只出几个小文件找不到主程序现象7-Zip 顺利解压输出目录里只有三个文件一个 DLL、一个配置文件、一个体积很小的 exe怎么看都不像能跑的程序。原因这是典型的加载器模式。外层小 exe 只是个引导程序真正的业务逻辑在一个被加密或二次压缩的载荷文件里运行期才释放到临时目录。自解压包不等于全量包很多商业软件会用这种手段防止静态解包。解决看l模式输出的文件大小占比——如果有个文件特别大但扩展名不是 exe多半就是载荷。把它用 7-Zip 再解一次或直接搜索文件头特征常见的是 PK、7z、Rar 签名。还不行就把小 exe 扔进沙箱跑一下监控临时目录释放的文件这是最后的手段却是最可靠的手段。5.2 报错“无法作为压缩包打开”现象t 模式直接提示Cannot open as archive。原因目标可能不是任何形式的自解压包而是加壳 PEUPX、Themida或者干脆是纯 C/C/Go 编写的单文件程序。壳会把可执行文件压缩后包裹起来但这不是压缩包语义解压工具插不上手。解决先用7z l确认是否真没内容再用 Detect It EasyDIE这类工具查壳。如果是 UPX可以脱壳后再分析如果是 Themida 之类的高强度壳解压工具无能为力需要换动态分析路线这超出本文范围知道边界在哪里也是一种收获。5.3 提取出的文件运行不了双击报缺失 DLL现象解压目录结构完整也有主程序但双击就报找不到某个 DLL。原因解压不执行安装脚本很多 DLL 在安装期会被重命名、复制到系统目录或写入注册表关联。尤其 .NET 程序依赖的是 GAC 注册单纯解压文件没有意义。解决用dumpbin /dependents或 Dependencies 工具看 exe 的导入表逐项对解压目录里的 DLL。缺系统 DLL 的说明程序运行依赖系统组件绿色化这条路走不通别硬试。想验证是不是自包含依赖在解压目录里搜导入表需要的文件名搜不到的基本就是安装期写入系统的这类程序不适合做免安装。5.4 解压后中文文件名全是乱码现象包内明明有中文名文件解压出来却是$%之类或解压报文件名非法。原因SFX 包在压缩时用的代码页和当前系统代码页不一致。7-Zip 默认按系统 ANSI 代码页解释文件名简体中文系统是 GBK如果包是 UTF-16 或 Unicode 格式就会乱码或截断。解决7-Zip 解压时不存在官方代码页覆盖选项但 9.20 以上版本对 UTF-8 文件名处理较好。最稳的方法是用 UniExtract2 代替直接 7-Zip它内部会尝试不同代码页解码实测对 Inno Setup 和 NSIS 包里中文名的容错率高很多。如果解出来已经乱码文件内容不受影响重命名时注意别把扩展名也改了。5.5 解压出的 DLL 被杀毒软件当木马隔离现象刚解压完文件还在过几秒 DLL 就不见了杀软提示检测到威胁。原因安装器为了防篡改会给文件做加壳或加密段解压后还原的正好是壳的原始字节特征库误报率高。另一个原因是包里有执行权限的辅助程序在沙箱运行后触发了行为检测。解决解压全程在隔离的虚拟机里做关掉实时防护是治标隔离才是治本。判断误报标准很简单只有解压目录里的文件被杀而安装器本身不报毒大概率是还原特征误报如果安装器安装完的文件也被杀那程序本身可能有问题。别为了省事在主力机上关杀软解压未知样本这是底线。5.6 递归解压死循环套娃套到磁盘满了现象脚本递归解压下去每次解出的还是同一个文件或者两个文件互相解压磁盘空间飞速耗尽。原因某些安装器会在包内放一个自引用文件解压工具不识别自引用就会循环处理同一数据。另外加壳 PE 脱壳后可能产生新壳脚本没限制递归深度就会无限循环。解决写脚本时务必加最大递归层数和总大小上限。我一般在脚本开头定义set MAX_DEPTH5和总提取阈值每层检查已用空间超过即终止。这个限制在人工操作时也要有意识——解了四层还没看到 PE 头大概率不是嵌套而是撞上了特殊封装结构及时止损。6. 验证提取结果的方法以及一个资源替换的进阶用法解压完成不等于任务完成验证提取结果是我最后一道固定工序。我通常分三步走第一步核对文件数量与安装器属性页或官方说明里的组件清单对照多出来的文件留意是不是插件或冗余资源少了文件则八成是嵌套载荷没解干净第二步批量看 PE 头是否完整用file命令或 PowerShell 遍历所有 exe/dll确认没有 0 字节或损坏文件第三步只对提取的主程序运行一次依赖检查确认它是自包含还是需要系统组件。进阶用法里比较实用的一个场景是资源替换——从 EXE 里提出 ico、png 和 manifest 后替换图标重新打包。7-Zip 解出的资源文件是原始格式直接用 Resource Hacker 修改版本信息或图标后回填比从零用编译工具重建 PE 简单得多适合做内部工具的品牌统一。另外一个常见需求是针对 PyInstaller 打包的 EXE用pyinstxtractor.py可以拆出打包进PYZ段的.pyc文件配合 decompile3 能还原到接近源码的程度。这里提醒一句拆别人打包的 exe 涉及授权边界拆自己的产物做备份恢复才是安全区。还有一个我常用的验证小技巧给解压目录打一个压缩包然后对比解压前后所有文件的哈希值。如果哈希全部一致说明解压过程完整无损如果有文件在对目录压缩和解压后哈希变了那多半是你后续手动修改了文件而没有意识到。这个习惯在交付绿色化软件之前能帮你拦截掉一半的“我这里能跑客户那跑不了”的翻车事故。做这行久了我对“解压工具”的心态已经变成它不是万能钥匙而是一个分类工具。先判断格式再选择工具最后验证产物每一层都有对应的坑。记住解压出来的东西本质是安装前的原料不是运行时的状态很多“解压了但跑不起来”的问题就迎刃而解。希望这篇笔记能帮你少走几个来回尤其是第 5 章的六个坑每一个都是我亲手填过土的。本文还有配套的精品资源点击获取
返回列表