ACCESS數(shù)據(jù)庫(kù)找回忘了的密碼的原理

   在Access數(shù)據(jù)庫(kù)中,為了安全起見(jiàn),可以為所建的數(shù)據(jù)庫(kù)設(shè)置密碼。但是,密碼忘了怎么辦?別急,這里介紹一種找回密碼的方法。
   用Access所建的數(shù)據(jù)庫(kù),在庫(kù)文件的地址00000042處開(kāi)始的13個(gè)字節(jié)是Access庫(kù)的密碼位。如果一個(gè)未加密的庫(kù),這13個(gè)字節(jié)原始數(shù)據(jù)依次為:86 FB 37 5D 44 9C FA C6 28 E6 13。事實(shí)上,當(dāng)你設(shè)置了密碼后,Access就將你的密碼(請(qǐng)注意你所輸入的密碼是本文字符)的ACSII碼與以上的13個(gè)字節(jié)數(shù)據(jù)進(jìn)行異或操作,因此,從庫(kù)文件的地址00000042開(kāi)始的13個(gè)字節(jié)就變成了密鑰了。例如,如果你設(shè)置的密碼為abc,經(jīng)過(guò)異或操作后,則從00000042處開(kāi)始的13個(gè)字節(jié)的數(shù)據(jù)變成了E7 99 8F 37 5D 44 9C FA C6 28 E6 13。一個(gè)數(shù)據(jù)經(jīng)過(guò)一次異或操作后,再一次經(jīng)過(guò)同樣的異或操作就可還原了。因此,對(duì)已經(jīng)設(shè)置了密碼的Access庫(kù),只要將13個(gè)密鑰數(shù)據(jù)與原始的13個(gè)數(shù)據(jù)進(jìn)行一次異或操作就可得到密碼了。
   以下是一個(gè)C語(yǔ)言的破解程序:
   /*假設(shè)加密后的Access庫(kù)為myacc.mdb,并存放在C盤(pán)的根目錄下*/
   #include ″stdio.h″
   main()
   {FILE * fp
   char mm0[13]={0x86,0xfb,0xec,0x37,0x5d,0x44,0x9c,0xfa,0xc6,0x5e,0x28,0xe6,0x13};
   /*這是13個(gè)原始數(shù)據(jù)*/
   char mml[13],mm2[13];
   /*mm1用來(lái)存放加密后的13個(gè)密鑰;mm2用來(lái)存放密碼*/
   int i,k;
   fp=fopen(″c:\myacc.mdb″,″rb″);
   if(fp=NULL){
   printf(″ 不能打開(kāi)該庫(kù)!″);
   exit(0);}
   rewind(fp);fseek(fp,0x42L,0);
   fread(mm1,13,1,fp);/*讀取密鑰*/
   for(i=0;i<13;i++){
   mm2[i]=mm0[i]^mm[i];*/原始數(shù)據(jù)與密鑰異或*/
   else
   break;}
   k=1;fclose(fp);
   if(k=0)
   printf(″未設(shè)密碼!″);
   else{printf(″ 密碼是: ″);
   for(i=0;ibr>   printf(″%c,mm2[i]″);}}
   順便提一句,Access庫(kù)設(shè)置密碼時(shí),雖然允許輸入最多14個(gè)密碼字符,但只有前13個(gè)有效。
北大青鳥(niǎo)網(wǎng)上報(bào)名
北大青鳥(niǎo)招生簡(jiǎn)章