From e363bf787ef515a7653c3446090da1a78e352b05 Mon Sep 17 00:00:00 2001 From: Jens Steube Date: Thu, 25 Aug 2022 20:33:10 +0200 Subject: [PATCH] Add XML support for keepass keyfile and improve performance by not using chdir() --- tools/recursivefiles2sha256sum.pl | 65 ++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 9 deletions(-) mode change 100644 => 100755 tools/recursivefiles2sha256sum.pl diff --git a/tools/recursivefiles2sha256sum.pl b/tools/recursivefiles2sha256sum.pl old mode 100644 new mode 100755 index a0fa2ec99..4166c2729 --- a/tools/recursivefiles2sha256sum.pl +++ b/tools/recursivefiles2sha256sum.pl @@ -3,7 +3,7 @@ ## ## This script was created to be used in conjunction with Hashcat mode 29700 (Keepass in keyfile only mode). ## This can be useful if you have a partition and forgot which of the files was used as the keyfile. -## +## ## Example use (if your target drive is mounted to /mnt/sda1 and (optionally) another one to /mnt/sda2): ## ## $ perl recursivefiles2sha256sum /mnt/sda1 /mnt/sda2 > wordlist.dict @@ -16,30 +16,77 @@ use strict; use warnings; use File::Find; use Digest::SHA; +use XML::Simple; my $sha = Digest::SHA->new ("sha256"); my @folders = @ARGV; -if (scalar @folders == 0) +if (scalar @folders == 0) { die ("use: $0 folder1 folder2...\n"); } -find (\&handlefile, @folders); +my $conf = +{ + wanted => \&handlefile, + no_chdir => 1, +}; -sub handlefile +find ($conf, @folders); + +sub handlefile { my $file = $_; return unless -f $file; return unless -r $file; - - my $sha_copy = $sha->clone; - $sha_copy->addfile ($file); + open (my $fh, $file) or return; - my $digest = $sha_copy->hexdigest; + binmode $fh; - print "$digest\n"; + my $nread = read ($fh, my $data, 5); + + close ($fh); + + my $xmlhash; + + if (($nread == 5) && ($data eq "{"Key"} && exists $xml->{"Key"}->{"Data"}) + { + chomp $xml->{"Key"}->{"Data"}; + + $xmlhash = $xml->{"Key"}->{"Data"}; + } + else + { + # not interesting + } + } + } + + if (defined $xmlhash) + { + print "$xmlhash\n"; + } + else + { + my $sha_copy = $sha->clone; + + $sha_copy->addfile ($file); + + my $digest = $sha_copy->hexdigest; + + print "$digest\n"; + } }