Smartcard-Kommunikation mitschneiden

CSV-Export des Saleae Logic einer mitgeschnittenen Smartcard-Kommunikation rudimentär aufbereiten.

#!/usr/bin/awk -f
# Andreas Schiermeier <andreas@schiermeier.name> - http://ccc-ffm.de/

function init() {

  waitRSThi=1;   # erwarte HI auf RST
  waitIOlo=1;

  etu=0;         # Anzahl Zeile pro Byte

  lastIO=0;      # Zustand von IO in der vorausgehenden Zeile
  lastIOch=0;    # Zeilennummer zum letzten Zustandswechsel von IO

  byte=0;
  bitPos=-1;

}

BEGIN {
  FS=", ";

  # Spaltendefinition der CSV-Datei
  TIME=1;
  RST=2;
  CLK=3;
  IO=4;
  init();
}

# Warten auf RST Signal
( waitRSThi == 1 && $RST == 1 ) {
  waitRSThi=0;
  next;
}

# Verlust des RST Signals => neu initialisieren
( waitRSThi == 0 && $RST == 0 ) {
  print "\n--------------------------"
  init();
  next;
}

( $IO != lastIO ) {

  if ( waitIOlo == 1 && $IO == 0) {
    waitIOlo=0;
  }

  if ( etu == 0 && $IO == 1 && waitIOlo == 0 ) {
    etu=NR-lastIOch;
  }

  if ( etu != 0 ) {
    bitCount=int(sprintf("%d", (NR-lastIOch)/etu+0.49))
    for (i=0; i<bitCount; i++) {
      bitPos++;
      if ( bitPos > 0 && bitPos < 9 ) {
        byte=byte+(2^(bitPos-1))*lastIO; # Annahme: lsb
      }
      if ( bitPos == 9 ) {
        # TODO gerade Parität anhand lastIO prüfen
        printf "0x%02X, ", byte;
      }
      if ( bitPos > 9 ) {
        bitPos=-1;
        byte=0;
        break;
      }
    }
  }
  lastIOch=NR
  lastIO=$IO
}

Beispiel:

> du -h tan_sync.csv 
132M    tan_sync.csv
> time ./analyze.awk < tan_sync.csv 
0x3B, 0xFF, 0x18, 0x00, 0xFF, 0x81, 0x31, ...., 0xD4, 
--------------------------

--------------------------
...
--------------------------

real    0m11.567s
user    0m11.489s
sys     0m0.064s
>
 
 
projekte/diverses/smartcard_sniff.txt · Zuletzt geändert: 2012-06-04 23:08 von Andreas Schiermeier
Recent changes RSS feed Valid XHTML 1.0 Valid CSS Driven by DokuWiki