百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

破解mdb密码的java程序

yuyutoo 2025-02-26 14:26 2 浏览 0 评论

使用一个比较古老的程序软件,发现使用的数据库是 mdb 格式,于是想看看数据库设计是什么样的。双击显示需要密码。这个 。。。 。。。 看看有没有公开密码吧。

很老的软件了,mdb 的版本也不确定是哪个版本了,发现了破解密码的文章,不过是要用到VB6的,VB相关的知识早就忘光光了。不过 JAVA倒是一直在开发。

把 VB 的代码 java 化就好了呀。自己写?太麻烦了,现在AI这么方便,当然是用 AI啦。

复制VB的代码给AI工具,几秒钟就有结果了。

结果如下:

public class MdbPasswordDecoder {
    // Access 2000/2002的异或源码
    private static final byte[] PASS_SOURCE_2K = {
        (byte)0xa1, (byte)0xec, (byte)0x7a, (byte)0x9c, 
        (byte)0xe1, (byte)0x28, (byte)0x34, (byte)0x8a,
        (byte)0x73, (byte)0x7b, (byte)0xd2, (byte)0xdf, 
        (byte)0x50
    };
    
    // Access 97的异或源码
    private static final byte[] PASS_SOURCE_97 = {
        (byte)0x86, (byte)0xfb, (byte)0xec, (byte)0x37, 
        (byte)0x5d, (byte)0x44, (byte)0x9c, (byte)0xfa,
        (byte)0xc6, (byte)0x5e, (byte)0x28, (byte)0xe6, 
        (byte)0x13
    };

    public static void main(String[] args) {
        createAndShowGUI();
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("MDB密码解码器");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 300);
        frame.setLayout(null);

        JTextField pathField = new JTextField();
        pathField.setBounds(20, 20, 350, 25);
        
        JButton selectButton = new JButton("选择文件");
        selectButton.setBounds(380, 20, 90, 25);
        
        JTextField versionField = new JTextField();
        versionField.setBounds(20, 60, 450, 25);
        versionField.setEditable(false);
        
        JTextField passwordField = new JTextField();
        passwordField.setBounds(20, 100, 450, 25);
        passwordField.setEditable(false);

        selectButton.addActionListener(e -> {
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
                public boolean accept(File f) {
                    return f.isDirectory() || f.getName().toLowerCase().endsWith(".mdb");
                }
                public String getDescription() {
                    return "Access Database (*.mdb)";
                }
            });

            if (fileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) {
                File selectedFile = fileChooser.getSelectedFile();
                pathField.setText(selectedFile.getAbsolutePath());
                getMdbPass(selectedFile, versionField, passwordField);
            }
        });

        frame.add(pathField);
        frame.add(selectButton);
        frame.add(versionField);
        frame.add(passwordField);
        frame.setVisible(true);
    }

    private static void getMdbPass(File file, JTextField versionField, JTextField passwordField) {
        try (RandomAccessFile raf = new RandomAccessFile(file, "r")) {
            // 读取版本信息
            raf.seek(0x14);
            int ver = raf.read();

            // 读取加密标志
            raf.seek(0x62);
            byte encrypFlag = raf.readByte();

            // 读取加密后的密码
            raf.seek(0x42);
            byte[] passStrTemp = new byte[26];
            raf.read(passStrTemp);

            String mdbVersion;
            StringBuilder mdbPassword = new StringBuilder();

            if (ver < 1) {
                // Access 97
                mdbVersion = "Access 97";
                if ((passStrTemp[0] ^ PASS_SOURCE_97[0]) == 0) {
                    mdbPassword.append("密码为空!");
                } else {
                    for (int j = 0; j < 13; j++) {
                        mdbPassword.append((char)(passStrTemp[j] ^ PASS_SOURCE_97[j]));
                    }
                }
            } else {
                // Access 2000 or 2002
                mdbVersion = "Access 2000 or 2002";
                for (int j = 0; j < 13; j++) {
                    byte t1;
                    if (j % 2 == 0) {
                        t1 = (byte)(0x13 ^ encrypFlag ^ passStrTemp[j * 2] ^ PASS_SOURCE_2K[j]);
                    } else {
                        t1 = (byte)(passStrTemp[j * 2] ^ PASS_SOURCE_2K[j]);
                    }
                    mdbPassword.append((char)(t1 & 0xFF));
                }
            }

            // 检查密码是否有效
            if (mdbPassword.length() > 0 && 
                (mdbPassword.charAt(0) < 0x20 || mdbPassword.charAt(0) > 0x7e)) {
                mdbPassword = new StringBuilder("密码为空!");
            }

            versionField.setText("版本: " + mdbVersion);
            passwordField.setText("密码: " + mdbPassword.toString());

        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "文件读取错误:" + ex.getMessage());
        }
    }

