X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=mifare-mad.pl;h=b786248e5cae41395f7a806d868281a5e9f24596;hb=59ab9f21afdf5f7e1a8b25ea4eb5da3d33af51c3;hp=7201bec756b0498b82da4dd472739577c1d06e36;hpb=dfd15a611cd59cc2191f60abc7aa4ed4d15eb4f2;p=perl-Mifare-MAD.git diff --git a/mifare-mad.pl b/mifare-mad.pl index 7201bec..b786248 100755 --- a/mifare-mad.pl +++ b/mifare-mad.pl @@ -69,8 +69,8 @@ if ( $debug ) { local $/ = undef; my $card = <>; -die "expected 4096 bytes, got ",length($card), " bytes\n" - unless length $card == 4096; +die "expected 4096 or 1024 bytes, got ",length($card), " bytes\n" + unless length $card == 4096 || length $card == 1024; my ( $ADV, $MA, $DA ); @@ -80,6 +80,7 @@ foreach my $sector ( 0 .. 39 ) { my $blocks = $sector < 32 ? 4 : 16; + last if $pos >= length($card); next if substr($card,$pos,$blocks * 0x10) eq "\x00" x ($blocks * 0x10); # General purpose byte (GPB) @@ -107,7 +108,7 @@ foreach my $sector ( 0 .. 39 ) { my $v = unpack('v',(substr($card, $mad_offset, 2))); my $cluster_id = unpack('HH', (( $v & 0xff00 ) >> 8) ); my $full_id = sprintf "%04x",$v; - printf "MAD sector %-2d@%x %04x [%s]\n%s\n", $sector, $mad_offset, $v + printf "# sector %-2d MAD@%x %04x [%s]\n%s\n", $sector, $mad_offset, $v , $function_clusters->{ $cluster_id } , $mad_id->{$full_id} || "FIXME: add $full_id from MAD_overview.pdf to __DATA__ at end of $0" ; @@ -149,7 +150,7 @@ foreach my $sector ( 0 .. 39 ) { , $trailer_pos, $c1, $c2, $c3 ; - my $cond = ''; + my $condition = ''; foreach my $j ( 0 .. $blocks - 1 ) { my $offset = $pos + $j * 0x10; my $block = substr($card, $offset, 0x10); @@ -160,21 +161,30 @@ foreach my $sector ( 0 .. 39 ) { undef; # display condition only once for block group if ( defined $acl_block ) { + my $trailer = $j == ( $blocks - 1 ); my $mask = 1 << $acl_block; - $cond + my $cond = ( ( $c1 & $mask ) * 4 ) + ( ( $c2 & $mask ) * 2 ) + ( ( $c3 & $mask ) * 1 ) ; $cond >>= $acl_block; - $cond = sprintf ' %03b %s' + $condition = sprintf ' %03b %s' , $cond - , $j == ( $blocks - 1 ) - ? $access_condition_trailer->{$cond} - : $access_condition_data->{$cond} + , $trailer ? $access_condition_trailer->{$cond} + : $access_condition_data->{$cond} ; + if ( ! $trailer && ( $cond == 0b001 || $cond == 0b011 ) ) { + my ( $value_block, $not ) = unpack 'llx8', $block; + my $value = $value_block; +# my $positive = $value_block & 0x8000_0000; +# my $value = $value_block & 0x7fff_ffff; +# $value = -$value if ! $positive; + #$condition .= sprintf " = %d 0x%x", $value, $value_block; + $condition .= sprintf " = %d 0x%x", $value_block, $not; + } } else { - $cond = ''; + $condition = ''; } my $hex = unpack('H*',$block); @@ -186,7 +196,7 @@ foreach my $sector ( 0 .. 39 ) { $hex .= " | $hex_sw"; } - printf "%x %03x %s%s\n", $j, $offset, $hex, $cond; + printf "%x %03x %s%s\n", $j, $offset, $hex, $condition; } printf "KEY A:%s | %s GDP: %s | B:%s %s\n"