Browse Source

Initial coin detection, inspired by nmap os detection

master
Jonathan "Duke" Leto 5 years ago
parent
commit
392d47a3cd
  1. 50
      wack

50
wack

@ -13,8 +13,36 @@ my $db = tie %wallet, 'BerkeleyDB::Btree',
-Flags => DB_RDONLY,
or die "Cannot open file $filename: $! $BerkeleyDB::Error\n";
my $count = 0;
my $counts = {};
my $count = 0;
my $counts = {};
my $avg_xtn_size = 0;
my $meta = {};
# guess the coin a wallet.dat came from
sub detect_coin {
my ($c,$meta) = @_;
my $coin = "";
print "PREFIX=" . $meta->{prefix} . "\n";
my $p1 = substr($meta->{prefix}, 0, 1);
# only sapling-enabled coins have these keys
if ($c->{sapzkey} or $c->{sapzkeymeta}) {
if ($meta->{prefix} eq 't1') {
$coin = "ZEC Sapling";
} elsif ($p1 eq 'R') {
$coin = "KMD Sapling";
}
# only zcash forks have these
} elsif ($c->{zkey} or $c->{zkeymeta}) {
if ($meta->{prefix} eq 't1') {
$coin = "ZEC/HUSH Sprout";
} elsif ($p1 eq 'R') {
$coin = "KMD Sprout";
}
} else {
$coin = "BTC";
}
}
while (my ($k,$v) = each %wallet) {
my $len = unpack("W", substr($k, 0, 1));
my $type = substr $k, 1, $len;
@ -39,6 +67,7 @@ while (my ($k,$v) = each %wallet) {
my $l = length($tx);
my $lvtx= length($vtx);
print "len=$l tx=$tx ($lvtx bytes)\n";
$avg_xtn_size += $vlen;
} elsif ($type eq 'defaultkey') {
my $dkey = unpack("H*", $v);
print "defaultkey=$dkey\n";
@ -58,18 +87,33 @@ while (my ($k,$v) = each %wallet) {
} elsif ($type eq 'watchs') {
my $key = unpack("H*", $key);
print "$type ($klen,$vlen): ($key => $v)\n";
} elsif ($type eq 'purpose') {
#my $key = unpack("H*", $key);
#TODO: what is this prefix byte?
my $addr = substr $k, $len+2;
my $prefix = substr $addr, 0, 2;
# multiple prefixes should not occur in the same wallet, right?
$meta->{prefix} = $prefix;
print "$type ($klen,$vlen): ($prefix $addr => $v)\n";
}
#printf "$type %s:\n", $key;
}
$counts->{$type}++;
$count++;
}
$avg_xtn_size = $counts->{tx} ? $avg_xtn_size / $counts->{tx} : 0;
printf "\n=====Wallet Key Stats=====\n";
my @keys = sort { $counts->{$b} <=> $counts->{$a} } keys(%$counts);
my $numkeys = scalar @keys;
for my $k (@keys) {
printf "%-25s %s\n", $k, $counts->{$k};
if ($DEBUG && $k eq 'tx') {
printf "%-25s %s (%.2f bytes avg)\n", $k, $counts->{$k}, $avg_xtn_size;
} else {
printf "%-25s %s\n", $k, $counts->{$k};
}
}
printf "Total: $count keys in $numkeys key types\n";
my $coin = detect_coin($counts,$meta);
print "Coin detection: $coin\n";

Loading…
Cancel
Save