运行起来截图如下:

效果还不错。

相关推荐

像这样即能找勾又能打×的下拉菜单,您知道是怎么做的吗?

您知道像这样既能打勾又能打叉的下拉菜单怎么制作吗?比如这是一个考勤表,今天没有来,可以用叉看下拉菜单一个叉,然后这天到了打勾。怎么制作?·第一步,选中要制作的下拉菜单的单元格。·第二步,选择数据菜单里...

Axure教程:制作下拉选择框部件的联动效果

本文通过一个相对简单的示例,介绍了如何制作下拉选择框的联通效果。产品经理在制作产品原型的过程中,经常会遇到部件间联动的效果设计。如果不能通过原型交互方式来完成,则会以“静态页面+文字说明+步骤指引”的...

Excel技巧:最简单的制作下拉列表的方法

在制作报表的时候,经常会输入一些重复性的内容。这时候使用下拉列表直接选择,就可以简化重复输入的操作,不用费时费力地复制粘贴,同时录入信息页更加准确。示例图:操作步骤:...

下拉刷新之后,为什么我惊呆了?

2009年LorenBrichter在Tweetie2中首创了PullDowntoRefresh「下拉刷新」的交互方式,现在这一创举早已成为了各种Feed类应用的标准配置。虽...

每天进步一点点——excel如何设置下拉选项

excel在数据录入的时候,有时候为了方便,不逐条手打,我们常会设置一个下拉选项,直接进行选择。比如性别的录入,就可以偷懒,直接手动选择,比一个个打字要快。最简单下拉选项(以录入性别为例子)第一步,我...

EXCEL表格常用 下拉序号的三种方法 三分钟学会这些方法 详细教程

下拉序号三种方法做表格输入序列号是常有的事,正因为经常输入,我们不好一个一个的去输入,那样太累了。假如有100个序号,我们从一输入到100,会很累的。下面我们学习一下三种输入序号的方法:...

3种方法教你制作Excel中“下拉菜单”

在Excel中,我们经常会面对有很多的数据需要录入,尤其是一些重复的数据。那如何才能解决这个令我们头疼的问题呢,这就是我今天要介绍的下拉菜单的制作。...

表格自动新增下拉选项,Ctrl+T解决重复设置难题,80%人都碰到过

为了方便进行数据输入、汇总及统计,规范我们的Excel表格格式,我们在工作中经常会对单元格进行数据有效性设置,这样可以限定单元格根据下拉选项进行填写内容,让大家按照统一的规范进行输入。如上图所示,我们...

Excel制作搜索式下拉菜单,1条公式,2步搞定

下拉菜单在数据录入的时候,可以提升工作效率,但是如果下拉菜单数据太多的时候,也不好进行选择,我们可以制作成可以搜索的下拉菜单,先输入一个关键字,然后再次进行选择效果如下所示:制作的方法其实很简单,只需...

快速下拉,特别适用于要拉的手断的那种大量数据情况。

办公小技巧:制作更炫酷的Excel下拉菜单

在Excel中制作下拉菜单,大都是利用数据有效性,再有就是表单控件中的组合框。数据有效性或表单控件组合框制作下拉菜单,快捷、便利、实用、功能很全面,但也有力所不及的地方,比如设置下拉菜单的字体、颜色、...

Excel制作智能模糊搜索下拉菜单,1条公式搞定

我们有一列数据,想制作成下拉菜单,然后输入部分关键字,就可以模糊搜索符合条件的值,提供对应的下拉菜单供我们选择,效果如下所示:1、WPS中的EXCELWPS关于下拉菜单,已经做到了智能搜索,所以只需要...

负面下拉词:深入解析与应对策略

你要写负面下拉词,就不能只写负面下拉词。要写信息时代的暗流涌动,数据洪流中潜藏的危机与机遇;要写算法逻辑的冷酷无情,如何在用户行为与数据驱动下,悄然形成负面印象的漩涡;要写品牌与个人的挣扎与抗争,如何...

制作Excel下拉菜单,源数据更新,无需重新设置

在做表格数据录入工作的时候,一方面需要提升数据录入的效率,也需要防止数据录入出错,因此我们会对数据区域设置下拉菜单,从下拉选项中选择我们需要的数据进行录入1、下拉菜单基本设置首先我们要准备下拉菜单的数...

制作2级联动下拉菜单,1分钟搞定,快来学吧!

数据录入的时候,经常需要用到两级下拉菜单,并且需要联动,输入完第一级内容之后,第二级的内容是对应的效果如下所示:制作过程也非常简单,只需要几步就可以完成1、准备数据源第一行中的数据,输入一级下拉菜单中...

取消回复欢迎 发表评论: