Access 密码破解原理- -

     ACCESS数据库的密码极容易被破,使用网上流行的工具,不管你的密码多少位很快就能被破出来。原以为ACCESS与WORD EXCEL一样,作为MS OFFICE的套件,一样采用DES加密,非破暴力破解不可。密码倍数越长越难破。结果,一试,果然很快被破出来。
    经查询,原来ACCESS加密过于简单。如下:
    在库文件的地址00000042处开始的40个字节是Access 2000库的密码位。如果一个未加密的库,这40个字节原始数据依次为:29 77 EC 37 F2 C8 9C FA 69 D2 28 E6 BC 3A 8A 60 FB 18 7B 36 5A FE DF B1 D8 78 13 43 60 23 B1 33 9B ED 79 5B 3D 33 3D 39 7C 2A 。当你给数据库设置了密码后,这40个字节就变成了密钥。因此,要破解密码而不需保持原库的密码,只要将00000042 处开始的40个字节还原成原始数据就行了,从而跳过口令。
另外,当你设置了密码后,Access 2000 就将你的密码的ASCII码与以上的40个字节数据进行异或操作,因此,从库文件的地址00000042开始的40个字节就变成了密钥了。例如,如果你设置的密码为12345678901234567890(注意:最多只能设20个ASCII字符),经过异或操作后,则从00000042处开始的40个字节的数据就变成了 18 77 DE 37 C1 C8 A8 FA 5C D2 1E E6 8B 3A B2 60 C2 18 4B 36 6B FE ED B1 EB 78 27 43 55 23 87 33 AC ED 41 5B 04 39 4C 2A 。大家都知道,一个数据经过一次异或操作后,再一次经过同样的异或操作就可还原了。因此,对已经设置了密码的Access 2000库,只要将40个密钥数据与原始的40个数据进行一次异或操作就可得到密码了。
    最后,要注意的是,由于ACCESS 2000对每个密码字符采用双字节表示,故40个字节原始数据可依次分为20组,每组代表一个密码字符,进行异或操作的是每组的第一个字节,第二个字节不变。
