(以下方法仅提供为学习使用,请不要滥用,破坏 VBA 编程人员的工作成果。请大家请所能购买正版)
注意:
本文所载全部、部分内容不得转载、商业使用,作者保留所有法律权利。
所描述方法不保证不对 office 文件、系统造成损害。作者不对使用者行为及行为后果承担法律责任。
假定:
1、你会使用UltraEdit32或其它二进制编辑工具
2、你理解二进制、十进制、十六进制的概念
Excel 中的_VBA_Project_CUR storage(我们可以理解为一个目录) 下的Project Stream(可以理解为一个文件)是一个纯文本文件。如下例所示意,是一个包含了一个工作表(Worksheet)、一个模块(Moudle)的Project stream。
其表达式为:
命令符=串
...
[小节]
命令符=串
每行间用 &h0d、&h0a (回车、换行)分隔。所以,这就为我们简单地破解提供了条件。
'********************************************
'*** 带有 VBA 的Excel,没有口令保护 ***
'********************************************
ID="{87EEB809-E9F0-11D6-95A2-008888998168}"
Document=ThisWorkbook/&H00000000
Document=Sheet1/&H00000000
Module=模块1
Name="VBAProject"
HelpContextID="0"
VersionCompatible32="393222000"
CMG="DBD91940F044F044F044F044"
DPB="B6B474AD94536E546E546E"
GC="91935354545454AB"
[Host Extender Info]
&H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000
[Workspace]
ThisWorkbook=0, 0, 0, 0, C
Sheet1=0, 0, 0, 0, C
模块1=22, 22, 155, 343, Z
下例是同一个文件,增加了口令保护的project stream。请注意看 ID、CMG、DPB以及GC串。
'********************************************
'*** 带有 VBA 的Excel,有口令保护 ***
'********************************************
ID="{00000000-0000-0000-0000-000000000000}"
Document=ThisWorkbook/&H00000000
Document=Sheet1/&H00000000
Module=模块1
HelpFile=""
Name="VBAProject"
HelpContextID="0"
VersionCompatible32="393222000"
CMG="B1B31D5B215B215F255F25"
DPB="6260CEBD62DA62DA9D2663DAB338442F98229B892DDBD831C3AC5373F78FF8D2FB2E1F1B3B"
GC="1614BA74DA9C8F9D8F9D8F"
[Host Extender Info]
&H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000
[Workspace]
ThisWorkbook=0, 0, 0, 0, C
Sheet1=0, 0, 0, 0, C
模块1=22, 22, 155, 343, Z
当ID或DPB中的内容被更改时,就出现所谓的“工程不可视”状态。
而破解的方法也就很简单:
1、简单覆盖
将ID、CMG、DPB以及GC串(包括 命令符=串 ),覆盖为 &h0d、&h0a(注意:请成对使用),如果出现单字节空余,用&h20(空格)覆盖。
如:
00000000h: 49 44 3D 22 7B 38 37 45 45 42 38 30 39 2D 45 39 ; ID="{ 87EEB809- E9
00000010h: 46 30 2D 31 31 44 36 2D 39 35 41 32 2D 30 30 38 ; F0- 11D6- 95A2- 008
00000020h: 38 38 38 39 39 38 31 36 38 7D 22 0D 0A 44 6F 63 ; 888998168}".. Doc
替换为:
00000000h: 0D 0A 0D 0A 0D 0A 0D 0A 0D 0A 0D 0A 0D 0A 0D 0A ; ..................
00000010h: 0D 0A 0D 0A 0D 0A 0D 0A 0D 0A 0D 0A 0D 0A 0D 0A ; ...................
00000020h: 0D 0A 0D 0A 0D 0A 0D 0A 0D 0A 20 0D 0A 44 6F 63 ; .......... .. Doc
2、其他方法
本文不再提供。
注意事项:
1、Excel 中的 Stream 采用laola 文件系统存放(请参考拙作《Excel 二进制文件结构分析》),因而stream 内容可能不连续存放。
例如,project stream 按小文件块方式存放时,每 64 字节(Laola Header 偏移&h20 定义)为一个块,相临的块在Excel文件中
不连续存放。在采用简单覆盖方式时请注意不要覆盖错位置。