Prüfsumme für eine Datei erzeugen



  • Hallo,

    ich bin auf der Suche nach einem guten Verfahren zur Erstellung einer Prüfsume für eine Datei. Die Prüfsumme dient dem Zweck die Datei vor absichtlichem Manipulieren zu schützen. Gedacht habe ich mir das Grundgerüst folgendermassen:

    1. ein kleines Programm liest meine zuschützende Datei ein, und ergänzt die Datei am Ende um ein paar Bytes in denen sich dann die Prüfsummeninformationen befinden.

    2. Die zu schützende EXE Datei enthält den Code die letzten paar Bytes von sich selbern zu lesen, dann den Prüfalgorithmus über den Rest der Datei auszuführen und mit der Prüfsumme zu vergleichen.

    Soweit läuft das ganze auch schon mit sehr einfachen Prüfmechanismen, wie z.B. ist die Quersumme über alle Bytes gerade oder ungerade etc. Ich bin aber auf der Suche nach einem geeignetetem Verfahren das eine nicht alszugrosse Prüfsumme erstellt und dazu ein gutes Maß an Manipulationssicherheit gewährt. Weiss jemand Rat? Oder hat vieleicht schon eine fertige Formel zur Hand?

    cu Cracker-Jack



  • nennt sich MD5



  • ansonsten gibts noch CRC32. Wenn Sicherheit aber wirklich so wichtig ist, dann würde ich etwas exotisches nehmen, am besten selber schreiben.
    Wenn jemand deinen Quellcode disassembliert und den Md5-algo entdeckt(nicht schwer), dann sucht er noch die Stelle wo die Prüfsumme abgepsiehcert wird(am ende anhängen ist sehr beliebt) und kann dann deine Exe manipulieren, extern den md5 berechnen und die alte Prüfsumme überschreiben.

    nee,nee - denk dir selber ein möglichst kompliziertes verfahren aus, das nicht so leicht nachzubauen ist.



  • @illuminator genau das ist ja der Punkt, ein geeignetes Verfahren. Habe gedacht vieleicht gibts hier Leute die da selbern schon Hand angelegt haben.
    Mein Prüfsummencheck, ziehlt nicht auf das decompilieren oder debuggen ab. Der Code soll nicht vor W32Dasm, IDA, OllyDog, Sice etc. geschützt werden. Sondern vor dem editieren sichtbare Textteile in der Datei. EXE Packer kann und will ich nicht verwenden!



  • da gibt es der möglichkeiten viele, was weiß ich z.b.

    Du nimmst 1. byte addierst den wert zum nächsten byte, machst ne OR verknüpfung zum nächsten byte und addierst wieder nächsten zwei byte etc.
    addierst jeweils alle summen aufeinander mit nem Modulo 2^32-1 (begrenzung auf unsigned long int) oder so.

    Aber trotzdem: wenn jemand sich mit Asm und Windasm32 auskennt dann baut er deinen algo nach und ersetzt deine Prüfsumme mit seiner manipulierten, deswegen solltest du, wenn du glaubst jemand würde sich die mühe machen, das Verfahren komplizierter gestalten.



  • So einen änlichen Thread hatten wir vor kurzem. Deine Prüfsumme kann auch noch so gut versteckt sein - die meisten interessiert das nicht, da du irgendwo im Quellcode im Prinzip sowas stehen hast:
    if(exeOk) StarteProgramm(); else BeendeProgramm();
    aus if(exeOk) macht dann der jenige welche z.B. if(true).



  • Ok, dann werde ich mal spezifischer. Es ist ein MOD für ein Spiel, der Quellcode für das MOD ist vom Herstller freigegeben. D.h. das MOD ist nicht die EXE Datei, sondern wird nur von der EXE geladen, wenn man das MOD decompiliert ist, ist da nur reiner ASM Code sichtbar, nichts mit References oder ähnlichem. Wer aus dem reinem ASM Code einen Algorithmus rausfinde, der hat es meinetwegen auch verdient mein kleines MOD zu cracken. Aber der Rest (99,99%) der Cracker hat da mal überhaupt keine Plan. Deshab wie gesagt, benötige ich nur den Prüfsummencheck, sprich einen sinnvollen mathematischen Algorithmus, ist warscheinlich nur eine Formel die sich auch "Anzahl der Zeichen der Datei", "Wert des Zeichens" und "Possition des Zeichens" zusammensetzt.



  • dann streng ich jetzt einfach mal google für dich an:

    http://www.google.de/search?q=crc32+c%2B%2B&ie=UTF-8&oe=UTF-8&hl=de&btnG=Google+Suche&meta=

    da gibtsd z.B. das:

    http://www.ncbi.nlm.nih.gov/IEB/ToolBox/CPP_DOC/lxr/source/src/util/compress/zlib/crc32.c

    @nemesyzz:
    es gibt verfahren wonach eine programm die ermittelt Prüfsumme als Psrungsadresse benötigt. um debugging zu verhindern kann man auch an irgendwelchen Interrupts rumbasteln. (frag mich nicht wie oder was, hat mir nur nen Freund aus der Szene erzählt).



  • @illuminator, danke erstmal für die Mühe, aber leider kann ich damit nichts anfangen, weil cihs nicht verstehe.

    Hat hier einer vielleicht eine mathematisch Formel zur Hand oder was ähnliches



  • #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    class CRC32Tabelle
    {
    public:
    	CRC32Tabelle (uint32 polynomial = 0xEDB88320);
    	~CRC32Tabelle();
    	const uint32 & operator[] (int argOffset) const;
    private:
    	CRC32Tabelle (const CRC32Tabelle &);
    	const CRC32Tabelle operator= (const CRC32Tabelle &);
    	uint32 * m_crc32tabelle;
    };
    
    CRC32Tabelle::CRC32Tabelle (const uint32 polynomial):m_crc32tabelle (new uint32[256])
    {
    	uint32 bitmuster;
    	for (int i = 0; i < 256; ++i)
    	{
    		bitmuster = i;
    		for (int j = 8; j > 0; --j)
    		{
    			if (bitmuster & 1)
    				bitmuster = (bitmuster >> 1) ^ polynomial;
    			else
    				bitmuster >>= 1;
    		}
    		m_crc32tabelle[i] = bitmuster;
    	}
    }
    
    CRC32Tabelle::~CRC32Tabelle()
    {
    	delete [] m_crc32tabelle:
    }
    
    const uint32 & CRC32Tabelle::operator[] (int argOffset) const
    {
    	return m_crc32tabelle[argOffset];
    }
    
    uint32 GetFileCRC (const char * argFile)
    {
    	CRC32Tabele crc32tabele;
    	uint32 crc32 = 0xFFFFFFFF;
    	fstream File (argFile, ios::in | ios::binary);
    	while (!File.eof())
    		crc32 = (crc32 >> 8) ^ crc32tabele[File.get() ^ (crc32 & 0x000000FF)];
    	return crc32 ^ 0xFFFFFFFF;
    }
    
    int main (int argc, char *argv[])
    {	
    	cout << hex << "0x" << GetFileCRC(argv[0]) << "\n";
    	return 0;
    }
    


  • Hallo alle zusammen!

    Ich wollte mal mit der von Gerard geposteten Klasse experimentieren. Leider lässt sich folgender Quellcode nicht compilieren, der Compiler bricht mit der Meldung "[C++ Fehler] CRC32.h(14): E2293 ) erwartet" ab.

    crc32.cpp:

    #pragma hdrstop
    #include "CRC32.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    CRC32Tabelle::CRC32Tabelle(const uint32 polynomial) : m_crc32tabelle (new uint32[256])
    {
        uint32 bitmuster;
    
        for (int i = 0; i < 256; ++i)
        {
            bitmuster = i;
            for (int j = 8; j > 0; --j)
            {
                if (bitmuster & 1)
                    bitmuster = (bitmuster >> 1) ^ polynomial;
                else
                    bitmuster >>= 1;
            }
    
            m_crc32tabelle[i] = bitmuster;
        }
    }
    
    CRC32Tabelle::~CRC32Tabelle()
    {
        delete [] m_crc32tabelle:
    }
    
    const uint32 & CRC32Tabelle::operator[] (int argOffset) const
    {
          return m_crc32tabelle[argOffset];
    }
    

    *.h:

    #ifndef CRC32H
    #define CRC32H
    //---------------------------------------------------------------------------
    class CRC32Tabelle
    {
          public:
    
          CRC32Tabelle (uint32 polynomial = 0xEDB88320); // hier bricht der Compiler mit der o.g. Fehlermeldung ab
          ~CRC32Tabelle();
          const uint32 & operator[] (int argOffset) const;
    
          private:
    
          CRC32Tabelle (const CRC32Tabelle &);
          const CRC32Tabelle operator= (const CRC32Tabelle &);
          uint32 * m_crc32tabelle;
    };
    #endif
    

    Was mach ich falsch?


Anmelden zum Antworten