.exe Builder
-
Professor Schlurmann schrieb:
Außerdem will ich ja eigentlich nicht in der .exe, sondern in der Resource, die dann die .exe erzeugt, schreiben. Da der String für den Text an der Position 809 ist.
Und genau das ist Käse.
Lad den Text in der .exe (die du ja vorkompiliert hast und eigentlich nur "kopierst") aus einer Resource. Diese Resource kannst du dann einfach per UpdateResource verändern.
Vorteile:
1. kein Rumgeschreibe in der .exe, das ohnehin auf Dauer nie wirklich sinnvoll funktionieren würde (die .exe bleibt immer gleich)
2. du bist nicht darauf angewiesen, die (sich vermutlich ändernde) Adresse des Strings in der Datei zu kennen.
3. du brauchst dir weniger Sorgen um Buffer Overflows machen.
-
Hier gibts nen fertigen Quellcode:
http://www.codeproject.com/string/updatestringresource.aspMusst nurnoch die ID bei MAKEINTRESOURCE anpassen und
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)durch
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL)austauschen. Kommt allerdings auf die Compileroptionen an.
-
Ich benutze sehr ungern Code von Codeproject. Die benutzen Funktionen die keine Sau kennt und der Code ist mir viel zu allgemein geschrieben. Ich möchte den Code auch verstehen, den ich benutze. Und wie gesagt, ich versuche dort eigentlich nicht in eine .exe zu schreiben, ich versuch es schon mit der Resource. Ich lade die Resource per TResourceStream und ersetze den String an der Position (die in der Resource, in dem Fall Zeile 809) durch den String aus Edit1.
Edit: Wie stellt ihr euch das mit den ID'S vor? Es ist eine RT_RCDATA Resource, da steht nicht viel außer 00 00 00 00 00 00 usw. und an Stellen an den Text ist, stehen eben die ASCII Codes.
Ich will keine Strings irgendwo "rausladen". Ich will welche ersetzen. Sonst macht das ja wenig Sinn, wenn ich in irgendeine Stringtable schreibe, die mir nichts bringt.
-
Ok also mal schauen ob ichs richtig verstehe.
Du willst eine exe haben, ich nenn die mal main.exe, in der eine andere exe, ich nenn sie mal sub.exe, als Resource includiert sein soll.
Im Hauptprogramm (main.exe) soll man einen Text eingeben können der dann von der sub.exe in einer MessageBox angezeigt werden soll.
Soweit alles korrekt oder?
Es ist nicht empfehlenswert in den binären Daten der sub.exe rumzupfuschen es sei denn du kennst dich wirklich gut mit dem PE-Dateiformat aus wovon ich jetzt mal nicht ausgehe.
Viel sinnvoller ist es dieses Rumgeschreibsel von WinApi-Funktionen machen zu lassen.Mein Lösungsvorschlag sieht wie folgt aus:
Beim Start der sub.exe führst du folgendes aus:ShowMessage(LoadStr(1));Du gibst also den String mit der ID 1 aus der Stringtable aus.
Die sub.exe packst du dann in die main.exe.
In der main.exe entpackst du dann die sub.exe und fügst mit Hilfe der Funktion von Codeproject den gewünschten String in die sub.exe ein:AnsiString filename=ExtractFilePath(Application->ExeName)+"sub.exe"; TResourceStream *str=new TResourceStream((int)HInstance, "SUB", "RT_RCDATA"); str->SaveToFile(filename); delete str; if(SetScreenSaverName(filename.c_str(), Edit1->Text.c_str())==TRUE) ShowMessage("Erfolg");So schreibst du in die sub.exe eine neue Stringtable(bzw. überschreibst die alte) dessen String mit der ID 1 dein gewünschter Text ist. Genau dieser wird dann beim Start von sub.exe über LoadStr(1) geladen und ausgegeben.
Zu Codeproject:
Nur weil die Leute die sich bei Codeproject den Arsch aufreißen um intelligent Lösungen für Probleme zu liefern um ein vielfaches bessere und erfahrenere Programmier sind als du muss man ihre Lösungen nicht runter machen
Der gepostet Quelltext ist wirklich gut dokumentiert und wenn man sich ein wenig dahinter klemmt auch sehr einfach zu verstehen.
Anstatt die Überlegenheit anderer Leute schlecht zu reden solltest du vielleicht an deiner eigenen Unfähigkeit arbeiten.
-
Ich wollte die Leute von Codeproject keineswegs runtermachen, aber ich meine nur, dass sie eben eben einen sehr professionellen Stil haben, der für einen Freizeitcoder wie mich, nicht allzu leicht zu verstehen ist, trotz Doku.
Das mit der MessageBox ist natürlich nur ein Beispiel. Darum geht es ja. Es soll ein Builder entstehen. Ich habe ja davor ein Programm das die MessageBox erzeugt (stub) zur .res "kompiliert". Das heißt wenn es um ein anderes Beispiel geht, was eben nicht nur den String ausgeben soll, habe ich ja herzlich wenig von einer Stringtable. Ich möchte ja eine vollfunktionsfähige .exe erzeugen, die mehr kann, als nur einen String ausgeben. Sonst könnte ich auch einfach aus dem laufenden Programm eine MessageBox mit dem Editfeldinhalt aufrufen...
-
Und du glaubst wirklich, ein richtiger "Builder" hat eine Plain-EXE, an der er dann an verschiedensten hartkodierten Offsets Daten einfügt?
Ganz ehrlich, was du suchst nennt sich Compilerbau und ist ein sehr komplexes Thema ... Alle anderen Ansätze, die in deine Richtung gehen, sind ungeschickte, fehlerträchtige und letztlich sinnlose Workarounds.
-
árn[y]ék schrieb:
Und du glaubst wirklich, ein richtiger "Builder" hat eine Plain-EXE, an der er dann an verschiedensten hartkodierten Offsets Daten einfügt?
Weiß ich nicht, wenn es einfacher geht, ich bin ganz Ohr!
-
Professor Schlurmann schrieb:
Weiß ich nicht, wenn es einfacher geht, ich bin ganz Ohr!
Ähm mit dem dir schon gegebenen Schlagwort UpdateResource z.B.
Bzw. was hast du gegen rean Vorschlag auszusetzten und wiso versteift du dich darauf das man mit UpdateResource nur StringTables verändern kann.
Hast du schon mal in der Hilfe nach UpdateResource gesucht und geschaut was man damit alles verändern kann? sicher noch nicht!
-
Tut mir leid, aber ich versteh immer noch nicht, was mir eine String Table bringen soll, wenn ich eine .exe erzeugen will, die eigenständig etwas tut...
Wenn ich die Resource, die die MessageBox erzeugt "updaten" will, muss ich ja trotzdem irgendwie den String dort drin ersetzen. Ich versteh nicht, was da eine String Table zu suchen hat...
-
Ist das "Sub-Programm" von dir Programmiert also das du es umstellen könntest das es sich die Texte aus der Resource entnimmt? oder ist es eine Fremd EXE die du manipulieren willst?
-
Nein, die .exe ist von mir selbst erstellt.
-
Wozu soll das denn überhaupt gut sein?
Upgrade, andere Sprache oder was?Was Du bisher beschreibst kommt mir vor, als wolltest Du einen eigenen
Compiler/Linker schreiben...wNw
-
Später soll jemand mit dem "Builder" einen Pfad zu einem Bild auswählen und einen Text eingeben, dann wird eine .exe erstellt die das Bild und den Text darstellt, die man dann verschicken kann, eine Art Scherzprogramm also. Aber ich will es eben erst mal mit einem einfach Beispiel, wie einer MessageBox versuchen. Der Rest ist ja dann einfach.
-
Und was hintert dich jetzt daran dein "Subprogramm" so umzustellen das es seine Anzeige Texte bzw. die Texte/Bilder die du verändern willst sich aus der Resource läd, die du dann später Einfach und Sicher (nachdem du die Exe gespeichert hast) mit BeginUpdateResource/UpdateResource/EndUpdateResource verändern kannst?
Brauchst fertigen Copy&Paste Code?
-
Das war ja was ich versucht habe, nur eben nicht mit UpdateResource. Vielleicht sollte ich mal die Resource posten, vielleicht wird es dann etwas klarer.
/********************************************* File: D:\DOKUMENTE UND EINSTELLUNGEN\TORMENR\DESKTOP\MBOX.RC Generated by Resource Builder (2.6.2.0). *********************************************/ /* OutputExt=res */ mbox RCDATA MOVEABLE PURE LOADONCALL DISCARDABLE LANGUAGE LANG_NEUTRAL, 0 BEGIN '4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 ' 'B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 B0 00 00 00 ' '0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 ' '69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F ' '74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 ' '6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 ' '5D 5C 6D C1 19 3D 03 92 19 3D 03 92 19 3D 03 92 ' '97 22 10 92 1E 3D 03 92 E5 1D 11 92 18 3D 03 92 ' '52 69 63 68 19 3D 03 92 00 00 00 00 00 00 00 00 ' '50 45 00 00 4C 01 03 00 C9 B1 B5 46 00 00 00 00 ' '00 00 00 00 E0 00 0F 01 0B 01 05 0C 00 02 00 00 ' '00 04 00 00 00 00 00 00 00 10 00 00 00 10 00 00 ' '00 20 00 00 00 00 40 00 00 10 00 00 00 02 00 00 ' '04 00 00 00 04 00 00 00 04 00 00 00 00 00 00 00 ' '00 40 00 00 00 04 00 00 CD E3 00 00 02 00 00 00 ' '00 00 10 00 00 10 00 00 00 00 10 00 00 10 00 00 ' '00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 ' '10 20 00 00 3C 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 20 00 00 10 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 2E 74 65 78 74 00 00 00 ' '26 00 00 00 00 10 00 00 00 02 00 00 00 04 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 60 ' '2E 72 64 61 74 61 00 00 92 00 00 00 00 20 00 00 ' '00 02 00 00 00 06 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 40 00 00 40 2E 64 61 74 61 00 00 00 ' '14 00 00 00 00 30 00 00 00 02 00 00 00 08 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 C0 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '6A 40 68 00 30 40 00 68 09 30 40 00 6A 00 E8 0D ' '00 00 00 6A 00 E8 00 00 00 00 FF 25 00 20 40 00 ' 'FF 25 08 20 40 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '5C 20 00 00 00 00 00 00 78 20 00 00 00 00 00 00 ' '4C 20 00 00 00 00 00 00 00 00 00 00 6A 20 00 00 ' '00 20 00 00 54 20 00 00 00 00 00 00 00 00 00 00 ' '86 20 00 00 08 20 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 5C 20 00 00 ' '00 00 00 00 78 20 00 00 00 00 00 00 80 00 45 78 ' '69 74 50 72 6F 63 65 73 73 00 6B 65 72 6E 65 6C ' '33 32 2E 64 6C 6C 00 00 9D 01 4D 65 73 73 61 67 ' '65 42 6F 78 41 00 75 73 65 72 33 32 2E 64 6C 6C ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '54 6F 6C 6C 65 42 6F 78 00 54 6F 6C 6C 65 72 54 ' '65 78 74 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' ENDSo, an der Position, an der der Text steht, versuche ich nun den String zu ersetzen. Wenn ich mir UpdateResource in der MSDN anschaue, frage ich mich, wie ich dort festlegen soll, wo der String durch was ersetzt werden soll. Da es eben nicht irgendeine String Table ist. Wenn ich da irgendwo einen dicken Denkfehler drin habe, sagt bitte Bescheid. Oder ist der Resource Typ falsch?
Sorry wenn ich leicht undankbar erscheine, aber ich bin die letzten Tage leicht genervt. Also möcht ich mich, auch wenn's noch nicht funzt, bei euch allen für die Mühen bedanken.

