Восстановление пароля Абсолютной Базы данных 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, я настоятельно рекомендую это сделать.