Chinaunix首页 | 论坛 | 博客
  • 博客访问: 139015
  • 博文数量: 94
  • 博客积分: 1572
  • 博客等级: 上尉
  • 技术积分: 925
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-04 00:03
文章分类

全部博文(94)

文章存档

2011年(94)

我的朋友

分类: C/C++

2011-04-07 14:36:43

刚刚无意间发现网上有很Access密码破解工具,而且不是穷举方法的暴力破解。据说是Access中的某个偏移位置开始就是存储的密码信息。

所以我把2个设置不同密码的空数据库进行二进制比较(一个密码是abc,另外一个是123)。果然只有3个字节的内容不同(当然不是明文存储的密码)。

试着去找规律,一般最简单的加密方法就是把当前密码和一个固定字节数组做异或运算(异或运算不用说了吧,一次异或加密,再异或解密,最简单的加密)。

在abc这个数据库里把当前变化字节分别与a、b、c对应的ascii代码进行异或运算得出了 0x77 0xec 0xac,再用得出的这3个数和另外一个数据库的变化字节做"异或"得出了:123

这个加密也太简单了,没有动态变化密码存储位置,没有打乱顺序,没有2次异或加密。也就是说只要能得到加密的access数据库文件,是否加密了根本不重要。

附件里有个我写的测试程序,VC6.0 + XP + Access 2003 测试通过(我用的标准C的函数,任意一个c编译器应该就能通过)。

  1. #include "stdio.h"
  2. void main()
  3. {
  4.     FILE *file = 0;
  5.     int i;
  6.     char tmp, pwd[] = {0x77,0xec,0xac,0x9c,0x37, //
  7.                        0x28,0xe2,0x8a,0xa5,0x7b, // 此串适合 Microsoft Access 2003
  8.                        0x04,0xdf,0x86,0x13,0x3e, // 其他版本用比较的方法也能轻松获得
  9.                        0xb1,0xc5,0x79,0x63,0x7e}; //
  10.     file = fopen("test.mdb","r");
  11.     if(file) {
  12.         for(i=0; i<20; i++) {
  13.             fseek(file, 0x42 + i * 2, SEEK_SET);
  14.             fread(&tmp, sizeof(char), 1 ,file);
  15.             pwd[i] = pwd[i] ^ tmp;
  16.         }
  17.     }
  18.     printf("pwd:%s\n", pwd);
  19.     getchar();
  20. }
阅读(643) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~