Inversione CRC32

Ho trovato un codice per invertire CRC32 ma non so come funzioni, perché non sono così bravo in programmazione, ho appena iniziato. Voglio solo confrontare 2 file, il vecchio e il nuovo, quindi nella nuova correzione il CRC32 aggiungendo 4 byte alla fine del file, quindi i 2 file avranno lo stesso CRC32. Ecco il codice, è in C #:

public class Crc32 { public const uint poly = 0xedb88320; public const uint startxor = 0xffffffff; static uint[] table = null; static uint[] revtable = null; public void FixChecksum(byte[] bytes, int length, int fixpos, uint wantcrc) { if (fixpos + 4 > length) return; uint crc = startxor; for (int i = 0; i > 8) ^ table[(crc ^ bytes[i]) & 0xff]; } Array.Copy(BitConverter.GetBytes(crc), 0, bytes, fixpos, 4); crc = wantcrc ^ startxor; for (int i = length - 1; i >= fixpos; i--) { crc = (crc <> (3 * 8)] ^ bytes[i]; } Array.Copy(BitConverter.GetBytes(crc), 0, bytes, fixpos, 4); } public Crc32() { if (Crc32.table == null) { uint[] table = new uint[256]; uint[] revtable = new uint[256]; uint fwd, rev; for (int i = 0; i < table.Length; i++) { fwd = (uint)i; rev = (uint)(i) < 0; j--) { if ((fwd & 1) == 1) { fwd = (uint)((fwd >> 1) ^ poly); } else { fwd >>= 1; } if ((rev & 0x80000000) != 0) { rev = ((rev ^ poly) << 1) | 1; } else { rev <<= 1; } } table[i] = fwd; revtable[i] = rev; } Crc32.table = table; Crc32.revtable = revtable; } } } 

Ecco un codice PHP che farà anche quello che stai cercando Ho passato molto tempo a cercare di farlo per scopi legittimi quindi spero che aiuti qualcuno

Funzioni come questa potrebbero essere utilizzate per:

  1. ha sempre un singolo hash che verifica i file (ad es. tutti i file di un certo tipo restituiscono un crc comune, il versioning ecc. senza un database)
  2. modificare il modo in cui vengono distribuiti gli hash (ad es. bilanciamento delle chiavi di calcolo distribuito)
  3. invertire i 4 byte originali di un crc32

Per testare le stringhe crc32 online puoi usare: http://www.lammertbies.nl/comm/info/crc-calculation.html

Vedi http://www.reversing.be/article.php?story=20061209172953555 da dove è stato adattato perché non sono l’autore originale, l’originale ha dedicato molto tempo al suo saggio, e ha aiutato in piccola strada

Ecco il codice PHP che può essere utilizzato per modificare un file dato come segue:

  AB CD EF 66 Take for CRC register after, f3 f2 f1 f0 -> 56 33 14 78 (wanted value) Here we go: First byte of entries entry value e3=f3 =56 -> 35h=(4) 56B3C423 for e3 e2 e1 e0 d3=f2+e2 =33+B3 =E6 -> 4Fh=(3) E6635C01 for d3 d2 d1 d0 c3=f1+e1+d2 =14+C4+63 =B3 -> F8h=(2) B3667A2E for c3 c2 c1 c0 b3=f0+e0+d1+c2=78+23+5C+66=61 -> DEh=(1) 616BFFD3 for b3 b2 b1 b0 Now we have all needed values, then X=(1)+ a0= DE+66=B8 Y=(2)+ b0+a1= F8+D3+EF=C4 Z=(3)+ c0+b1+a2= 4F+2E+FF+CD=53 W=(4)+d0+c1+b2+a3=35+01+7A+6B+AB=8E (final computation) */ $ExistingCRC = ~$ExistingCRC; $DesiredCRC = ~$DesiredCRC; //a3a2a1a0 $a3 = (($ExistingCRC & 0xFF000000) >> 24) & 0x000000FF; $a2 = ($ExistingCRC & 0x00FF0000) >> 16; $a1 = ($ExistingCRC & 0x0000FF00) >> 8; $a0 = ($ExistingCRC & 0x000000FF); //f3f2f1f0 $f3 = (($DesiredCRC & 0xFF000000) >> 24) & 0x000000FF; $f2 = ($DesiredCRC & 0x00FF0000) >> 16; $f1 = ($DesiredCRC & 0x0000FF00) >> 8; $f0 = ($DesiredCRC & 0x000000FF); //echo "Existing CRC:" . dechex($ExistingCRC) . " DesiredCRC:" . dechex($DesiredCRC) . "
