use RFID::Libnfc::Constants;
use File::Slurp;
use Digest::MD5 qw(md5_hex);
+use Getopt::Long::Descriptive;
use Data::Dump qw(dump);
+my ($opt,$usage) = describe_options(
+ '%c %c [dump_with_keys]',
+ [ 'write=s', 'write dump to card' ],
+ [ 'debug|d', 'show debug dumps' ],
+ [ 'help|h', 'usage' ],
+);
+print $usage->text, exit if $opt->help;
+
my $debug = $ENV{DEBUG} || 0;
my $keyfile = shift @ARGV;
my $card;
- print STDERR "$uid reading blocks ";
+ print STDERR "reading $uid blocks ";
for (my $i = 0; $i < $tag->blocks; $i++) {
if (my $data = $tag->read_block($i)) {
# if we are dumping an ultralight token,
# disconnect from reader so we can run mfoc
RFID::Libnfc::nfc_disconnect($r->{_pdi});
+ print "Dump this card with mfoc? [y] ";
+ my $yes = <STDIN>; chomp $yes;
+ exit unless $yes =~ m/y/i || $yes eq '';
+
my $file = "cards/$uid.keys";
unlink $file;
warn "# finding keys for card $uid with: mfoc -O $file\n";
}
my $md5 = md5_hex($card);
- my $out_file = "cards/$uid.$md5";
+ my $out_file = "cards/$uid.$md5.mfd";
if ( -e $out_file ) {
warn "$out_file allready exists, not overwriting\n";
} else {
}
}
+ if ( $opt->write ) {
+ my $card = read_file $opt->write;
+ print STDERR "writing $uid block ";
+ foreach my $block ( 0 .. $tag->blocks ) {
+ my $offset = 0x10 * $block;
+ $tag->write_block( $block, substr($card,$offset,0x10) );
+ print STDERR "$block ";
+ }
+ print STDERR "done\n";
+ }
+
# view dump
system "./mifare-mad.pl $out_file > $out_file.txt";
$ENV{MAD} && system "vi $out_file.txt";