use File::Copy qw(copy); use DBI; use Win32::API; use strict; use warnings; print ("Decrypting cookies...\n") && &fix_cookies && print ("Cookies decrypted!\n"); Win32::API::Struct->typedef( DATA_BLOB => qw{ DWORD cbData; BYTE *pbData; }) or die; Win32::API->Import('user32', <connect("dbi:SQLite:dbname=Cookies", '', '', { RaiseError => 1, AutoCommit => 0}); my @rows = @{$dbc->selectall_arrayref("SELECT host_key, name, value, encrypted_value FROM cookies")}; foreach my $row (@rows){ my ($host_key, $name, $value, $encrypted_value) = @{$row}; my $new_value = decryptData($encrypted_value) || $value || '0'; print "$new_value\n"; #This is optional, but it allows us to use any session cookies that may exist at the time of running this. #This is assuming that you will be generating a new decrypted session file whenever you run your script. my $sth = $dbc->prepare(qq{ UPDATE cookies SET value = ?, has_expires = 1, expires_utc = 99999999999999999, is_persistent = 1 WHERE host_key = ? AND name = ? }); $sth->execute($new_value, $host_key, $name); } $dbc->commit(); #SQLite is slow at excuting one row at a time. SEE: http://stackoverflow.com/a/8882184 $dbc->disconnect(); } sub decryptData { #Cleaned up version of http://www.perlmonks.org/?node_id=776481 my $encryptedData = shift; if($encryptedData eq ''){ return undef; } #avoid errors... my $datain = Win32::API::Struct->new('DATA_BLOB'); $datain->{'cbData'} = pack('LL', length($encryptedData)+1); $datain->{'pbData'} = unpack('L!', pack('P', $encryptedData)); my $dataout = Win32::API::Struct->new('DATA_BLOB'); # call the imported func my $result = CryptUnprotectData($datain, pack('L', 0), 0, pack('L', 0), pack('L4', 16, 0, 0, unpack('L!', pack('P', 0))), 0, $dataout); my $len = $dataout->{'cbData'}; my $dat = unpack('P'.$len, pack('L!', $dataout->{'pbData'})); print "result ($len bytes) : '$dat'\n"; } #### Decrypting cookies... Unknown Win32::API::Struct 'DATA_BLOB' at chrome-cookies-gist.pl line 65. Unknown Win32::API::Struct 'DATA_BLOB' at chrome-cookies-gist.pl line 68. Undefined subroutine &main::CryptUnprotectData called at chrome-cookies-gist.pl line 70.