2012-04-01 3 views
1

Ich erhielt eine ziemlich alte Desktop-Anwendung, die wahrscheinlich in Delphi C++ Builder mit einer eingebetteten AbsoluteDB geschrieben wurde.Passwortwiederherstellung einer ComponentACE Absolute Datenbank

Ich muss eine neue Version mit Swing oder Flex/Air erstellen, aber bevor ich das tue, muss ich das genaue Schema der DB überprüfen.

Leider war die DB passwortgeschützt. Der Programmierer, der diese App geschrieben hat, hat das Unternehmen vor langer Zeit verlassen.

Gibt es trotzdem eine Wiederherstellung dieses Passworts?

+5

Haben Sie versucht "1234": -? Nein, im Ernst, ich schlage vor, [Kreditor] (http://www.componentace.com/company/contact_us.php) zu kontaktieren. – TLama

+2

Brute Force-Angriff kann lange dauern. Sie könnten versuchen, die DLL und ihre Funktionen zu verknüpfen, und sehen, wenn Sie sehen können, dass die Daten an die DLL übergeben werden, wo sie die Datenbank öffnet oder das Passwort eingibt, das möglicherweise kein ASCII-Text ist, könnte es ein binärer privater Schlüssel sein. Angenommen, Sie haben den Quellcode für die Delphi-App? Das Passwort könnte innerhalb des Quellcodes sein, richtig? –

+0

Wenn ich zwischen den Zeilen lese, nehme ich an, dass Sie auch den Quellcode der App verloren haben, nicht wahr? – menjaraz

Antwort

4

Naive Brute-Force-Angriff

Es ist ein nicht sinnvoll, die Lager TABSDatabase zu verwenden, um einen Brute-Force-Angriff versuchen seit:

  • interne Hash-Verfahren und Verschlüsselungsverfahren einen eindeutigen Puffer als Eingabe verwenden und Ausgabe (als Referenz übergeben). Jede Iteration erforderte die Verarbeitung des gleichen Eingangsinhalts (kein Caching zur Wiederverwendung wegen CPU-Zeiteinsparung).
  • Jedes falsche Passwort löst eine Ausnahme aus, und SEH fügt eine weitere Strafschicht hinzu (zeitliche Komplexität).
  • Ich vermute andere Neben-Design-Funktionen (Gegenmaßnahmen gegen Brute-Force-Angriff).

Erste jede superflous Last befreien

ich mit dieser arbeiten nackten Delphi-Klasse in meinem Versuch kam:

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; 

I relevante Daten direkt aus der Datei abgerufen und ein bestimmtes Passwort prüfen.

Haftungsausschluss:

benutzte ich eine Personnal Ausgabe von Absolute Database Version 6.0.7 zu entwickeln.

Die Klassendefinition wurde von jeglicher Bezugnahme auf Typdefinitionen aus den verteilten DCUs bereinigt und ich bin nicht berechtigt, eine darauf basierende Binärdatei zu verteilen.

Bekanntlich hängt es stark von der DCU-Verteilung ab, hauptsächlich für die Hash- und Entschlüsselungsmethode. Mit der Zeit und mehr Wissen über die Interna der Absolute Database sollte eine Implementierung ihrer Verschlüsselungs-Engine in einem Reinraum möglich sein: Es scheint, dass es auf dem Delphi Encryption Compendium einer Freeware von Hagen Reddmann basiert.


andere Richtung

  • Brute zu erkunden zwingt die Ebene Control Block erholen kann in Betracht gezogen werden, wie SIZEOFCONTROLBLOCK nur gleich 256 ist.
  • Bei einem Paar einfacher/verschlüsselter Steuerblöcke ist die Wiederherstellung der internen Darstellung des Schlüssels mit zu brutaler Gewalt möglich, aber passen Sie auf: 128/192/256 für AES/Rijndael zum Beispiel !.
  • RipeMD (128 sowie 256), eine bekannte One-Way-Funktion, wird intern verwendet, um den Schlüssel zu initialisieren: Ich fürchte, es ist nicht vernünftig, einen String mit seinem Hash wiederherzustellen!
  • Die meisten der Crypto-Algorithmus (die jüngsten mindestens) unterzog sich einer gründlichen Prüfung unter öffentlicher Kontrolle vor ihrer Annahme als Standard: Einfach gesagt sind sie stark, sehr stark meine ich.

Fazit

Ja! Es ist möglich, das Passwort unter bestimmten Bedingungen wiederherzustellen.

Wenn Sie mit TABSDBHack herumspielen, ist der Schlüssel zum Erfolg, einen Weg zu finden, den Suchraum zu verkleinern (Passwort ist vom Stringtyp): Es ist einfach, vor allem für schwaches Passwort. Ich betone, es funktioniert.

Die Jungs von Component Ace sind schlau und haben ihren Job gut gemacht (unter anderem das Kryptosystem entworfen): Sie können sich auf die Absolute Database verlassen, ich befürworte das stark.

+0

+1 zum Beispiel Code auf einem Bruteforce-Hack. –

+0

@menjaraz Vielen Dank, dass Sie sich die Zeit genommen haben, zu experimentieren und zu antworten. Ich verstehe, dass die Verwendung von TABSDatabase für eine Brute-Force ein Unsinn ist, wenn ich mich nicht irre, ist die Idee, ein (rate) Passwort auf eine einfache DB-Datei anzuwenden und mit der verschlüsselten DB-Datei zu vergleichen, oder? Aber ich denke, ich vermisse immer noch ein paar Stücke aus dem Lesen Ihrer Antwort: 1). Was sind DBHeader, CryptoHeader und ControlBlock? 2). Wie wird der Crypto-Algorithmus verwendet? 3). Wie kann das Passwort "manuell" angewendet werden? –

+0

1) DBHeader, CryptoHeader sind Datensätze, die im Speicher verwendet werden, um die ersten 2 relevanten Header einer Absolute Database-Datei zum Entschlüsseln zu speichern. ControlBlock ist ein Datensatz, der ein Feld in CryptoHeader widerspiegelt, das als Ausgabepuffer für das modifizierte CR32 und InternalDecryptBuffer verwendet wird, um zu verhindern, dass sein Gegenstück (Eingabepuffer) überschrieben wird. – menjaraz