Nøkkelen er å få et megaton med prøver, slik at analysen har noe å mate på. Det hjelper virkelig hvis du kan feste prøvene i en databasetabell eller ordbok som kan spørres interaktivt , f.eks. fra en slags manuskall. Python burde fungere beundringsverdig, men jeg har ikke mye erfaring med det, siden jeg har brukt Visual FoxPro for interaktiv spillunking de siste to tiårene.
Når du har prøvene dine klare til å bli spurt, kan du teste forskjellige enkle hypoteser og motbevise dem ved å finne moteksempler. Følgende eksempler ser for eksempel ut til å antyde at en forskjell i fjerde byte forårsaker en firdobbel forskjell i sjekksummen:
00h 5Ch A2h 00h 00h 01h 7Fh00h 5Ch A2h 01h 00h 01h 63h00h 5Ch A2h 02h 00h 01h 67h00h 5Ch A2h 03h 00h 01h 6Bh 00h 5Ch A2h 04h 00h 01h 6Fh
Nøkkelen er å finne prøver som bare skiller seg ut i den nåværende 'arbeidskolonnen' og kontrollsummen for å studere effekten som en endring i arbeidskolonnen har på sjekksummen. For eksempel, gitt inndataene ovenfor, kunne vi notere 4 * b [3]
som foreløpig term for den fjerde byten, og deretter spørre eksempeldatabasen for moteksempler hvis dette ikke fungerer. Det vil si at du velger par med prøver som bare skiller seg ut i fjerde byte og kontrollsum og teller antall suksesser og feil for
delta (checksum) mod 256 == 4 * delta (byte [3]) mod 256.
Det er uansett ideen. Hva en ting som delta (checksum) mod 256
faktisk ser ut, avhenger tydeligvis av manuskriptet. Med VFP ville det være
mod (256 + asc (substr (høyre, 7, 1)) - asc (substr (venstre, 7, 1)), 256)
Det komplette uttrykket for testen ovenfor vil være ganske langt, så du vil normalt skrive små hjelperfunksjoner. Med en hjelper kalt byte_delta ()
som normaliserer resultatet til området [0, 255] du kanskje har
velg le.prøve som venstre, ri.prøve som høyre; fra all_samples le, all_samples ri; hvor ting (venstre (ri.eksempel, 6), 4, 1, "") == ting (venstre (le.eksempel, 6), 4, 1, ""); og le.sample <> ri.sample; inn i markøren byte_3_pairssel byte_delta (høyre, venstre, 7) == mod (4 * byte_delta (høyre, venstre, 4), 256) som ok, tell (*); fra byte_3_pairs; gruppere etter 1
I det aktuelle tilfellet vil du få et blandet bilde for dette spørsmålet (se forskjellen mellom første og andre eksempel ovenfor, som er E4 i stedet for 4). Normalt vil du gjøre en del med å velge forskjeller først, bare for å få en følelse av ting. "Forskjell" kan være aritmetisk forskjell, bitvis xor, uansett.
Derfor trenger du et interaktivt skall som Python eller VFP; med rediger-kompiler-kjøresyklusene til et kompilert språk vil dette være ganske tungvint. Jeg har gitt VFP-eksemplene fordi skriptspråk med databasestøtte kan gjøre ting mye enklere her.
For enkle vektede summer som de vanlige "menneskelige beregningsbare" kontrollsummene i ting som ISBN-er, gir dette ganske raske resultater . Jeg har brukt denne tilnærmingen for å bestemme alle sjekksifersystemene som brukes i tyske helseforsikringsnumre - som for det meste er papirløse (eller i det minste var på den tiden) - fra forskjellige mengder prøver. Selvfølgelig hadde jeg i så fall fordelen at den grunnleggende typen ordning - en vektet sum av sifre - var kjent, og prøvene allerede var bosatt i databasetabeller ...
Saken under diskusjon er vanskeligere fordi grunnordningen ikke er kjent ennå. Derfor er det viktig å se på bitmønstrene for å få en følelse av ting. For eksempel indikerer boblende bærer en additivfunksjon. Dette forklares mer detaljert i emnet Omvendt enkel melding + kontrollsumpar (32 byte), som også viser noen eksempler på endringsmønster.
PS: i tillegg til å prøve å plage ut forskjeller i sjekksummen for endringer i bestemte biter eller byte, er det mange andre ting som kan gjøres når prøvene er fylt i en slags spørbar tabell / ordbok / kart. Det første er vanligvis å kjøre et batteri med tester med eksisterende standardfunksjoner, som rett bytesum, rett byte xor, forskjellige CRC og så videre, for å observere forskjellen (aritmetikk og xor) til sjekksummen. Å vise resultater som bitmønstre - som vist i den koblede artikkelen - kan ofte være nyttig for kresne regelmessigheter som ikke er så tydelige i heksadesimalt eller desimalformat.
OPPDATERING For øyeblikket prøvene er for like (ingen forskjeller i de tre første byte), og det er for få av dem til å kaste hypoteser raskt. Det er med andre ord bare for mange potensielle funksjoner som passer til eksisterende data ...
For eksempel forutsier følgende enkle Fox-funksjon korrekt sjekksummen for den opprinnelige håndfull prøver, bortsett fra noen få tilfeller der den er slått av med 0x20:
-funksjon f (s) lokal x, ix = 0 for i = 1 til len (ms) - 1 x = bitand (bitlshift (mx, 1) + asc (substr (ms, mi, 1)), 0xFF) neste gang jeg returnerer bitand (mx + 0x8E, 0xFF)
Det kan være fordi det er en rotasjon i stedet for et skifte, eller noe xor er involvert, eller et annet skift (relativt primært til 8) som overlapper med bitantallet per byte for å skape en avstand på to bits mellom den fjerde byten og kontrollsummen. En rotasjon med 5 ville gjort det. Imidlertid er det mange andre muligheter ... Derfor trenger vi mange flere prøver. ;-)
Analyse av prøvene på PasteBin viser at en forskjell i den siste byteposisjonen før sjekksummen alltid er lik forskjellen i sjekksummen. Dette betyr at den siste byten og dens effekt på kontrollsummen kan fjernes fra prøvebasen. Dette øker antall prøver som er forskjellige i bare en byteposisjon, noe som betyr at det er mer lavthengende frukt for analyse ...
F.eks. prøvene
00 5C A0 00 00 00 00 00 06 00: 6900 5C A0 00 00 00 00 00 06 01: 6A ... 00 5C A0 00 00 00 00 00 06 FF: 68
alt tilordnes til den nye prøven (prikken indikerer en fjernet byte, bare for å forklare her):
00 5C A0 00 00 00 00 00 06. 69
Den forkortede prøvebasen viser umiddelbart tilfeller der 'power of two' -regelen ikke fungerer (den siste byten her er opprinnelig den nest siste):
00 5C A0 00 00 00 00 00 00. 7D00 5C A0 00 00 00 00 00 01. 7F00 5C A0 00 00 00 00 00 02. 61 <- forskjell -0x20 til forutsagt delta 200 5C A0 00 00 00 00 00 03. 6300 5C A0 00 00 00 00 00 04. 65 ... 00 5C A0 00 00 00 07 00 00. B5 00 5C A0 00 00 00 08 00 00. BD00 5C A0 00 00 00 09 00 00. A5 <- forskjell -0x20 til forutsagt delta 800 5C A0 00 00 00 0A 00 00. AD00 5C A0 00 00 00 0B 00 00. D5 <- tilbake på sporet med den tidligere sekvensen