1

おそらく Delphi C++ Builder で記述され、AbsoluteDB が組み込まれた、かなり古いデスクトップ アプリケーションが提供されました。

Swing または Flex/Air を使用して新しいバージョンを作成する必要がありますが、その前に DB の正確なスキーマを確認する必要があります。

残念ながら、DB はパスワードで保護されていました。このアプリを書いたプログラマーはずっと前に会社を辞めました。

とにかくこのパスワードを回復する方法はありますか?

4

1 に答える 1

4

ナイーブ ブルート フォース攻撃

以下の理由から、ストックを使って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 の Personal Edition を使用して開発しました。

クラス定義は、配布された DCU からの型定義への参照が削除されたため、それに基づくバイナリを配布する資格がありません。

ご存知のように、主にハッシュと復号化の方法について、DCU のディストリビューションに強く依存しています。Absolute Database の内部構造に関する時間と知識があれば、その暗号化エンジンのクリーン ルームでの実装を作成することが可能になるはずです。これは、Hagen Reddmann によるフリーウェアであるDelphi Encryption Compendiumに基づいているようです。


その他の探索方向

  • SIZEOFCONTROLBLOCK は 256 しかないため、単純な制御ブロックを復元するためのブルート フォースと見なすことができます。
  • プレーン/暗号化された制御ブロックのペアが与えられた場合、キーの内部表現を回復することは、あまりにもブルート フォースを使用して可能ですが、気をつけてください: たとえば、AES/Rijndael の場合は 128/192/256!.
  • よく知られている一方向関数である RipeMD (128 と 256) は、Key を初期化するために内部的に使用されます。
  • 暗号化アルゴリズムのほとんど (少なくとも最近のもの) は、標準として採用される前に、公の精査の下で徹底的なテストを受けました。簡単に言えば、それらは強力です。非常に強力です。

結論

はい!規定によっては、パスワードを回復することができます。

TABSDBHack をいじる場合、成功の鍵は検索スペースを減らす方法を見つけることです (パスワードは文字列型です)。特に脆弱なパスワードの場合は、パイのように簡単です。私は強調します、それは機能します。

Component Ace の連中は頭が良く、仕事をうまくやり遂げました (特に暗号システムの考案): Absolute Database は信頼できます。私はそれを強く推奨します。

于 2012-04-05T14:17:23.473 に答える