Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Google Chrome Passwörter mit SQLite ausgeben - Problem (https://www.delphipraxis.net/124540-google-chrome-passwoerter-mit-sqlite-ausgeben-problem.html)

CorVu5 20. Nov 2008 20:16

Datenbank: SQLite • Version: 3 • Zugriff über: SQLlite DLL..sorry, keine Ahnung von GBs ;)

Google Chrome Passwörter mit SQLite ausgeben - Problem
 
Hallo Leute, ich habe ein (für mich) sehr seltsames Problem, und ich bin mir uach nicht sicher ob dies die richtige Section ist, da ich mein Problem noch nicht geau eingrenzen konnte.
Folgendes: Ich hatte ein wenig im Google Chrome Quelltext gestöbert und kam schließlich zu dem Punkt, an dem die Auto-Complete Passwörter gespeichert werden. Dies geschieht in einer SQLite Datenbank, die in den Anwendungsdaten gespeichert wird.
Jetzt wollte ich die Passwörter mal auslesen und entschlüsseln, prinzipiell nicht schwer wenn man den Quellcode hat:
http://src.chromium.org/viewvc/chrom...cc?view=markup

So sieht mein Ansatz aus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
DB : TSQLiteDatabase;
table : TSQLiteTable;
i : Integer;
DataIn : DATA_BLOB;
DataOut: DATA_BLOB;
DataStream : TMemorystream;
pw : string;
begin
db := TSQLiteDatabase.Create(GetEnvironmentVariable('LOCALAPPDATA') + '\Google\Chrome\User Data\Default\Web Data');
table := DB.GetTable('SELECT * FROM logins');
While not Table.EOF do begin
  DataStream := TMemoryStream.Create;
  dataStream := table.FieldAsBlob(table.FieldIndex['password_value']);
  DataIn.pbData := DataStream.Memory;
  DataIn.cbData := DataStream.Size;
  CryptUnProtectData(@DataIn, nil,nil,nil,nil,0,@DataOut);
  pw := pchar(DataOut.pbData);
  Memo1.Lines.Add(table.FieldAsString(table.FieldIndex['origin_url']) + #13#10 + table.FieldAsString(table.FieldIndex['username_value']) + ' - ' + pw);
  DataStream.Free;
  Table.Next;
end;
end;
Ja, der dürfte noch ziemlich unsauber sein :P

Nun klappt das IM GRUNDE schon, bei den Passwörtern gibt es allerdings folgendes Problem:
Lautet mein Passwort zum Beispiel "hallo", bekomme ich als beispielsweise heraus:

"halloLMEM"

Wobei die "Sonderzeichen" von PW zu PW unterschiedlich sind, das LMEM steht aber immer drin.
Auch die Anzahl der Sonderzeichen ist immer unterschiedlich, was ein Filtern natürlich extrem erschwert.

Ich kann mir drei Problemursachen vorstellen:
1. Ich benutze FieldAsBlob irgendwie falsch, sodass ich dadurch die überzählogen Werte bekomme.
2. Ich mache einen Fehler bei CryptUnprotectData
3. Ich behandle iwie den zurückgegebenen String falsch, da ich nicht genau weiß wie das in C ist mit Stringtypen und so und aus dem Chrome-code in dieser Hinsicht nix sinnvolles ziehen kann.
Also: Ich habe mich shcon den ganzen Tag damit rumgeärgert und es wäre extrem nett, wenn mir da mal wer nen kleinen Tipp geben könnte
Danke im Voraus

nicodex 20. Nov 2008 21:31

Re: Google Chrome Passwörter mit SQLite ausgeben - Problem
 
Zitat:

Zitat von CorVu5
pw := pchar(DataOut.pbData);

Ich nehme an, dass pbData nicht #0-terminiert ist. Ich würde das so lösen: SetString(pw, PAnsiChar(DataOut.pbData), DataOut.cbData);

CorVu5 20. Nov 2008 21:49

Re: Google Chrome Passwörter mit SQLite ausgeben - Problem
 
In der Tat, genauso war es... :wall: hätte ich auch selber drauf kommen können
Danke, Danke, Danke, jetzt kann ich beruhigt schlafen gehen :)

Phoenix 21. Nov 2008 06:55

Re: Google Chrome Passwörter mit SQLite ausgeben - Problem
 
Nur aus reinem Interesse: Wie komplex ist die Verschlüsselung?
Und woraus ermittelt sich der Key?

CorVu5 21. Nov 2008 13:02

Re: Google Chrome Passwörter mit SQLite ausgeben - Problem
 
Zur Ver-/Entschlüsselung wird die Windows-API CryptProtectData verwendet. Wie diese API genau funktioniert, ist mir leider nicht bekannt. Sie verschlüsselt aber im Grunde sehr sicher (in Bezug auf Bruteforce/Kryptographische Verfahren).
Mehr zu der Funktion gibts in der MSDN: MSDN-Library durchsuchenCryptProtectData
Man kann CryptProtectData noch mit einer zusätzlichen "Entropy" verschlüsseln, der wohl ungefähr einem Passwort gleichzusetzen ist, das wird hier aber nicht getan.
Man kann den Kram also ganz einfach entschlüsseln, indem man einfach die Funktion genauso aufruft wie im Chrome-Quelltext zu finden.
Eine Sache die vllt noch wichtig ist in Bezug auf Cryptprotectdata: Man kann normalerweise nur Sachen entschlüsseln, die auch auf dem selben PC verschlüsselt wurden.

Phoenix 21. Nov 2008 13:09

Re: Google Chrome Passwörter mit SQLite ausgeben - Problem
 
Zusammen mit der Tatsache, dass Chrome die Daten im Userverzeichnis ablegt ist man also relativ sicher - bis auf Programme, die im eigenen Benutzercontext arbeiten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz