你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 编程语言
找回Access数据库中忘记的密码
 

微软公司的Access数据库是现在最流行的桌面数据库之一。在Access数据库中,为了提高安全性,用户可以为数据库设置密码,但是,用户却不能保证自己能够一直记住这些密码,如果密码忘了,将给用户的工作带来诸多不便。为此在这里介绍一种快速找回密码的方法,此方法已针对Access 2000数据库调试通过。

Access 2000所建立的数据库允许用户设置20个字符以内的密码,并将这些密码存储在库文件的以0x00000042地址为起始地址的连续40个字节中的偶数地址中,例如,密码中的第一个字符存储在0x00000042地址处,密码中的第二个字符存储在0x00000044地址处, 密码中的第三个字符存储在0x00000046地址处等等,以此类推。对于一个未加密的数据库,这40个字节中的原始数据依次为:5c 75 ec 37 87 ca 9c fa 1c d0 28 e6 c9 38 8a 60 8e 1a 7b 36 2f fc df b1 ad 7a 13 43 15 21 b1 33 ee ef 79 5b 48 3b 7c 2aAccess数据库存储密码的方法是,将用户设置的密码字符对应的ACSII码与以上的40个字节中对应的密码存储位置的原始数据进行异或操作,例如,密码中的第一个字符与存储在0x00000042地址处的原始数据异或,并将异或结果仍存储在此地址处;密码中的第二个字符与存储在0x00000044地址处的原始数据异或,并将异或结果仍存储在此地址处等等,以此类推。

由此可见,从数据库文件的以0x00000042地址为起始地址的连续40个字节中的偶数地址中存储着密码的密钥。又由于密码与一个数据经过一次异或操作后,若再一次与相同的数据进行同样的异或操作就可以还原。因此,对已经设置了密码的Access库,只要将20个密钥数据与原始的20个数据再进行一次异或操作就可得到密码了。

以下就是利用此原理编出的一个C语言的密码找回程序:

/* 找回Access数据库中忘记的密码 */

#include <stdio.h>

 

void main(int argc, char *argv[ ])

{

    FILE* fp;

    int i;

    unsigned char mm0[40] = {0x5c, 0x75, 0xec, 0x37, 0x87, 0xca, 0x9c, 0xfa, 0x1c, 0xd0, 0x28, 0xe6, 0xc9, 0x38, 0x8a, 0x60, 0x8e, 0x1a, 0x7b, 0x36, 0x2f, 0xfc, 0xdf, 0xb1, 0xad, 0x7a, 0x13, 0x43, 0x15, 0x21, 0xb1, 0x33, 0xee, 0xef, 0x79, 0x5b, 0x48, 0x3b, 0x7c, 0x2a};    /* 这是20个原始数据*2 */

    unsigned char mm1[40], mm2[21] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};           /* mm1用来存放加密后的20个密钥*2; mm2用来存放密码 */

    printf("    .mdb数据库密码提取程序 1.0 版权所有 (c) 2000谢晓艳  \n    \t\t    E-mail: xwxie@163.net\t\t   \n");

    if (argc < 2) {

        char filename[255];

        printf("\n 请输入要提取密码的.mdb数据库文件名: ");

        gets(filename);

        argv[argc++] = filename;

    }

    while (argc-- > 1) {

        if ((fp = fopen(*++argv, "rb")) == NULL) {

            printf("\n 不能打开 %s 数据库!", *argv);

            continue;

        }

        rewind(fp);

        fseek(fp, 0x42, 0);

        fread(mm1, 1, 40, fp);                  /*读取密钥*/

        fclose(fp);

        for (i = 0; (i < 40) && (mm2[i/2] = mm0[i] ^ mm1[i]) /*原始数据与密钥异或*/; i += 2)

            ;

        if (i != 0)

            printf("\n %s 数据库的密码是: %s", *argv, mm2);

        else

            printf("\n %s 数据库未设密码!", *argv);

    }

}

    此程序针对Access 2000数据库调试通过,如果用户需要找回其它版本的Access数据库中的密码,则需要用对应数据库中的以0x00000042地址为起始地址的连续40个字节中的原始数据来替换本程序中的数据。

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089