文档密码移除实战:Office/PDF/压缩包的破解与去保护指南 简介不少用户习惯用隐私锁对重要文档和压缩包进行隐藏加密防止他人随意查看但时间一久常常连自己也会忘记密码。这套密码移除工具箱正是为解决此类问题而整理面向普通办公人员与IT运维者覆盖Word、Excel、PPT、PDF以及ZIP/RAR压缩包等常见格式的密码清除需求。资源包共31个文件大小约164.7MB内含独立的密码清除工具压缩包和图文版使用说明其中XML与RELS文件是说明文档的底层结构与样式数据JPG/PNG截图展示操作界面与效果GIF动图呈现关键步骤目录组织清晰便于快速定位所需内容。已有1322人学习下载适合办公文档加密遗忘、压缩包权限受限等应急场景。读者可获得完整工具组合与分步骤图文指南按图索骥完成各类文档及压缩包的密码移除有效降低紧急取用文件时的等待成本。1. 文档密码移除这件事先分清“去保护”和“暴力破解”两条路Excel密码清除、Word/PPT/PDF密码移除、压缩包密码移除这几个词放在一起通常对应两种场景离职同事留下的加密表格打不开或者几年前自己压的压缩包密码彻底忘了。这个工具方向并不神秘它由两条完全不同的技术路线组成——一类是“去掉保护锁”改文件结构就能解决另一类是“真加密”只能提取哈希交给暴力破解工具慢慢跑。这篇笔记按Office、PDF、压缩包三类文件展开讲清楚每类有哪些锁、分别怎么解、参数怎么设、坑在哪并给出可直接复制的命令。适合手里有文件处置权、单纯想找回自己密码的开发者或运维人员如果你打算处理别人的文档请先确认自己有权这么做移除密码不等于可以绕开他人的授权。2. 先看懂锁的类型再动手Office、PDF、压缩包的密码机制与算法分水岭2.1 文档密码的五种锁打开密码、修改密码、保护锁、VBA工程密码、PDF权限密码很多人拿到一个加密文档第一反应是“上暴力破解”其实大部分文档根本没到那一步。以Office为例常见的是五种锁其中三种属于“保护锁”修改文件结构即可解除只有打开密码属于真正的内容加密。锁类型常见表现解除方式难度打开密码打开文件就要求输密码提取哈希后暴力/字典破解高修改密码/只读密码能打开但只能只读另存需密码删除XML中的fileSharing节点低工作表/工作簿保护能打开但无法编辑、看公式、增删sheet删除sheetProtection/workbookProtection节点低VBA工程密码打开宏编辑器要求密码替换OLE2目录项中的DPB属性中PDF权限密码能打开但禁止打印/复制qpdf直接解除低PDF的情况更特殊一点。PDF的“打开密码”叫user password是真的加密“禁止打印、禁止复制”这类限制靠owner password实现它不会加密内容只是给阅读器下发一条“这些操作不允许”的指令。所以PDF往往能被qpdf这类工具直接处理根本不需要跑字典。压缩包则相反除了老式ZipCrypto存在已知明文攻击的钥匙孔WinZip AES和RAR5基本都是硬碰硬的暴力破解。2.2 Office算法分水岭97-2003的OLE2与2007的OOXML破解难度差一个数量级Office 2007是分水岭。2007之前.doc/.xls/.ppt走OLE2容器加密算法以MD5RC4为主密钥派生简单GPU破解速度能到每秒几百万次2007之后的OOXML.docx/.xlsx/.pptx改用标准加密框架算法分了三代Office 2007默认3DESSHA1迭代次数低破解速度尚可Office 2010默认AES128SHA1速度明显下降Office 2013之后默认AES256SHA512迭代次数大幅提高同样字典在消费级GPU上只剩下两到三成的速度。所以拿到文件先看扩展名再看哈希前缀。office2john提取的哈希自带版本标识比如$office$*2007*、$office$*2013*这个前缀决定了你该用hashcat的哪个参数。老手一般先跑一遍字典跑不动再看掩码而不是一上来就全排列。这个习惯能帮你省下大量无效等待。2.3 压缩包加密机制ZipCrypto 与 AES以及“已知明文攻击”的钥匙孔压缩包层面WinRAR压缩ZIP格式时会让你选“ZIP传统加密ZipCrypto”或“AES-256”。这两者的安全性不在一个量级ZipCrypto基于CRC32伪随机流存在结构性弱点只要你手头有一份压缩包内某文件的已知明文哪怕12个字节就能反推加密密钥这就是bkcrack工具的攻击原理而AES加密的ZIP、RAR5的AES-256目前没有类似的捷径只能靠字典和掩码硬跑。这带来一个很实用的判断逻辑老压缩包优先尝试已知明文攻击新压缩包直接评估暴力破解成本。很多人不知道WinRAR老版本默认用的就是ZipCrypto导致自己手里明明还有压缩前的原始文件却在那里傻跑字典属于典型的工具选型错误。判断依据很简单zip2john输出的哈希前缀$pkzip$就是ZipCrypto看到它就应该往bkcrack方向想而不是急着上GPU。3. Excel/PPT/Word密码移除实操三条路线对应三种锁3.1 工作表保护与只读修改密码解包、改XML、重打包30秒解决如果你的Excel能打开、只是不能编辑、不能看隐藏列或不能增删sheet那这不是“密码”是保护标记。这种文件本质上是zip包里的一段XML配置把对应节点删掉即可。下面是没有密码时清除工作表保护的标准流程同样适用于Word的“强制只读”和PPT的结构保护。# 解包 mkdir tmp cd tmp unzip ../protected.xlsx # 删除每个工作表的 sheetProtection 节点 sed -i s/sheetProtection[^]*// xl/worksheets/sheet*.xml # 删除工作簿结构保护节点锁定“插入/删除工作表” sed -i s/workbookProtection[^]*// xl/workbook.xml # 删除只读/修改密码节点Word 对应 settings.xml 中的 writeProtection sed -i s/fileSharing[^]*// xl/workbook.xml # 重新打包注意保留目录结构和 -X 参数 zip -r -X ../unprotected.xlsx [Content_Types].xml _rels docProps xl逻辑说明OOXML文档里所有保护信息都以XML节点的形式存在删除后Office会认为文件从未设置过保护不会校验文件指纹。重打包时-X表示不写入额外文件属性避免污染压缩包[Content_Types].xml的方括号在bash中是通配符要加引号。最后得到的文件可以直接用Excel打开原文件建议留着万一改坏了还有后悔药。参数说明这段命令只对“保护型”锁有效对打开密码无效——打开密码加密的是整个文件内容XML是密文看不到任何节点。如果sed之后文件损坏多半是压缩包结构被改动优先检查是否丢掉了[Content_Types].xml或_rels目录。3.2 VBA工程密码十六进制替换DPB属性老格式的通用解法宏文件的密码是另一套机制。Excel/PPT/Word的宏工程vbaProject.bin内部是OLE2容器VBA工程密码存放在目录项的一个名为DPB的属性里它决定了“查看宏代码是否需要密码”。社区里流传很久的做法是找一个无密码的同版本宏工程把它的DPB属性整段复制到目标文件里相当于用无密码模板覆盖密码校验值。# 从 docm/xlsm 中抽出 vbaProject.bin unzip protected.xlsm -d tmp ls tmp/vbaProject.bin # 用十六进制查看定位 ASCII 字符串 DPB xxd tmp/vbaProject.bin | grep -i -A 2 4450 42 # 准备一个无密码的同类文件同样抽出 vbaProject.bin 作为模板 unzip clean.xlsm -d clean_tmp xxd clean_tmp/vbaProject.bin | grep -i -A 2 4450 42逻辑说明4450 42是ASCII字符“DPB”的十六进制编码。用十六进制编辑器打开目标文件找到DPB所在位置把该属性对应的整段值替换为模板文件里的对应值。不同Office版本生成的DPB长度不同所以最稳妥的做法是用同一个Office版本生成一个空密码宏再拿它当模板。替换后宏代码可见原宏内容不受影响。参数说明这个方案主要用于2007之后的docm/xlsm/pptm以及97-2003格式的doc/xls/ppt如果替换后打开宏编辑器提示“工程不可查看”说明属性值长度不匹配换个同版本模板重试。宏签名会失效属于正常现象发布到生产环境的文件需要重新自签名。3.3 文件打开密码office2john提哈希hashcat按版本选mode“打开密码”才是真正的硬骨头。xlsx/docx/pptx的打开密码会对文件主体做加密没有密码就无法还原明文。唯一的出路是把密码哈希提取出来用字典、规则、掩码去碰撞。这里用John the Ripper自带的office2john脚本提取哈希再交给hashcat跑GPU。# 提取哈希输出会带到 stdout office2john protected.docx docx.hash cat docx.hash # 先确认格式再选 mode john --listformats | grep -i office # 跑字典rockyou 是入门首选 hashcat -m 9600 docx.hash rockyou.txt # 跑不过再上掩码8 位纯数字 hashcat -m 9600 docx.hash -a 3 ?d?d?d?d?d?d?d?d逻辑说明office2john输出的是形如$office$*2013*...的哈希串*2013*告诉你加密算法归属哪一代。hashcat的mode对应关系我一般这么记9400是2007、9500是2010、9600是2013、9700是2016及之后具体以hashcat --help | grep -i office的输出为准不同构建版本会有微调。掩码?d代表一位数字?a代表任意字符?l代表小写字母。参数说明2013之后9600/9700的破解速度远低于9400跑之前先观察hashcat显示的H/s估算总工时。如果字典加规则跑完前5%就要几小时直接放弃比硬跑更有性价比。这里也提一句如果密码是已知的只是想生成一个无密码副本用Python的msoffcrypto-tool库加载密码再解密输出比破解快得多没必要绕一圈。4. PDF与压缩包密码移除实操qpdf、hashcat、bkcrack的分工4.1 PDF权限密码qpdf一条命令解除限制PDF的“禁止打印、禁止复制、禁止修改”本质是权限标记不是加密。qpdf的--decrypt模式会重写PDF对象字典把权限限制字段清零同时保留页面内容。大部分只需要解除限制的PDF一条命令就结束。# 直接移除权限限制 qpdf --decrypt locked.pdf unlocked.pdf # 查看加密状态确认是否真的移除成功 qpdf --show-encryption unlocked.pdf逻辑说明如果PDF只是设置了owner password权限密码qpdf不需要任何口令就能解密。如果文件同时设置了打开密码就要加上--password实际密码它无法绕过打开密码。--show-encryption用于验证输出里没有R4或user password之类的字样就说明权限已清除。参数说明qpdf 9.x及以下对部分Acrobat 9扩展加密的支持不完整遇到“qpdf: unable to find /Encrypt”或解密后页面丢失先升级到10.x以上再试。遇到加密字典不标准的PDF可以用--allow-weak-crypto和--suppress-password-recovery这类开关兜底但这类文件在真实业务里很少见。4.2 PDF打开密码pdf2john提哈希后交给hashcat真正设置了打开密码的PDF要回到暴力破解路线。pdf2john脚本会把PDF的加密字典转换成hashcat可识别的哈希关键是确认PDF版本对应的mode——PDF 1.4至1.6标准是10500PDF 1.7 Level 3是10600Level 8是10700/10800提升加密等级后速度差异很大。# 注意 Windows 下是 pdf2john.exeLinux 下是 pdf2john.pl pdf2john.pl locked.pdf pdf.hash cat pdf.hash # 优先跑常见弱口令PDF 用户密码也常用生日/手机号 hashcat -m 10500 pdf.hash wordlist.txt # 8 位以内全部数字经验上覆盖不少办公场景 hashcat -m 10500 pdf.hash -a 3 ?d?d?d?d?d?d?d?d逻辑说明PDF的加密走RC4或AES取决于创建工具。哈希串里带有版本标记按标记选mode成功率最高。如果hashcat --help里没找到对应mode说明构建版本太老换新版本再跑。速度参考上10500在消费级显卡大约能到几十万H/s10700级别的降一个数量级跑之前先看速度再决定要不要继续。参数说明跑PDF密码和跑Office密码类似字典应该按人的习惯组织——先名字年份、手机号、公司名数字再去跑通用字典。工业化的rockyou有1400万条但真正命中率高的是针对目标人员习惯定制的规则集。没有背景信息时别急着全排列。4.3 压缩包先判定加密算法zip2john/rar2john的输出是关键压缩包密码移除的第一步不是跑字典而是判断它用的是什么加密算法。zip2john和rar2john输出内容里藏着答案# ZIP 提取哈希 zip2john encrypted.zip zip.hash cat zip.hash # RAR5 提取哈希 rar2john encrypted.rar rar.hash cat rar.hash逻辑说明$pkzip$开头的哈希意味着ZipCrypto这类压缩包有已知明文攻击可走也可以直接交给John跑字典$zip2$或AES相关标记的走WinZip AES只能硬跑$rar5$开头的是RAR5hashcat mode 13000AES-256没有捷径。先看输出再选工具这是压缩包处理里最容易被跳过的一步。参数说明zip2john在Windows和Linux下的可执行文件名不同Linux下需要python zip2john.py或目录下有编译好的二进制。哈希文件是一行文本有换行问题会导致hashcat识别失败用cat确认哈希完整后再丢给破解工具。老WinRAR创建的ZIP默认就是ZipCrypto这点对旧压缩包非常友好。4.4 ZipCrypto已知明文攻击bkcrack的最小可复现流程bkcrack是专门针对ZipCrypto的工具。原理是ZipCrypto的密钥流由CRC32状态机生成只要知道压缩包内某个文件的明文哪怕12字节就能反推出三个内部密钥进而解出所有文件。最常见拿到明文的场景是压缩包里有一个你电脑上还留着的旧模板、公共readme或者你自己写的文本文件。# 列出压缩包内的条目确认文件名和大小 bkcrack -L encrypted.zip # 用已知明文反推密钥plain.bin 是压缩前那个文件的内容 bkcrack -C encrypted.zip -c readme.txt -p plain.bin # 拿到 Keys 后重打包设置新密码 bkcrack -C encrypted.zip -k 1a2b3c4d 5e6f7a8b 9c0d1e2f -U unlocked.zip newpass逻辑说明-c readme.txt指定压缩包里的密文条目-p plain.bin指定对应的已知明文文件。明文必须和压缩时的字节完全一致而不是“内容差不多”——只要有一个字节不同就找不到。如果明文文件本身在另一个zip里可以用-P plain.zip -p plain.txt从zip中提取避免解压污染。参数说明明文建议不低于12字节越长越好解出密钥后-U重新打包生成的文件可以用新密码打开也可以直接解压。bkcrack只支持ZipCrypto对AES压缩包直接报错所以每次跑之前先确认哈希前缀。这个工具是CPU密集型单文件几秒到几分钟就能出结果速度比GPU暴力破解快几个数量级碰上老压缩包务必先试它。5. 文档密码移除的常见坑格式误判、工具版本与重打包损坏5.1 现象office2john出来的哈希hashcat拒绝加载原因多数是mode选错。2013或2016的文档却用了9400对应2007hashcat会提示哈希格式不匹配另一个常见原因是文件根本没有打开密码只是工作表保护office2john提取不到有效哈希。解决先看哈希前缀$office$*2007*对应9400*2010*对应9500*2013*对应9600*2016*对应9700。再用hashcat --help | grep -i office核对当前构建版本支持的mode列表。提取不到哈希时把文件丢进Excel确认是不是打开需要密码——能打开但提示只读就不是加密文件走XML删除节点那条路。5.2 现象qpdf报“No password given or wrong password”但PDF用阅读器能直接打开原因这类PDF通常只设置了权限限制但加密字典类型较老qpdf 8.x/9.x对某些RC4加密字典识别不完整把权限密码误当成打开密码来处理。解决升级qpdf到10.x以上然后重新执行qpdf --decrypt。升级后仍报错用qpdf --show-encryption locked.pdf查看加密参数确认R值加密版本和P值权限位。R4基本都能解R6的AES-256也支持正常。还有一类极端情况是PDF由特殊商业软件生成加密字典不标准qpdf和pdf2john都处理不了只能走“打印后重新生成PDF”这类非常规手段。5.3 现象bkcrack提示No plaintext密钥始终找不到原因最常见的是明文文件与压缩时不一致——文件被编辑过、换行符变了、或者从zip里解压时经过了文本模式转换。另一个原因是压缩包里的条目用了不同压缩级别即使内容相同密文也不同导致bkcrack无法对齐密钥流。解决优先找不可变文件当明文比如压缩包里的.txt恰好是某个软件模板、配置文件且手头留有原文件其次用-P plain.zip -p plain.txt方式直接从另一个zip读取明文避免解压时被文件系统改动内容。确认明文一致性后如果还是No plaintext检查zip是否为ZipCrypto——AES加密的zip不会打印这个错误而是直接提示格式不支持。5.4 现象暴力破解跑到一半内存耗尽或者速度慢到没法等原因字典文件太大且hashcat把整个字典加载进内存或者同时跑了多个GPU任务导致显存溢出。另一个常见问题是掩码设置过宽?a?a?a?a?a?a?a?a意味着接近一万亿种组合跑完是天文数字。解决先跑字典rockyou或自建常用密码集再跑小范围掩码比如?d8位、?l6位这类有现实意义的组合。hashcat加-O开启优化内核-w 3提高工作负载估算时间以9600为例消费级显卡每秒几万到十几万次8位纯数字约一亿种组合需要一两小时8位混合就按年算直接放弃。GPU跑不动时换John的CPU模式配合--fork多线程适合小规模字典。5.5 现象改完XML重新打包Office提示“文件已损坏是否修复”原因重打包时压缩参数和条目顺序变了或者[Content_Types].xml被改动后放到非根目录。Office对zip结构比一般工具严格解压再压缩必然改变原压缩流只是多数情况下能自动修复。解决先保证zip -r -X从解压目录执行且[Content_Types].xml在根目录。Office弹修复确认后选择修复并重新打开确认内容完整如果修复失败把原始加密文件再做一次解包只修改目标节点不要动其他文件重打包后用unzip -t测试zip完整性。这类“提示修复”在实践里很常见不代表文件真的坏了但正式交付前一定要打开确认公式、格式没有丢失。6. 收尾验证密码是否清除的三个动作以及给暴力破解做减法6.1 三分钟验证不同格式的密码清除结果怎么确认密码移除不能只看命令有没有跑完必须重新打开文件做确认。我习惯按格式做三组检查全部通过才算收工。文件类型验证方法通过标准Office打开密码双击文件直接进入编辑界面不再弹出密码输入框工作表保护审阅 → 保护工作表按钮置灰无密码可撤销VBA工程打开宏编辑器双击模块代码可见无工程密码弹窗PDF权限qpdf --show-encryption输出无R值和P值ZIP/RARunzip -t 或解压到新目录无密码直接解压成功顺手补一条习惯重打包后的Office文件首次打开可能会弹修复提示先不要把原文件删掉确认新文件一切正常后再清理。所有密码移除操作都在副本上进行原文件保留一周再决定是否删除这一步能避免绝大多数误操作带来的损失。6.2 给暴力破解做减法字典、掩码与止损暴力破解不是闷头跑而是先做减法。我自己的标准流程是字典优先于掩码小范围掩码优先于全排列跑之前先算总工时。常用字典加规则能覆盖绝大多数“办公密码”因为大部分人的密码是名字数字或生日而不是随机串。常见做法是第一轮跑rockyou的Top 10000第二轮用?d8位纯数字第三轮才考虑?l?d混合6位。掩码里的规则要搭配人的习惯——先试年份19?d?d或20?d?d加常见后缀再去跑完整数字集。# 规则攻击对字典每一条做变形如加数字后缀 hashcat -m 9600 docx.hash rockyou.txt -r rules/best64.rule # 有方向性的掩码比如车牌号手机尾号等 hashcat -m 9600 docx.hash -a 3 ?u?l?l?d?d?d参数说明rules/best64.rule是hashcat自带的高性价比规则集能把一个词表扩展出几十倍变形掩码?u大写、?l小写、?d数字组合时要先想清楚到底在模拟哪类密码。跑之前看一眼H/s估算出总时间超过几小时就调整策略或止损这是效率的关键。聊点私人的我最早处理一个被遗忘的RAR压缩包傻跑了整整两天纯数字掩码结果发现里面文件根本没加密只是WinRAR的“显示密码”勾选误导了我。后来凡是加密文件都记进密码管理器生成随机长密码彻底杜绝“破解自己的文件”这种尴尬事。移除密码是工具但管理密码才是治本。希望帮到你。本文还有配套的精品资源点击获取