From 98b338b14591282944099c990a558a2996575235 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Tue, 4 Sep 2018 06:35:23 -0700 Subject: [PATCH] Basic parsing of wallet.dat files --- wack.pl | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 wack.pl diff --git a/wack.pl b/wack.pl new file mode 100644 index 0000000..a97a2c7 --- /dev/null +++ b/wack.pl @@ -0,0 +1,40 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use BerkeleyDB; + +my %wallet; +my $filename = shift || 'wallet.dat'; +my $db = tie %wallet, 'BerkeleyDB::Btree', + -Filename => $filename, + -Subname => "main", + -Flags => DB_RDONLY, + or die "Cannot open file $filename: $! $BerkeleyDB::Error\n"; + +my $counts = {}; +while (my ($k,$v) = each %wallet) { + my $len = unpack("W", substr($k, 0, 1)); + my $type = substr $k, 1, $len; + my $key = substr $k, $len+1; + + #printf "%s => %x\n", $k, $v; + if ($type eq 'key') { + my $privkey = unpack("H*", $v); + $key = unpack("H*", $key); + #print "key=$key, privkey=$privkey\n"; + } elsif ($type eq 'name') { + print "name: $key, $v\n"; + } elsif ($type eq 'bestblock') { + print "bestblock:\nbestblock: $key, $v\n"; + } elsif ($type eq 'version') { + my $version = unpack("I", $v); + print "version: $version\n"; + } + $counts->{$type}++; + #printf "$len $type %s:\n", $key; +} + +while (my ($k,$v) = each %$counts) { + print "$k => $v\n"; +}