Восстановление пароля Абсолютной Базы данных ComponentACE

Мне дали довольно старое настольное приложение, написанное, вероятно, на Delphi C++ Builder со встроенным AbsoluteDB.

Мне нужно создать новую версию, используя либо Swing, либо Flex/Air, но прежде чем сделать это, мне нужно проверить точную схему БД.

К сожалению, БД была защищена паролем. Программист, который написал это приложение, давно покинул компанию.

Есть ли способ восстановить этот пароль?

1 ответ

Решение

Наивная атака грубой силы

Нет смысла использовать акции TABSDatabase попытаться атаковать грубой силой, так как:

  • Методы внутреннего хеширования и методы шифрования используют уникальный буфер в качестве входных и выходных данных (передаются как ссылки). Каждая итерация требовала обработки одного и того же входного содержимого (без кеширования для повторного использования ради экономии времени процессора).
  • Каждый ложный пароль вызывает исключение, а 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, в основном для метода хеширования и дешифрования. Со временем и большим количеством знаний о внутренностях Абсолютной базы данных, станет возможным реализовать реализацию ее механизма шифрования в чистом помещении: кажется, что она основана на Delphi Encryption Compendium, бесплатной программе от Hagen Reddmann.


Другое направление для исследования

  • Грубое принуждение для восстановления простого управляющего блока может рассматриваться как SIZEOFCONTROLBLOCK, равный только 256.
  • Учитывая пару простых / зашифрованных контрольных блоков, восстановление внутреннего представления ключа возможно с использованием слишком грубой силы, но будьте осторожны: 128/192/256 для AES/Rijndael, например!
  • Хорошо известная односторонняя функция RipeMD (128, а также 256) используется для внутренней инициализации ключа: я боюсь, что восстановить строку, учитывая ее хэш, не представляется разумным!
  • Большинство криптоалгоритмов (по крайней мере, последних) прошли тестирование под пристальным вниманием общественности до их принятия в качестве стандарта: проще говоря, они сильные, я имею в виду очень сильные.

Заключение

Да! Восстановить пароль можно по некоторым положениям.

При игре с TABSDBHack ключом к успеху является поиск способа уменьшить пространство поиска (пароль имеет строковый тип): это просто, как пирог, особенно для слабого пароля. Я подчеркиваю, это работает.

Ребята из Компонентного Ace умны и хорошо справились со своей задачей (в частности, разработали криптосистему): вы можете положиться на Absolute Database, я настоятельно рекомендую это сделать.

Другие вопросы по тегам