发信人: zrsoft()
整理人: fishy(2000-04-07 21:40:03), 站内信件
|
以下内容来自“峥嵘软件室”http://zrsoft.8u8.com
Access2000数据库的解密
与Access97相比,Access2000的数据库的密码增至20位(97为13位),而且
加密方式略有不同,它的密码存放在从第67字节开始的40个字节中。为什么20位
的密码占用了40个字节呢?因为Access2000的每个密码占用两个字节,但是不要
怕,虽然占用了两个字节,但是其中有用的还是第一个字节,也就是说,我们只
要处理其中的一半就可以了。和Access97一样的是,Access2000的加密仍然用的
是异或的方法,说了这么多,还是先来看一下解密的思路吧。
先用Access2000创建一个新的库,库里有没有内容都无所谓,命名为DB1即可
;然后再创建一个新库,并且对它进行加密,密码任意(最好采用最大长度—20
位),只要你能记住就可以了(费话,密码当然自己能够刻记得)。现在已经有
了两个库,一个是加了密的,一个是没有加密的,我们只需要用一个最简单的DO
S命令,就可以查看出沱们二者之间的不同。做法是退到DOS状态,输入命令:FC
/B DB1.MDB DB2.MDB|MORE,我们会发现,从第42字节(十六进制)开始,下面有
若干字节不同,而且都是隔了一个字节,这就是我们所要找的密码了。我们把DB
1数据库(没有加密的)的从42字节开始的几个字节记住供以后使用,如果我没记
错的话,它们应该是:50、EC、8B… …,不过要注意,我这里所说的,均是十六
进制的。
罗嗦了半天,到底是如何进行异或加密的呢?举个例子吧,我们现在只加了
一位密码“1”, “1”的ASCII码是49,十六进制是31,用它与没有加密时的字
串中的第一个字节进行异或,得到一个数61(十六进制数),即为密码位,不信
?你可以试一下。反过来,如果发现密码位是61,那到让它与50进行展异或,得
到31,即为字符“1”。以下依此类推即可求出多达20位的密码了。
下面我将自己的心得写成了一段小程序,在此奉献给大家,也可以直接下载
可源程序和可执行文件:
此程序用VC编制,具体如何操作VC,在此不做过多说明,我只把其中的一段
核心程序说一下。
HFILE hFile;
OFSTRUCT ofs;
unsigned char temp[40];
int Source[21]; //存放没有加密时的几个字节的内容
char Password[21]; //用于存放密码
Source[0] = 0x50;
Source[1] = 0xec;
Source[2] = 0x8b;
Source[3] = 0x9c;
Source[4] = 0x10;
Source[5] = 0x28;
Source[6] = 0xc5;
Source[7] = 0x8a;
Source[8] = 0x82;
Source[9] = 0x7b;
Source[10] = 0x23;
Source[11] = 0xdf;
Source[12] = 0xa1;
Source[13] = 0x13;
Source[14] = 0x19;
Source[15] = 0xb1;
Source[16] = 0xe2;
Source[17] = 0x79;
Source[18] = 0x44;
Source[19] = 0x7c;
if((hFile=OpenFile(filename,&ofs,OF_READ))==HFILE_ERROR)
MessageBox("Open file error!");
else
{
_llseek( hFile, 0x42l, 0 );
_lread( hFile, temp, 40 );
if (temp[0] == 0x50)
MessageBox("The database is not encrypted!,you can open it normally!")
;
else
{
int i=0;
while (temp[i*2+1] ^ Source[i] )
{
Password[i] = (temp[i*2+1] ^ Source[i] );
i++;
}
Password[i]=0;
Password[20]=0;
m_password=Password;
UpdateData(false);
}
}
}
-- ※ 修改:.zrsoft 于 Apr 7 12:03:33 修改本文.[FROM: 202.96.40.13] ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.40.13]
|
|