Access 数据库密码破解原理及 c# 实现
【原创】请勿转载
Access2003/2000/97 密码设置原理。
1. 同时将加密和无密码的 .mdb 文件(均为空文件)以二进制形式读入内存,你会发现从
0x42至0x63共34字节存在不同(并非有些帖子中所述的 13字节或 40字节),经过验证,这 34
个字节即为 access 数据库的密码位。想要读出 access 的密码自然要从这 34个字节做文章。
2. 实际上前 32个字节分为 16组,每组两字节,存储一个密码位,编码方式为 unicode 。这样
一来, access 密码位可以支持汉字, ascll ,特殊符号在内的各种元素, 几乎无法暴力破解。
(这里吐槽一下: 大多数网文中指出 16组密码位的高字节无用, 只使用低字节存储密码的观
点是错误的, 因为如果只解析低字节只能破解纯 ASCLL字符密码, 对于存在汉字和特殊符号
的密码根本无法读出)
3. 从加密的 access 文件中读出的 32字节并非密码原貌,这 32字节是将用户设定的密码转
换为 byte 数组与未加密的 access 文件中相应位进行与或操作而来。 根据与或操作的性质可
知,A^B=C 则 C^A=B;因此,将加密文件中现得到的加密字节与未加密文件的相应字节再进行
一次异或即可得到密码原文! !这里把未加密文件的 33byte 数据称之为第一密钥。 (关于
access 的第一密钥: access97 是固定的, access2000 和 access2003 是动态的(变化量为文
件创建时间) ,通过建立于破解文件时间相同的 .mdb 文件即可得到)
4. 那么第 33、34字节是用来干 what 的呢?很简单,使用前三步即可得到一组密码。但你
会发现该密码与实际密码仅仅偶数位相同, 奇数位仍无法破解得到。 原因就在于, 微软设计
时将奇数位密码进行了二次加密。 而第二密钥即为将两个文件第 33、34字节相异或的结果 (分
别为低位、高位第二密钥) 。到这里就很简单了,将奇数位剔出,再与第二密钥进行一次异
或操作,即可得到真正的密码了。
c#实现过程 以下为本人写的一个破解程序
using System.IO;
using System.Windows.Forms;
class Access
{
// 获取密码
static string GetPassword ( string file)
{ // 未加密的文件 0x42开始至 0x61共 32字节 -- 第一密钥,其实这个数组应该根据创建
时间动态生成的,这里仅测试,就不赘述了
byte [] baseByte =
{ 0x39, 0x59, 0xEC, 0x37, 0xE2, 0xe6 , 0x9C, 0xFA, 0x79, 0xFC, 0x28, 0xE6, 0xAC, 0x14, 0x8A, 0x6
0, 0xEB, 0x36, 0x7B, 0x36, 0x4A, 0xD0
, 0xDF, 0xB1, 0xC8, 0x56, 0x13, 0x43 , 0x70, 0x0D , 0xb1 , 0x33 };
byte flagByte= 0x8b; // 标志 0x62 处的数值
byte flagByte2 = 0xC3; // 标志 0x63 处的数值
string password = "" ;