-
VergissEs schrieb:
Und was hintert dich jetzt daran dein "Subprogramm" so umzustellen das es seine Anzeige Texte bzw. die Texte/Bilder die du verändern willst sich aus der Resource läd, die du dann später Einfach und Sicher (nachdem du die Exe gespeichert hast) mit BeginUpdateResource/UpdateResource/EndUpdateResource verändern kannst?
-
Okay, ich glaub ich hab verstanden, was ihr mir seit 2 Tagen versucht zu sagen:
Das erstellte Subprogramm soll die Strings aus einer Resource lesen die vom Builder verwaltet (geupdatet) wird?
Edit: Da würde sich aber ein Problem auftun-> Das Subprogramm müsste ja erst gestartet werden, damit es die Resource auslesen kann. Das ist ja irgendwie sehr unelegant.
-
Ist das jetzt ein Troll Versuch?
-
Was zur Hölle ist ein "Troll Versuch"?
Edit: http://de.wikipedia.org/wiki/Troll_(Netzkultur) ... aha
Nein das ist kein "Troll Versuch". Ich hätte eigentlich gerne eine Antwort.
-
Ja klar muß dein Subprogramm gestartet werden damit es auf seine eigenen Resourcen zugreifen kann!
Dein Builder Programm wird ja auch irgendwan mal gestartet um auf seine eigenen Resourcen zu zu greifen (in deinem Fall dein Subprogramm das es dann herrausnimmt und speichert und dann verändern soll).
Was soll daran bitteschön unelegant sein wenn es das macht was es machen soll?
