HEXEDIT



  • Hallo!
    Kennt ihr das Programm Hexedit.Für die die es nicht kennen:Hexedit zeigt die Nullen und Einsen jeder Datei(auch Progamme)egal welchen Formats als HEXadezimale Zahlen an und versucht sie als ASCIIzeichen darzustellen.
    Meine Frage:Kann ich über ein selbstgeschreibenes Programm die Hexfolge in Hexedit bearbeiten(nach Teilstrings suchen,vergleichen...)



  • natürlich geht das. Du musst die Datei einfach ein ein Array of char laden und schon
    kannst du mit den Daten machen was du willst.

    Ich hab mir eine sehr praktische Routine geschrieben um nach Pattern in Dateien
    su suchen:

    bool __fastcall TForm1::MaskSearch(unsigned char * cSearchFile, int iSearchFileLen, const int * cMask, int & iFoundAddress, int & iFoundCounter, int iStart, int iStep)
    {
        /*
            Eingabe:
            cSearchFile = array of char, dass durchsucht werden soll
            iSearchFileLen = die Grösse des zu durchsuchenden array of char
            cMask = Maske nach der gesucht werden soll. -1 = Byte ignorieren
                                                        -2 = Ende der Maske
    
            Ausgabe:
            iFoundAddress = an welcher Adresse wurde die Maske zuletzt gefunden?
            iFoundCounter = wie oft wurde die Maske insgesammt gefunden?
            MaskSearch = true -> genau einmal gefunden
            MaskSearch = false -> mehr als einmal oder nicht gefunden.
    
        */
    
        iFoundCounter=0;
    
        int iMaskLen=-1;
        while (cMask[++iMaskLen] != -2);
    
        bool bFound;
        for (int i = iStart; i < iSearchFileLen - iMaskLen; i+=iStep) {
            bFound = true;
            int iMaskPos=0;
    
            for (int ii = i; ii < i + iMaskLen; ii++) {
                if (cMask[iMaskPos] != -1) {
                    // wenn das Maskenbyte eine Rolle spielt.
                    if (cSearchFile[ii] != cMask[iMaskPos]) {
                        // wenn das Maskenbyte nicht übereinstimmt
                        bFound = false;
                        ii = i + iMaskLen;
                    }
                }
                iMaskPos++;
            }
    
            if (bFound) {
                // gefunden
                iFoundAddress = i;
                iFoundCounter++;
            }
        }
        if (iFoundCounter == 1) return true;
    
        // in der ganzen Datei nicht oder mehrmals gefunden.
        return false;
    }
    

    Beispiel:

    Dieser Aufruf sucht nach NOP's in einem C166 File (ja ja, die Handys ;))

    int iMask [] = {
         0xCC, 0x00,
         -2
    };
    int iFoundAddress, iFoundCounter;
    MaskSearch(cFile, 0x1000000, iMask, iFoundAddress, iFoundCounter, 0, 2);
    


  • Danke schon mal!
    Weisst du auch wie man eine Datei öffnet und dann in ein char Array lädt?




Anmelden zum Antworten