2012-04-01 1 views
1

おそらくDelphi C++ BuilderにAbsoluteDBが埋め込まれたかなり古いデスクトップアプリケーションが与えられました。ComponentACE Absolute Databaseのパスワード回復

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

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

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

+5

あなたは '1234'を試しましたか? - ?いいえ、真剣に、私の提案は['vendor'](http://www.componentace.com/company/contact_us.php)に連絡することです。 – TLama

+2

ブルートフォース攻撃には長い時間がかかることがあります。 DLLとその関数をフックして、データベースを開くDLLに渡されるデータやASCII文字ではないパスワードを渡すことができるかどうかを調べることができます。バイナリの秘密鍵である可能性があります。 delphiアプリケーションのソースコードがあるとします。パスワードはソースコード内にある可能性がありますか? –

+0

行間を読んで、私はあなたがまた、アプリケーションのソースコードのトラックを失っていると思いますか? – menjaraz

答えて

4

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

これは、以来、ブルートフォース攻撃を試みるように株式TABSDatabaseを使用する以外の意味です:内部ハッシュ方法と暗号化方法は、入力として独自のバッファを使用し

  • と出力(参照として渡されます)。すべての反復では、同じ入力コンテンツを処理する必要がありました(CPU時間の節約のために再利用のためのキャッシングはありません)。
  • すべての偽のパスワードは例外を発生させ、SEHは別のペナルティ層(時間の複雑さ)を追加します。
  • 私は他の設計上の特徴(ブルートフォース攻撃に対する対策)が疑わしいです。私は、ファイルから直接関連するデータを取得し

    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; 
    


は、私は私の試みで、この作業裸Delphiのクラスを思い付いた

ごとに余分に負荷退治します与えられたパスワードを調べる。

免責事項

私はそれを開発するために絶対的なデータベースのバージョン6.0.7の個人的な版を使用しました。

クラス定義は、配布されたDCUからの任意の型定義への参照から除外されており、それに基づいてバイナリを配布する権利はありません。

知られているように、DCUの配布に大きく依存します。主に、ハッシュおよび復号化方法です。 Absolute Databaseの内部についての知識があれば、暗号化エンジンのクリーンルーム実装を実現することが可能です。Delphi Encryption Compendium Hagen Reddmannのフリーウェアを使用しているようです。


他方の方向はSIZEOFCONTROLBLOCK 256にのみ等しいとみなすことができる普通制御ブロックを回復するために強制的

  • ブルートを探索します。
  • プレーン/暗号化されたコントロールブロックのペアを指定すると、キーの内部表現を復元することが可能ですが、AES/Rijndaelの場合は128/192/256など注意してください。
  • よく知られている一方向関数であるRipeMD(128と同様に256)は、内部的に初期化するために使用されます。Key:ハッシュを与えられた文字列を回復することは合理的に実現できません。
  • ほとんどの暗号アルゴリズム(少なくとも最近のもの)は、標準として採用される前に、公開された精査の下でテストを受けました。

結論

はい!いくつかの規定の下でパスワードを回復することは可能です。

TABSDBHackで遊んでいるときには、検索スペースを減らす方法(パスワードは文字列型です)を見つけることが重要です:特に弱いのパスワードの方が簡単です。私は強調します、それは動作します。

コンポーネントエースのガイは、スマートであり、彼らの仕事(他のものの中で暗号システムを工夫している)がうまくいっています。絶対的なデータベースに頼ることができます。私はそれを強く主張します。

+0

+1例えばブルートフォースハックのコード。 –

+0

@menjaraz実験と返信に時間を割いてくれてありがとう。私は誤っていない場合、仮説であるTABSDatabaseを使うのはナンセンスだと思うのですが、そのアイデアは平易なDBファイルに(推測)パスワードを適用し、それを暗号化されたDBファイルと比較することです。しかし、私はまだあなたの応答を読むことからいくつかの部分が欠けていると思う:1)。 DBHeader、CryptoHeader、ControlBlockは何ですか? 2)。どのように暗号アルゴリズムを使用するのですか? 3)。どのようにパスワードを "手動で"適用するのですか? –

+0

1)DBHeader、CryptoHeaderは、解読のためにAbsolute Databaseファイルの関連する最初の2つのヘッダを保持するためにメモリ内で使用されるレコードです。 ControlBlockは、CryptoHeader内のフィールドをミラーリングするレコードで、修正されたCR32とInternalDecryptBufferの出力バッファとして使用され、対応するバッファ(入力バッファ)が上書きされないようにします。 – menjaraz

関連する問題