thanks for your effort sailing into perilous seas of Win32. I must admit I understand very little of what you are doing. More or less I suppose you are using Win32::API::Struct->typedef to cerate a new type of win32 struct, then you import the OS call via Win32::API->Import using the brand new struct for incoming data in the funciotn, right?
use File::Copy qw(copy);
use DBI;
use Win32::API;
use strict;
use warnings;
print ("Decrypting cookies...\n") && &fix_cookies && print ("Cookies d
+ecrypted!\n");
Win32::API::Struct->typedef( DATA_BLOB => qw{
DWORD cbData;
BYTE *pbData;
}) or die;
Win32::API->Import('user32', <<EOP) or die;
BOOL CryptUnprotectData(
DATA_BLOB *pDataIn,
LPWSTR *ppszDataDescr,
DATA_BLOB *pOptionalEntropy,
PVOID pvReserved,
CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct,
DWORD dwFlags,
DATA_BLOB *pDataOut
)
EOP
# if all went well you have imported CryptUnprotectData()
sub fix_cookies
{
#Chrome has been encrypting cookie values since Chrome..33?
#We need to decrypt the value before we can use it.
my $chrome_cookie_file = 'C:/Users/'.$ENV{UserName}.'/AppData/Loca
+l/Google/Chrome/User Data/Default/Network/Cookies';
copy($chrome_cookie_file, 'Cookies') || die "Failed to move files:
+ $!";;
my $dbc = DBI->connect("dbi:SQLite:dbname=Cookies", '', '', { Rais
+eError => 1, AutoCommit => 0});
my @rows = @{$dbc->selectall_arrayref("SELECT host_key, name, valu
+e, 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";
}
But.. I get
I've read the documentation, but sincerely it looks like pittograms to me :) Thank you a lot anyway bliako!