"; //echo "a3:" . dechex($a3) . " a2:" . dechex($a2) . " a1:" . dechex($a1) . " a0:" . dechex($a0) . "
"; //echo "f3:" . dechex($f3) . " f2:" . dechex($f2) . " f1:" . dechex($f1) . " f0:" . dechex($f0) . "
"; //capture e3/e2/e1/e0/(4) values for ($i = 0; $i < 256; $i++) { if (($crc32lookup[$i] & 0xFF000000 ) == ($DesiredCRC & 0xFF000000)){ $e3 = (($crc32lookup[$i] & 0xFF000000) >> 24) & 0x000000FF; $e2 = ($crc32lookup[$i] & 0x00FF0000) >> 16; $e1 = ($crc32lookup[$i] & 0x0000FF00) >> 8; $e0 = ($crc32lookup[$i] & 0x000000FF); $four = $i; break; } } //echo "e3:" . dechex($e3) . " e2:" . dechex($e2) . " e1:" . dechex($e1) . " e0:" . dechex($e0) . "
"; //$d3=f2+e2 =33+B3 =E6 -> 4Fh=(3) E6635C01 for d3 d2 d1 d0 $d3 = $f2^$e2; //lookup $d3 and assign the values for d2/d1/d0/(3) for ($i = 0; $i < 256; $i++) { if (($crc32lookup[$i] & 0xFF000000 ) == ($d3 << 24)){ $d2 = ($crc32lookup[$i] & 0x00FF0000) >> 16; $d1 = ($crc32lookup[$i] & 0x0000FF00) >> 8; $d0 = ($crc32lookup[$i] & 0x000000FF); $three = $i; break; } } //echo "d3:" . dechex($d3) . " d2:" . dechex($d2) . " d1:" . dechex($d1) . " d0:" . dechex($d0) . "
"; //c3=f1+e1+d2 =14+C4+63 =B3 -> F8h=(2) B3667A2E for c3 c2 c1 c0 $c3 = $f1^$e1^$d2; for ($i = 0; $i < 256; $i++) { if (($crc32lookup[$i] & 0xFF000000 ) == ($c3 << 24)){ $c2 = ($crc32lookup[$i] & 0x00FF0000) >> 16; $c1 = ($crc32lookup[$i] & 0x0000FF00) >> 8; $c0 = ($crc32lookup[$i] & 0x000000FF); $two = $i; break; } } //echo "c3:" . dechex($c3) . " c2:" . dechex($c2) . " c1:" . dechex($c1) . " c0:" . dechex($c0) . "
"; //b3=f0+e0+d1+c2=78+23+5C+66=61 -> DEh=(1) 616BFFD3 for b3 b2 b1 b0 $b3 = $f0^$e0^$d1^$c2; for ($i = 0; $i < 256; $i++) { if (($crc32lookup[$i] & 0xFF000000 ) == ($b3 << 24)){ $b2 = ($crc32lookup[$i] & 0x00FF0000) >> 16; $b1 = ($crc32lookup[$i] & 0x0000FF00) >> 8; $b0 = ($crc32lookup[$i] & 0x000000FF); $one = $i; break; } } /* Now we have all needed values, then X=(1)+ a0= DE+66=B8 Y=(2)+ b0+a1= F8+D3+EF=C4 Z=(3)+ c0+b1+a2= 4F+2E+FF+CD=53 W=(4)+d0+c1+b2+a3=35+01+7A+6B+AB=8E (final computation) */ $X = $one ^ $a0; $Y = $two ^ $b0^$a1; $Z = $three ^ $c0^$b1^$a2; $W = $four ^ $d0 ^ $c1 ^ $b2^$a3; //echo "Four:" . dechex($four) . " Three:" .dechex($three)." Two:".dechex($two)."One:" .dechex($one) . "
"; //echo "X:" . dechex($X) . " Y:" . dechex($Y) . " Z:" . dechex($Z) . " W:" . dechex($W) . "
"; return chr($X) . chr($Y) . chr($Z) . chr($W); } ?>

Ti piacerebbe sapere come funziona, o come usarlo?

Se è il più tardi, rispetto alla firma del codice:

 public void FixChecksum(byte[] bytes, int length, int fixpos, uint wantcrc) 

Sembra che tu abbia messo il contenuto del tuo secondo file in un array (con 4 byte aggiuntivi alla fine della correzione) e lo passi come parametro bytes . Si passa la lunghezza di questo array come parametro di length , si passa l’offset al punto in cui inserire la correzione, (in questo caso length – 4) come parametro fixpos e si inserisce il CRC desiderato come parametro wantcrc , è ansible ottenere questo valore, calcolando il CRC del primo file.

FixChecksum metodo FixChecksum sembra scrivere la correzione a 4 byte nell’array fornito dall’offset fornito. Dopo aver effettuato la chiamata a FixChecksum è sufficiente scrivere i risultati sul secondo file.