This Domain(Admin5.com) is for Sale:

破解Access(*.mdb)目前所有版本的密码

时间:2007-12-23  来源:不详  作者:迈克DB

(0x89^0xEC)^(0x10^0x0C)=0x79咦,本来这个字节应该是"e"的,怎么变成"y"了?试着不与后面的两个异或值相异或,只计算0x89^0xEC=0x65得到"e",哈。这下对了。下一个
(0x14^0x65)^(0x10^0C)=0x6D得到"m",下一个
(0xF9^9C)=0x65得到"e",注重这里只是这两个数异或。后面的大家可以自己试。
这样就总结出规律来了。
解密时,先取出加密文件从文件头开始0x62处的字节,与空密码数据库文件第0x62处相异或,得到一个加密标志。
再从0x42处开始每隔一个字节取一个字节,取得13个加密后的密码字节,分别与空密码数据库文件0x42处每隔一个字节取得的13个字节想异或,得到13个密码半成品。为什么说是半成品呢,因为还要将13个字节的密码每隔一个字节,就与加密标志相异或,最后得到的13个字节才是真正的密码。当然,假如中间有0x0的字节,则说明密码位数不够13位。直接show出来就可以了。
另外我发现加密标志会随着时间或机器不同而不同,所以也没有万能的,不过有一个参照的就可以了。以下代码是我在写这个程序的时候取得的数,和我写这篇文章不是一个时间,所以数值不一样,但最终解密的结果是一样的。大家可以参考一下。
对了,还有个重要的就是先得判定数据库的版本,我用了个简单的办法,取0x14处的字节,假如为0就判定为是Access97,假如为1就认为是Access2000或2002的。只是目前没有研究出判定2000和2002的办法,假如哪位知道的话,请指点。

copyright dedecms


代码:
//这里定义的是13个字节作为Access2000异或的源码。与之相对应的加密标志是0x13,ccrun特此注明
//当然你可以用这一组:BEEC659CFE282B8A6C7BCDDF4F与这一组相对应的加密标志是0x0c
//呵呵.程序有些乱,希望大家能看的懂。
charPassSource2k[13]={0xa1,0xec,0x7a,0x9c,0xe1,0x28,0x34,0x8a,0x73,0x7b,0xd2,0xdf,0x50};
//Access97的异或源码
charPassSource97[13]={0x86,0xfb,0xec,0x37,0x5d,0x44,0x9c,0xfa,0xc6,0x5e,0x28,0xe6,0x13};
void__fastcallTMainForm::GetMdbPass()
{
charPassStrTemp[26],Ver,EncrypFlag,t1;
intFileHandle;
StringMdbPassword,MdbVersion,MdbFileName;
FileHandle=FileOpen(MdbFileName,fmOpenRead);
if(FileHandle<0)
{
ShowMessage("文件打开错误!");
return;
}
//取得数据库版本
FileSeek(FileHandle,0x14,0);
FileRead(FileHandle,&Ver,1);
//取得加密标志
FileSeek(FileHandle,0x62,0);
FileRead(FileHandle,&EncrypFlag,1);
//读取加密后的密码到缓冲区
FileSeek(FileHandle,0x42,0);
FileRead(FileHandle,&PassStrTemp,26);

本文来自织梦


FileClose(FileHandle);
if(Ver<1)
{
MdbVersion="Access97";
if(int(PassStrTemp[0]^PassSource97[0])==0)
MdbPassword="密码为空!";
else
{
MdbPassword="";
for(intj=0;j<13;j )
MdbPassword=MdbPassword char(PassStrTemp[j]^PassSource97[j]);
}
}
else
{
MdbVersion="Access2000or2002";
MdbPassword="";
for(intj=0;j<13;j )
{
if(j%2==0)
t1=char(0x13^EncrypFlag^PassStrTemp[j*2]^PassSource2k[j]);
//每隔一个字节就与加密标志相异或。这里的加密标志为0x13
else
t1=char(PassStrTemp[j*2]^PassSource2k[j]);
MdbPassword=MdbPassword t1;
}
}
if(MdbPassword[1]<0x20||MdbPassword[1]>0x7e)
MdbPassword="密码为空!";
EditMdbFileName->Text=MdbFileName;
EditMdbPassword->Text=MdbPassword;

看完这篇,您有何感觉呢?

文章评论

共有位Admini5网友发表了评论 查看完整内容

24小时热门信息