Informationen in andere EXE-Datei schreiben



  • Ist halt die Frage, was du überhaupt willst. Die Idee mit den Ressourcen find ich gar nicht schlecht, weil man die leicht über das API ändern kann und keine komplizierten Tricks braucht, um die richtige Stelle im .exe zu finden.



  • ja, dass mit den ressourcen hab ich ja auch vor - nur der string bleibt immer
    gleich 😕



  • Läuft das andere Programm (zum Zeitpunkt der versuchten Änderung)?



  • nee - die Anwendung läuft nicht zum Zeitpunkt der Änderung



  • Hast du mal die ganzen Rückgabe-Werte überprüft?



  • mh ich habe soeben mit dem "Ressource Hacker" festgestellt, dass auch ne
    neue Ressource erstellt wird - aber halt nur neu erstellt (die alte Ressource,
    bzw. der alte String wird nicht gelöscht) 🙄



  • moin meister ...

    wenn Du schon so pfiffig bist und den Code gefunden hast, schau dann auch mal
    in die Doku, was die Funktionen machen die im Code verwendet werden ...

    HANDLE BeginUpdateResource(
    LPCTSTR pFileName, // pointer to executable file name
    BOOL bDeleteExistingResources // deletion option
    );

    mehr sag ich aber nicht ...

    MfG
    RB



  • @RED-BARON:
    Ahh.. danke für den Tipp 😃
    der Code sieht bei mir jetzt so aus:

    #include <windows.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevIsntance, PSTR szCmdine, int iCmdShow)
    {
        HANDLE h;
        int Anz;
        BOOL res;
        WCHAR* buffw;
        char buff[] ="Neue String";
        buffw = new WCHAR[256];
    
        // ASCII-String in Unicode-String umwandeln
        Anz = MultiByteToWideChar(CP_ACP, 0, buff, lstrlen(buff), NULL, 0);
        MultiByteToWideChar( CP_ACP, 0, buff, lstrlen(buff), buffw, Anz);
    
        h = BeginUpdateResource("C:\\eineexe.exe", TRUE);
        res = UpdateResource(h, RT_STRING, "1", MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), buffw, sizeof(buffw));
    	EndUpdateResource(h, FALSE);
    
        return 0;
    }
    

    ..doch in der String-Ressource der EXE steht jetzt:

    STRINGTABLE
    LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
    {
    1392, 	"e?????????????????????????????????????????????????????????????????????????????"
    }
    

    😕

    thx für die antworten!
    cruzo



  • UpdateResource erwartet im letzten Parameter die Größe des Buffers in Bytes. Du übergibst aber mit sizeof(buffw) nur die Größe eines Pointers 😉



  • Danke für den Hinweis!
    Würde denn jetzt

    sizeof(buff)
    

    funktionieren?
    ..Ihr müsst wissen, dass ich Zeiger über alles hasse...



  • In Anz hast du ja schon die Länge. Ich weiß gerade nicht, ob da das abschließende NUL-Zeichen schon drin ist - also kannst du z.B. 2*Anz bzw. 2*(Anz + 1) verwenden 🙂
    Ansonsten könntest du wohl auch 512 (2* 256) angeben, denn so groß ist ja der von dir reservierte Speicher für buffw 😉



  • hi flenders!
    ich habe gerade den code hier ausprobiert:

    #include <windows.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevIsntance, PSTR szCmdine, int iCmdShow)
    {
        HANDLE h;
        int Anz;
        BOOL res;
        WCHAR* buffw;
        char buff[] ="Neue String";
        buffw = new WCHAR[256];
    
        // ASCII-String in Unicode-String umwandeln
        Anz = MultiByteToWideChar(CP_ACP, 0, buff, lstrlen(buff), NULL, 0);
        MultiByteToWideChar( CP_ACP, 0, buff, lstrlen(buff), buffw, Anz);
    
        h = BeginUpdateResource("C:\\eineexe.exe", TRUE);
        res = UpdateResource(h, RT_STRING, "1", MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), buffw, 512);
    	EndUpdateResource(h, FALSE);
    
        return 0;
    }
    

    ...Wenn ich jetzt aber die Anwendung "eineexe" mit dem ResourceHacker
    öffne und mir den Stringinhalt ansehen will, kommt die Fehlermeldung

    "Access violation at adress 77E5AB08 in module 'kernel32.dll'. Read of address 00A1C000"
    😮 😞

    ich hoffe mal, dass das "experiment" jetzt keine bleibenden schäden in windows
    hinterlassen hat...
    könnt ihr mir noch einmal helfen?


Anmelden zum Antworten