Question

Je cherche un moyen d'inverser une somme de contrôle CRC32 . Il existe des solutions autour, mais ils sont soit mal écrit, extrêmement technique et / ou < a href = "http://www.reversing.be/article.php?story=20061209172739930" rel = "noreferrer"> à l'Assemblée . Assemblée est (actuellement) au-delà de ma ken, donc je suis en espérant que quelqu'un peut rassembler une mise en œuvre dans un langage de haut niveau. Ruby est idéal, mais je peux analyser PHP, Python, C, Java, etc.

Les preneurs?

Était-ce utile?

La solution

A CRC32 est réversible si seule la chaîne d'origine est de 4 octets ou moins.

Autres conseils

le document intitulé "Inverser CRC Théorie et pratique" .

est 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 < fixpos; i++) {
            crc = (crc >> 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 << 8) ^ revtable[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) << (3 * 8);
                for (int j = 8; j > 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;
        }
    }
}

Vous pouvez inverser en dévissant les bits pour générer les 32 bits d'origine si vous connaissez le poly il a été créé. Mais si vous cherchez à inverser la CRC32 d'un fichier donné et ajouter une série d'octets à la fin du fichier pour correspondre à la CRC d'origine que j'ai posté le code sur ce fil en PHP:

J'ai passé un peu de temps donc j'espère que cela peut aider quelqu'un à travailler sur des problèmes plus difficiles: Inverser CRC32 Vive!

Cade Roux a raison sur l'inversion CRC32.

Les liens que vous avez mentionné fournir une solution pour fixer un CRC qui est devenu invalide en modifiant le flux d'octets d'origine. Ce correctif est obtenu en modifiant certains (sans importance) octets et ainsi recréer la valeur CRC originale.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top