// CrackAccessPassDlg.cpp : 实现文件
//#include "stdafx.h"
#include "CrackAccessPass.h"
#include "CrackAccessPassDlg.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialog
{
public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()// CCrackAccessPassDlg 对话框CCrackAccessPassDlg::CCrackAccessPassDlg(CWnd* pParent /**//*=NULL*/): CDialog(CCrackAccessPassDlg::IDD, pParent), m_filePath(_T(""))
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CCrackAccessPassDlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, m_filePath);
}BEGIN_MESSAGE_MAP(CCrackAccessPassDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()//}}AFX_MSG_MAPON_BN_CLICKED(IDC_BUTTON1, &CCrackAccessPassDlg::OnBnClickedButton1)
END_MESSAGE_MAP()// CCrackAccessPassDlg 消息处理程序BOOL CCrackAccessPassDlg::OnInitDialog()
{CDialog::OnInitDialog();// 将“关于”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);            // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标// TODO: 在此添加额外的初始化代码return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CCrackAccessPassDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CCrackAccessPassDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CCrackAccessPassDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CCrackAccessPassDlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码CFileDialog fd(TRUE,"*.mdb","",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"ACCESS数据库文件(*.mdb)|*.mdb|所有文件(*.*)|*.*||",NULL,0);INT_PTR nResponse = fd.DoModal();if(nResponse == IDOK){m_filePath = fd.GetPathName();UpdateData(false);DoCrack();}
}/**//*
* @ 解密工作
*/
void CCrackAccessPassDlg::DoCrack()
{CString PassWord;BYTE accVer[3] = {0};BYTE accID = 0x00;BYTE accFile[40] = {0};BYTE accDataKey[128] = {0};char accFlagString[16] = {0};//以只读方式打开CFile myFile(m_filePath,CFile::modeRead | CFile::shareDenyNone);DWORD len = myFile.GetLength();if(len > 320){myFile.Seek(66,CFile::begin);myFile.Read(&accFile,sizeof(accFile));myFile.Seek(156,CFile::begin);myFile.Read(&accVer,sizeof(accVer));myFile.Seek(20,CFile::begin);myFile.Read(&accID,sizeof(accID));myFile.Seek(24,CFile::begin);myFile.Read(&accDataKey,sizeof(accDataKey));myFile.Seek(4,CFile::begin);myFile.Read(&accFlagString,sizeof(accFlagString));}myFile.Close();if(strcmp(accFlagString,"Standard Jet DB")){SetDlgItemText(IDC_VER,"不是Access数据库!");return;}char *sKey2K = "3074EC37EBCB9CFA70D128E6A5398A60E21B7B3643FDDFB1C17B13437920B13382EE795B243A7C2A";char *sKey97 = "86FBEC375D449CFAC65E28E613";CString Version;//判断版本虽然没用,先留着if(accVer[0] == '0'){Version = "3.51";}else{Version = (CString)accVer;}Version = (accID == 0 ? "Access 97":"Access 2000");SetDlgItemText(IDC_VER,Version);//取密码if(accID == 1){PassWord = CrackPassDirect(accDataKey);if ( PassWord.GetLength() == 0){PassWord = "没有密码";}}else if(accID == 0){PassWord = CrackPass97(accFile);if(PassWord.GetLength() ==0){PassWord = "没有密码";}}else{PassWord = "不是Access数据库";}SetDlgItemText(IDC_PASS,PassWord);
}CString CCrackAccessPassDlg::CrackPassDirect(BYTE (&f_bytes)[128])
{CString ret;long l;BYTE EncryptKey[4];       //初始密钥BYTE EncryptRet[258] = {0};EncryptKey[0] = 0xC7;EncryptKey[1] = 0xDA;EncryptKey[2] = 0x39;EncryptKey[3] = 0x6b;//得到解密Keyfor(l=0;l<=255;l++){EncryptRet[l] = l;}long temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8;temp1 = temp2 = temp3 = temp4 = temp5 = temp6 = temp7 = temp8 = 0;for(l=0;l<=255;l++){temp1 = temp2;temp1 = EncryptKey[temp1];temp4 = EncryptRet[l];temp1 = temp1 + temp4;temp4 = temp3;temp1 = temp1 + temp4;temp1 = temp1 & 0x800000FF;temp3 = temp1;temp1 = EncryptRet[l];temp5 = temp1;temp1 = temp3;temp1 = EncryptRet[temp1];EncryptRet[l] = temp1;temp4 = temp3;EncryptRet[temp4] = temp5;temp1 = temp2;temp1++;temp4 = temp1 % 4;temp2 = temp4;}//运算结束//又一轮运算temp1=temp2=temp3=temp4=temp5=temp6=temp7=temp8=0;temp4 = EncryptRet[0x100];temp1 = EncryptRet[0x101];for(l=1;l<=0x80;l++){temp4++;temp4 &= 0x800000FF;temp3 = temp4 & 0xff;temp5 = EncryptRet[temp3];temp1 &= 0xff;temp5 += temp1;temp1 = temp5 & 0x800000FF;temp6 = EncryptRet[temp4];temp5 = EncryptRet[temp1];EncryptRet[temp3] = temp5;temp2 = temp1;EncryptRet[temp2] = temp6;temp5 = EncryptRet[temp3];temp3 = EncryptRet[temp1 & 0xff];temp5 += temp3;temp5 &= 0x800000FF;temp7 = temp5;temp3 = temp8;temp5 = EncryptRet[temp5];long t = f_bytes[temp3] ^ temp5;f_bytes[temp3] = t;temp8 ++;}EncryptRet[0x100] = temp4;EncryptRet[0x101] = temp1;//又一轮结束double db;::MoveMemory(&db,&f_bytes[90],8);//::RtlMoveMemory(&db,(&f_bytes[0])+90,8);long Key = (int)db;long lResult[20];for(l=0;l<20;l++){lResult[l] = f_bytes[l*2+42]+256*(long)f_bytes[l*2+43];if(l%2 == 0){lResult[l] ^= Key;}if(lResult[l] != 0){ret += (char)lResult[l];}}return ret;
}CString CCrackAccessPassDlg::CrackPass97(BYTE (&f_bytes)[40])
{CString ret;BYTE KEY[] = {0X86,0xfb,0xec,0x37,0x5d,0x44,0x9c,0xfa,0xc6,0x5e,0x28,0xe6,0x13};long lAsc;for(int i=0;i<sizeof(KEY);i++){lAsc = f_bytes[i] ^ KEY[i];if(lAsc != 0){ret += (char)lAsc;}}return ret;
}

转载于:https://www.cnblogs.com/diulela/archive/2012/07/30/2615553.html

Access 密码破解原理- -相关推荐

  1. shell下密码破解原理

    经常看到有一些软件都是暴力破解密码的,md5加密之后的字符串是无法解密的,破解密码只是把已知的32位加密之后的字符串与自己事先写在txt文档里面的字符串md5加密之后进行比较,如果匹配上了,就用程序返 ...

  2. WPA-PSK无线网络密码破解原理

    1.基于WPA2的加密标准还是能够被破解,一个弊端是他无法避开时候双方验证的模式来认证取得合法性的连接,当我们抓取足够多得双反认证的数据包之后就可以破解密码.之前很多片的博客写了如何破解这种加密的秘钥 ...

  3. 不靠谱的Access 轻松破解密码

    刚刚无意间发现网上有很Access密码破解工具,而且不是穷举方法的暴力破解.据说是Access中的某个偏移位置开始就是存储的密码信息. 所以我把2个设置不同密码的空数据库进行二进制比较(一个密码是ab ...

  4. 无线攻击及密码破解的四种方式详解

    随着社会的进步,现在我们在每一地方逗留都离不开无线通信,WiFi.4G等等:这就是无线领域的优势所在! 无线领域十分难以捉摸,从一点儿一点儿进步到现在,无线的安全深入人心,站在安全的角度来说无线通信一 ...

  5. Wifi密码破解与局域网抓包监听(小白--纯工具版)

    使用的自家设备仅作测试和技术讨论! 工具介绍:(本身电脑自带了WIN7和Ubuntu双系统) 1,wifi密码破解: CDlinux.iso  :一个Linux系统,集成了wifi密码的PIN码破解软 ...

  6. 20款 密码破解工具

    没有密码不用急!20种超全的解密工具任你选!!值得下载珍藏的呀!! 以下含扩了从系统密码到应用软件.最高深的BIOS到最常见的ZIP.RAR压缩文件几乎所有的密码解读.解密工具(共计190条),以方便 ...

  7. 网络安全笔记-02-win7 粘滞键系统密码破解

    win7 粘滞键系统密码破解 原理: 部分win7或者win10 在未进入系统时,可通过系统修复漏洞篡改文件名 连按五次shift键会触发粘滞键程序,该程序名称为sethc.exe程序,所处位置在c: ...

  8. CCNP1交换:三层架构概述、路由器交换机登录密码破解、VLAN、trunk(ISL、dot1Q)、DTP、VTP、交换机工作原理

    文章目录 CCNP1交换:三层架构概述.路由器交换机登录密码破解.VLAN.trunk(ISL.dot1Q).DTP.VTP.交换机工作原理 一.企业网三层架构概述: 1.冗余: 2.三层架构: 二. ...

  9. 浅谈通过CMOS放电破解BIOS密码的原理

    浅谈CMOS放电破解BIOS密码的原理 ROM和RAM BIOS CMOS 主板电池 CMOS放电清除BIOS密码 电脑开机密码是软件密码,比较容易破解:BIOS密码是硬件密码,如果忘了BIOS密码该 ...

最新文章

  1. 听说,这是时下最恐怖的出游邀请
  2. Android--手势触控屏幕控制/GestureDetector
  3. halcon算子盘点:Chapter 15灰度分割
  4. 链接oracle spatial,oracle spatial初试
  5. rk3288 android4.4,ubuntu16.04下firefly rk3288的编译安卓4.4
  6. [NOI2012]美食节
  7. Pa interface issue——PA_EXCEED_ROUND_LIMIT
  8. python getchar,Linux C编程学习:getchar()和getch()
  9. 年薪不到 25.2 万退学费,廖雪峰的“大数据高级开发”课程招生
  10. 计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换(转载)
  11. MySQL中EXPLAIN详解
  12. bootstrap table传回的数据后端怎么获取_基于 Spring Cloud 开发的分布式系统,遇到爬虫、接口盗刷怎么办
  13. 好程序员web前端分享逻辑运算
  14. Cocos2d-x 3.X手游开发实例详解
  15. 雷达最大不模糊速度_雷达基础知识:案例计算
  16. 【2020年度合辑】人工智能量化实验室原创推送合辑
  17. 2020《互联网周刊》年度评选结果揭晓, Smartbi获三项行业大奖
  18. 华为服务器安装nas系统,云服务器搭建nas
  19. 云计算被指变相占土地 专家称去伪存真
  20. oracle数据错误循环冗余检查,/S-Error: (OS 23) 数据错误(循环冗余检查)

热门文章

  1. iPhone 6 Plus 分辨率问题
  2. 旅游 - 珠海长隆海洋王国 - 鹦鹉过山车
  3. redis-port工具
  4. 曾仕强讲易经:元、亨、利、贞
  5. Configuring the Salt Minion - Salt Minion配置参数的完全说明
  6. Android 手机号格式验证(正则)
  7. jquery.ajaxSetup()函数详解
  8. HTTP和HTTPS、HTTP返回码
  9. 网络漫画书市场现状研究分析报告-
  10. 中缀表达式转后缀表达式两位数_什么是圆形磁动势?永磁无刷电机是怎么转起来的?...