Manuell auf externe Exe zugreifen und Header ändern



  • hi,
    ich würde gerne von einer anderen Exe den header einlesen und darin die NumberOfSection ändern und das ganze wieder speichern. Mein Versuch sieht so aus:

    HANDLE hFile =
            CreateFile(szFile,         // Filename
                       GENERIC_ALL,         // Desired access
                       0,                    // Share mode
                       NULL,                 // Security attributes
                       OPEN_EXISTING,        // Creation disposition
                       0,                    // Flags and attributes
                       NULL);                // Template
    
    	PIMAGE_DOS_HEADER DosHeader = (PIMAGE_DOS_HEADER)hFile ;
    
        PIMAGE_NT_HEADERS NtHeaders = (PIMAGE_NT_HEADERS)(baseAddr + DosHeader->e_lfanew);
    	++NtHeaders->FileHeader.NumberOfSections;
    

    Leider crashed es nur, es sieht nicht so aus, als wäre hFile die base addresse der exe? Und wenn ich ++NtHeaders->FileHeader.NumberOfSections; schreibe, müsste das doch auch automatisch in der exe die Anzahl ändern, weil das ja ein pointer ist? Wo liegt mein Denkfehler bitte?



  • baseAddr ist natürlich hFile, und der Fehler: mein Programm crashed.



  • Was hast Du denn für eine Frage?
    Lies Dir einfach die COFF-Specifikation durch, dann sollten sich Deine Fragen erübrigen...

    PS: Eine Datei liest man mit "ReadFile" ein...



  • hi!
    Meine Frage ist, wie ich ein Handle zum erste byte des Files bekomme. Mit CreateFile klappt es scheinbar nicht, sonst hätte ich ja den dosHeader in der ExeFile gefunden. Muss ich wirklich erst das ganze File in nen buffer laden mit ReadFile und dann mit dem Buffer arbeiten?



  • weis du überhaupt was ein handle ist?



  • Ja, ein Steuerknüppel!



  • jo könnte mir bitte jemand bei meinem Problem helfen


  • Mod

    TOubsi schrieb:

    jo könnte mir bitte jemand bei meinem Problem helfen

    Lerne erstmal ein paar grundlegende Sachen wie CreateFile, ReadFile und was Speicher eigentlich bedeutet...



  • ich weis was Speicher ist, aber war ja mal wieder klar, dass man hier keine vernünftige Antwort bekommt. Ich will doch nur das file on disc verändern und da scheint CreateFile doch kein falscher weg zu sein? Und ich habe auch bereits gefragt ob ich dann das ganze file mit ReadFile einlesen muss aber auch darauf bekomme ich ja keine Antwort -.- naja sry bin wohl mal wieder im falschen Forum gelandet. Dachte das ist das WinApi Forum, aber ich bin im "Nur Experten die die API und ihre Tücken auswendig können dürfen posten" Forum gelandet.



  • Du oeffnest eine Datei im Schreibmodus, gehst an die entsprechende Stelle und schreibst Daten. Danach die Datei schliessen. Die entsprechenden C-Funktionen sind fopen, fseek/ftell, fwrite und fclose. Windows hat bestimmt etwas aehnliches. Da du nichts lesen willst, brauchst du auch nicht ReadFile.

    Das was du dort an Code geliefert hast, ist der absolute Bockmist. Ein Handle kann alles sein, meist ein Identifier fuer Betriebssystemressourcen. Das kann z.B. ein einfacher Integer sein. Casten ist da voellig falsch am Platz. Deine Probleme haben nichts mit der WinAPI zu tun, sondern mit deinem Verstaendnis vom Programmieren. Dir fehlen die Grundlagen. Einen String z.B. der Form "123" kann man auch nicht durch int i = (int)"123" in die Zahl 123 verwandeln.



  • Wenn Du es nicht selber lesem willst, sondern "direkt" Zugriff darauf haben willst, dann schau Dir "CreateFileMapping" an:
    http://msdn.microsoft.com/en-us/library/aa366537



  • Dankeschön knivil und Jochen Kalmbach 🙂
    Ich schaue mir die Funktionen gleich an!


Anmelden zum Antworten