2007年4月6日星期五

Access 2003的密码深入浅出

Access 2003的密码深入浅出
 

Microsoft Office Access 2003已经面试很久了,相关的解密程序也早就面试了。我用过一些,界面很好,很人性化。对密码的读取也是很方便的,这些都是我们应该学习的地方。今天我写着篇文章主要是让大家在使用的基础上更加了解Access数据库密码读取软件的原理。希望大家多多的指教。

下面我们开始。

Microsoft Office Access 2003 的密码存储的地方和过去的版本并不太一样,但是变动不是很大。

以前是从第63位开始顺序和字符串作异或,密码最大为13位,可是现在的Microsoft Office Access 2003的密码长度为20位,看上去密码比过去更加难以破解,其实不然,这次加密非常简单,大家往下看。

下面是access的头用二进制编辑器打开以后的二进制码。

以散列保存的,我们先来看一下没有家密码的头。

         00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000:00 01 00 00 53 74 61 6E 64 61 72 64 20 4A 65 74

00000010:20 44 42 00 01 00 00 00 B5 6E 03 62 60 09 C2 55

00000020:E9 A9 67 72 40 3F 00 9C 7E 9F 90 FF 85 9A 31 C5

00000030:79 BA ED 30 BC DF CC 9D 63 D9 E4 C3 D3 41 FB 8A

00000040:BC 4E B1 68 EC 37 6A D7 9C FA F1 CD 28 E6 24 25

00000050:8A 60 63 07 7B 36 C2 E1 DF B1 40 67 13 43 F8 3C

00000060:B1 33 03 F2 79 5B A5 26 7C 2A 4F E9 7C 99 05 13

00000070:98 FD 63 40 F3 4E 9B 58 82 66 5F 95 F8 D0 89 24

00000080:85 67 C6 1F 27 44 D2 EE CF 65 ED FF 07 C7 46 A1

00000090:78 16 0C ED E9 2D 62 D4 54 06 00 00 34 2E 30 00

看到了吗用红色标出来的是未加密的字符串,在往下看

         00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000:00 01 00 00 53 74 61 6E 64 61 72 64 20 4A 65 74

00000010:20 44 42 00 01 00 00 00 B5 6E 03 62 60 09 C2 55

00000020:E9 A9 67 72 40 3F 00 9C 7E 9F 90 FF 85 9A 31 C5

00000030:79 BA ED 30 BC DF CC 9D 63 D9 E4 C3 D3 41 FB 8A

00000040:BC 4E 80 68 DE 37 59 D7 A8 FA C4 CD 1E E6 13 25

00000050:B2 60 5A 07 4B 36 F3 E1 ED B1 73 67 27 43 CD 3C

00000060:87 33 34 F2 41 5B 9C 26 4C 2A 4F E9 7C 99 05 13

00000070:98 FD 63 40 F3 4E 9B 58 82 66 5F 95 F8 D0 89 24

00000080:85 67 C6 1F 27 44 D2 EE CF 65 ED FF 07 C7 46 A1

00000090:78 16 0C ED E9 2D 62 D4 54 06 00 00 34 2E 30 00

以上这个是加密过的头,用红色标出来的是密码存放的位置,剩下的问题就简单了,我们开始看一下是如何加密的。

用户输入的密码,从第一位和红字

第一位做ASC11异或,在放回红字第一位,解密只需把加密过的16近制字符和红字做异或即可。

下面我们写一个简单的程序来做一下解密

/////////////////////////////////

//  ----小松----

/////////////////////////////////

#include <stdio.h>

#include <tchar.h>

 

int _tmain(void)

{

     char passwd_n[20] = {0xB1, 0xEC, 0x6A, 0x9C, 0xF1,

                          0x28, 0x24, 0x8A, 0x63, 0x7B,

                          0xc2, 0xDF, 0x40, 0x13, 0xF8,

                          0xB1, 0x03, 0x79, 0xA5, 0x7C,};    //未加密

 

     char passwd_y[20] = {0x80, 0xDE, 0x59, 0xA8, 0xC4,

                          0x1E, 0x13, 0xB2, 0x5A, 0x4B,

                           0xF3, 0xED, 0x73, 0x27, 0xCD,

                           0x87, 0x34, 0x41, 0x9C, 0x4C};    //已加密

 

     for(int i = 0; i < 20; i++)

     {

          printf("%C,", passwd_n[i]^passwd_y[i]);

     }

}

上面这个简单的程序完成了密码的读取,大家如果有兴趣可以自己尝试。

 

没有评论: