Informationen in andere EXE-Datei schreiben
-
so.. jetzt bin ich auch mal wieder online und
hab über die forensuche folgendes thema gefunden:
http://www.c-plusplus.net/forum/viewtopic.php?t=63450&postdays=0&postorder=asc&highlight=setfilepointer&start=10...da das thema aber im chaos endet, wollte ich eigentlich nur fragen, ob man den
code verwenden kann:#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:\\ZielExe.exe", FALSE); res = UpdateResource(h, RT_STRING, "IDS_STRING", MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), buffw, sizeof(buffw)); EndUpdateResource(h, TRUE); return 0; }PS Muss ich dann als Ressource in der "ZielExe.exe" eine Stringtable einfügen?
thx
-
HAAAAAALLLLLLLLOOOOOOOOO?
Kann mir denn keiner von euch helfen???
-
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 jetztsizeof(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?