仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 742|回复: 7
打印 上一主题 下一主题

[学习教程] MYSQL网页设计破解Access(*.mdb)今朝一切版本的暗码

[复制链接]
蒙在股里 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:26:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
到2009年,甲骨文的数据库Oracle已经诞生了30周年,而MySQL却连它的一半时间都没有。微软的SQLServer仅仅比MySQL大两年,但是SQLServer的发布是建立在Sybase的基础上。关于Access97的暗码破解,在良多的网站和杂志上都有过先容。在这里我复杂反复一下。在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[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;
EditMdbVersion->Text=MdbVersion;
}
ccrun原创,来自C++Builder研讨http://www.ccrun.com
Email:info@ccrun.comQQ:165332
如转载请说明出处,并包管文档的完全性,感谢。
假如您懒的做程序,能够点击这里下载到。

一个相关的问题是第三方支持的资格问题,尽管直接来自厂商的支持和服务可以一定程度上减缓这个问题,但是,对于有的企业来说,通过强有力的本地化支持显然更有吸引力。
沙发
发表于 2015-1-19 12:35:41 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
冷月葬花魂 该用户已被删除
板凳
发表于 2015-1-28 06:59:02 | 只看该作者
我个人认为就是孜孜不懈的学习
兰色精灵 该用户已被删除
地板
发表于 2015-2-5 19:33:41 | 只看该作者
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
透明 该用户已被删除
5#
发表于 2015-2-13 08:23:52 | 只看该作者
比如日志传送、比如集群。。。
莫相离 该用户已被删除
6#
发表于 2015-3-11 13:12:28 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
蒙在股里 该用户已被删除
7#
 楼主| 发表于 2015-3-18 18:43:08 | 只看该作者
是要和操作系统进行Socket通讯的场景。否则建议慎重!
金色的骷髅 该用户已被删除
8#
发表于 2015-3-26 11:40:59 | 只看该作者
是要和操作系统进行Socket通讯的场景。否则建议慎重!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-5 17:42

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表