若相依 发表于 2015-1-16 22:20:11

MYSQL网站制作之破解Access的暗码

有的时候,一些缺失的功能可以通过别的办法来实现,例如,在MySQL4.1以前,你可以通过使用join方法来替代子查询的功能。在MySQL5.0中,大多数关系型数据库所要求的功能已经都具备。在mdb文件第0x42字节处的13个字节分离与0x86,0xfb,0xec,0x37,0x5d,0x44,0x9c,0xfa,0xc6,0x5e,0x28,0xe6,0x13异或后便可失掉数据库的暗码。但在Access2000和2002的版本里密钥不再是流动的13个字节.并且加密的体例也有了变更。
经由ccrun用一下战书的工夫研讨,终究将Access2000的加密体例弄分明了。嘿嘿。在此将偶的心得公布。但愿对人人有效,假如您发明我的了解有误,请来信告之我们。信箱:info@ccrun.com版权固然有无都不妨,不外假如您要转载,请说明出处,并包管文档的完全性。感谢。
我用的剖析工具是UltraEdit32v10.00,编程工具是C++Builder6.0。
经由用UltraEdit32剖析,发明Access2000和Access2002的数据库加密体例不异,以是以下只针对Access2000的mdb文件。另有就是我用的是16进制的数暗示,以是后面加了0x,假如你用的是VB或其他,要注重数值哦。
起首用AccessXP创立了一个空暗码的数据库文件db1.mdb,包括一个表,个中有一个字段,没有填任何数据。保留加入然后复制一份为db2.mdb,以独有体例翻开2.mdb,并加上暗码1324567890123保留加入。
用UltraEdit32翻开这两个数据库,并举行对照。我对照的办法也很复杂。在UltraEdit32中,疾速的往返点击被翻开文件的选项卡(就是在两个文件间往返切换,呵呵。笨举措吧),发明从文件头入手下手0x42字节处产生变更。
以下为援用的内容:
db1.mdb
00000040h:BC4EBE68EC3765D79CFAFECD28E62B25;
00000050h:8A606C077B36CDE1DFB14F671343F73C;
00000060h:B1330CF2795BAA267C2A4FE97C990513;
db2.mdb
00000040h:BC4E8F68DE3756D7A8FACBCD1EE61C25;
00000050h:B26055074B36FCE1EDB17C671343F73C;
00000060h:B1330CF2795BAA267C2A4FE97C990513;

为了看的分明些,我把分歧的字节加了色彩。看出门道了吧,Access97今后的版本里,暗码字节不再是一连寄存,而是隔一个字节存一个。而且经由加密。到于解密的办法嘛,仍是用老举措“异或”!0xBE^0x8F=0x31,这恰好是Ascii码"1"哦。下一个0xEC^0xDE=0x32恰好是Ascii码"2",呵呵。一向到最初一个分歧的0x4F^0x7C=0x33,将获得的字切合成字符串,即是暗码明文“1234567890123",万万不要觉得如许就出工了。由于这一次是恰好碰对了。呵呵。我刚入手下手也觉得就这么复杂,因而用CB做了个小程序,试着解了几个mdb暗码都还行,但是试到动网论坛的mdb文件时发明掏出来的暗码不合错误,晕了。因而用别的一个取mdb暗码的工具看了一下,发明人家的就能够准确的掏出暗码,是Access2000的格局,因而感到微软加密的体例仍是没研讨完。持续事情,用UltraEdit32翻开动网论坛的数据库dvbbs.mdb,和我后面的加过密的数据库做对照,发明分歧的中央良多。只好一个字节一个字节的试。。。。nnn次今后发明第0x62处的这个字节起着关头感化,暂称之为加密标记。
以下为援用的内容:
db1.mdb//空暗码
00000040h:BC4EBE68EC3765D79CFAFECD28E62B25;
00000050h:8A606C077B36CDE1DFB14F671343F73C;
00000060h:B1330CF2795BAA267C2A4FE97C990513;
db2.mdb//暗码为:1234567890123
00000040h:BC4E8F68DE3756D7A8FACBCD1EE61C25;
00000050h:B26055074B36FCE1EDB17C671343F73C;
00000060h:B1330CF2795BAA267C2A4FE97C990513;
dvbbs.mdb//暗码为:yemeng.net
00000040h:BC4EDB6A893714D5F9FA8CCF4FE61927;
00000050h:E46015050F36D1E3DFB153651343EB3E;
00000060h:B13310F0795BB6247C2A4AE07C990513;

怎样试呢,仍是异或。取0x42处入手下手的字节0xDB与空暗码文件的0x42处字节异或,取0x62处的加密标记与空暗码文件0x62处字节异或,然后再把获得的两个值相异或:
(0xDB^0xBE)^(0x10^0x0C)=0x79这个值是Ascii的"y",然后取下一个字节(记得隔一个字节取一个)
(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的举措,假如哪位晓得的话,请指导。 
代码:
//这里界说的是13个字节作为Access2000异或的源码。与之绝对应的加密标记是0x13,ccrun特此说明
//固然你能够用这一组:BEEC659CFE282B8A6C7BCDDF4F与这一组绝对应的加密标记是0x0c
//呵呵.程序有些乱,但愿人人能看的懂
charPassSource2k={0xa1,0xec,0x7a,0x9c,0xe1,0x28,0x34,0x8a,0x73,0x7b,0xd2,0xdf,0x50};
//Access97的异或源码
charPassSource97={0x86,0xfb,0xec,0x37,0x5d,0x44,0x9c,0xfa,0xc6,0x5e,0x28,0xe6,0x13};
以下为援用的内容:
void__fastcallTMainForm::GetMdbPass()
{
charPassStrTemp,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^PassSource97)==0)
MdbPassword="暗码为空!";
else
{
MdbPassword="";
for(intj=0;j<13;j++)
MdbPassword=MdbPassword+char(PassStrTemp^PassSource97);
}
}
else
{
MdbVersion="Access2000or2002";
MdbPassword="";
for(intj=0;j<13;j++)
{
if(j%2==0)
t1=char(0x13^EncrypFlag^PassStrTemp^PassSource2k);
//每隔一个字节就与加密标记相异或。这里的加密标记为0x13
else
t1=char(PassStrTemp^PassSource2k);
MdbPassword=MdbPassword+t1;
}
}
if(MdbPassword<0x20||MdbPassword>0x7e)
MdbPassword="暗码为空!";
EditMdbFileName->Text=MdbFileName;
EditMdbPassword->Text=MdbPassword;
EditMdbVersion->Text=MdbVersion;
}


与其他数据库相比,MySQL易学易用。

莫相离 发表于 2015-1-19 08:58:55

微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。

小女巫 发表于 2015-1-27 19:25:52

varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。

若天明 发表于 2015-2-5 11:53:46

我们学到了什么?思考问题的时候从表的角度来思考问

变相怪杰 发表于 2015-2-11 17:11:06

只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。

老尸 发表于 2015-3-2 17:39:30

连做梦都在想页面结构是怎么样的,绝非虚言

冷月葬花魂 发表于 2015-3-11 04:53:30

这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。

精灵巫婆 发表于 2015-3-17 21:08:21

分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。

飘灵儿 发表于 2015-3-25 02:38:19

至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
页: [1]
查看完整版本: MYSQL网站制作之破解Access的暗码