database - ComponentACE 绝对数据库的密码恢复

标签 database delphi password-recovery

<分区>

我得到了一个很旧的桌面应用程序,它可能是用 Delphi C++ Builder 编写的,带有嵌入式 AbsoluteDB。

我需要使用 Swing 或 Flex/Air 创建一个新版本,但在此之前我需要检查数据库的确切架构。

不幸的是,数据库受密码保护。编写这个应用程序的程序员很久以前就离开了公司。

有办法恢复这个密码吗?

最佳答案

朴素的蛮力攻击

使用普通 TABSDatabase 尝试暴力攻击是没有意义的,因为:

  • 内部哈希方法和加密方法使用唯一的缓冲区作为输入和输出(作为引用传递)。每次迭代都需要处理相同的输入内容(为了节省 CPU 时间而没有缓存以供重用)。
  • 每个错误的密码都会引发异常,SEH 会添加另一个惩罚层(时间复杂度)。
  • 我怀疑其他设计特征(针对暴力攻击的反制措施)。

摆脱每一个多余的负载

在我的尝试中,我想到了这个工作裸露的 Delphi 类:

type
  TABSDBHack = class
  private
    FFilename: TFileName;

    // 2 relevant contiguous headers of an Absolute Database file
    FDBHeader: array [0..SIZEOFDBHEADER-1];
    FCryptoHeader: array [0..SIZEOFCRYPTOHEADER-1];

    // Mirror of the ControlBlock record from CryptoHeader
    FControlBlock: array [0..SIZEOFCONTROLBLOCK-1] of Byte; 
    //
    function GetEncrypted: Boolean;
    function GetFileName: TFileName;
    function GetPageSize: Word;
    function GetPageCountInExtent: Word;
    function GetCryptoAlgorithm: Byte;
  protected
    // Retrieving Data from stream into FDBHeader and FCryptoHeader
    procedure ReadStream(F: TStream);

    // Mainly FillChar(..., ...,#0) of the corresponding record
    procedure ClearDBHeader;
    procedure ClearCryptoHeader;
    procedure ClearControlBlock;

    // Probe the existence of 'ABS0LUTEDATABASE' as file signature
    function CheckABSSignature: Boolean;

    // Compute the CRC of FControlBlock record
    function CRC32: Cardinal;

    // Decrypt the persisted Control Block into FControlBlock
    function InternalDecryptBuffer(const APassword: string):Boolean;
  public
    procedure Clear;

    // Wrapping a ReadStream using a local TFileStream
    procedure LoadFromFile(Filename: TFileName);

    // Return True if the decrypted Control Block correspond to original plain one.
    // Otherwise stated: The persisted CRC (in the Crypto Header) is equal to 
    // the value returned by the function CRC32
    function CheckPassword(const APassword: string): Boolean;

    property FileName: TFileName read GetFileName;

    // Sample of plain Data peristed that can be retrieved
    property PageSize: Word read GetPageSize;
    property PageCountInExtent: Word read GetPageCountInExtent;
    property Encrypted: Boolean read GetEncrypted;
    property CryptoAlgorithm: Byte read GetCryptoAlgorithm;
  end;

我直接从文件中检索相关数据并探查给定的密码。

免责声明:

我使用 Absolute Database 6.0.7 个人版来开发它。

类定义已清除对分发的 DCU 中任何类型定义的任何引用,我无权分发基于它的二进制文件。

据了解,它在很大程度上取决于 DCU 的分布,主要是哈希和解密方法。随着时间的推移和对 Absolute Database 内部结构的更多了解,编写其加密引擎的洁净室实现应该是可行的:它似乎基于 Delphi Encryption Compendium,这是 Hagen Reddmann 的免费软件。


其他探索方向

  • 暴力恢复普通控制 block 可以被认为是因为 SIZEOFCONTROLBLOCK 仅等于 256。
  • 给定一对普通/加密的控制 block ,恢复 key 的内部表示可能使用过于暴力但要注意:例如 AES/Rijndael 的 128/192/256!
  • RipeMD(128 和 256)是一种众所周知的单向函数,在内部用于初始化 Key:恐怕在给定哈希值的情况下恢复字符串不太可行!
  • 大多数加密算法(至少最近的算法)在被采用为标准之前都在公众监督下进行了全面测试:简单地说,它们很强大,我的意思是非常强大。

结论

是的!根据某些规定,可以恢复密码。

在玩TABSDBHack时,成功的关键是找到一种减少搜索空间的方法(密码是字符串类型):这很容易,特别是对于密码。我强调,它有效。

Component Ace 的人很聪明,他们的工作做得很好(设计密码系统等):你可以依赖 Absolute Database,我强烈推荐它。

关于database - ComponentACE 绝对数据库的密码恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9968727/

相关文章:

algorithm - 安全地用于 "resetting password"的强算法

mysql - 数据库摆脱重复属性

sql - 数据库记录 - 有效开始日期和结束日期以及外键

Delphi - System.Copy 良好实践

django - 在 Django 中正确使用 PasswordResetForm

asp.net - 如何将图像插入电子邮件模板

java - 未找到 WFMLRSVCApp.ear 文件

Java DB (Derby) 数据库更改列大小

multithreading - 在线程中使用这段代码有什么问题吗? (德尔福)

windows - 检索 Win64 异常表中的所有条目