Hi, gibt's eine Möglichkeit, in einen entsprechend angelegten Bereich einer ausführbaren Datei (Windows) Daten zu schreiben, auf die dann aus dem Programm zugegriffen werden kann? Ich möchte nur die Programmdatei, und ich möchte nicht jedesmal kompilieren (und die Daten in eine Header-Datei umwandeln).
>Ich möchte nur die Programmdatei, und ich möchte nicht jedesmal >kompilieren (und die Daten in eine Header-Datei umwandeln). Ressourcen die werden linked (dann brauchst nicht compilieren ;-)
du kannst ans ende der EXE schreiben was du willst. Auslesen kannst du ganz normal mit read.
Peter II schrieb: > du kannst ans ende der EXE schreiben was du willst. Auslesen kannst du > ganz normal mit read. Dazu muss ich doch vor dem Kompilieren wissen, wie groß die .exe wird. Oder man füllt einfach auf. Das wird gehen. Danke!
Um wieviele Daten geht es? Ich habe schon bei fertig compilierten Programmen hinterher individuelle Seriennummern in String-Konstanten hineingepatcht. Wenn du im Programm eine erkennbare Konstante anlegst, z.B. "xxx----------xxx", kannst du die im Code suchen und z.B. durch einen (Base64-kodierten) Wert ganz oder teilweise ersetzen, wobei die Länge natürlich nicht verändert werden darf.
Frank Esselbach schrieb: > Um wieviele Daten geht es? Ich habe schon bei fertig compilierten > Programmen hinterher individuelle Seriennummern in String-Konstanten > hineingepatcht. Wenn du im Programm eine erkennbare Konstante anlegst, > z.B. "xxx----------xxx", kannst du die im Code suchen und z.B. durch > einen (Base64-kodierten) Wert ganz oder teilweise ersetzen, wobei die > Länge natürlich nicht verändert werden darf. so ein quatsch. es gibt doch kommandozeilentools, mit denen man die Ressourcen einer PE-Datei bearbeiten kann, warum also solche dirty hacks? Allerdings dürfte es schwer fallen, ein Programm an der eigenen Programmdatei zur laufzeit rumdoktoren zu lassen. das dürfte nur kompliziert möglich sein. *1 eigene Programmdatei kopieren -> temp.exe *1 temp.exe manipulieren *1 temp.exe starten (*2) mit parameter, der spezielles Verhalten auslöst *1 sich beenden *2 warten, bis 1 beendet ist. *2 orignal überschreiben mit temp.exe *2 überschriebenes Original mit weiteren Parameter, der spezielles Verhalten auslöst starten (*3) *2 beenden *3 warten, bis 2 beendet ist. *3 temp.exe löschen das wäre mein erster ansatz. Das ganze ist aber ziemlich vermurkst. Dann lieber eine zusätzliche Konfigurationsdatei.
>ch doch ne DLL oder ne XML-Datei und binde die zur Laufzeit ein.
(einziger) sinn solch einer aktion ist dass man eben KEINE 2. datei
haben will, sondern alles in einer sein muss...
Ein paar Gedanken zur Idee von Peter II: Nachsehen was bei deinem Compiler immer das letzte Byte ist (bei mir 0x00) Auf dieses Byte prüfen, (Größe der Datei kann ja per Dateisystem ermittelt werden) Wenn ja -> Erster Start nach kompilieren, Daten + PrüfByte ans Ende kopieren. Evtl noch 4Byte vor dem PrüfByte für die Länge deiner Daten, falls nicht zur Compilierzeit ermittelbar
tk schrieb: > Nachsehen was bei deinem Compiler immer das letzte Byte ist (bei mir > 0x00) > Auf dieses Byte prüfen, (Größe der Datei kann ja per Dateisystem > ermittelt werden) > Wenn ja -> Erster Start nach kompilieren, Daten + PrüfByte ans Ende > kopieren. > Evtl noch 4Byte vor dem PrüfByte für die Länge deiner Daten, falls nicht > zur Compilierzeit ermittelbar es geht doch viel einfacher, einfach die Daten ans Ende dran hängen und zusätzlich noch als 4byte die Länge der daten. Beim Auslesen einfach als erste die 4byte länge lesen dann von der Dateigröße abziehen und schon hat man den offset wo die nutzdaten beginnen. Aber das ganze geht nur bis 2GB, dann startet die exe nicht mehr.
Das ist noch besser, als erst bist zu einer bestimmten Größe aufzufüllen. Danke.
Ich meine gehört zu haben das dieser Hack nach DOS nicht mehr möglich ist, da die Datei vom System geöffnet ist und nicht geschrieben werden kann.
User schrieb: > Ich meine gehört zu haben das dieser Hack nach DOS nicht mehr möglich > ist, da die Datei vom System geöffnet ist und nicht geschrieben werden > kann. so wie ich es verstanden haben geht es hier auch nicht um das schreiben sondern nur um das lesen. Er will doch nur bei sich daten Anfügen die das Program dann später verwendet. Zum einfügen kann er ja ein anderes Programm verwenden.
Achja das waren noch Zeiten... :D Ans Ende einer .EXE kannst Du dranschreiben was Du willst. Die Länge des zu ladenden Programmteils steht im Header, der Rest wird vom EXE-Loader nicht berücksichtigt. Dein Programm kann also nun herausfinden unter welchem Namen es aufgerufen wurde, die Datei öffnen und entsprechend Daten nachladen. Prinzipiell kannst Du auch Daten gleich vom EXE-Loader mit ins RAM laden lassen, mußt aber ggf. Checksummen berechnen und die Länge des Datensatzes muß immer gleich sein (sofern Du den Header nicht änderen möchtest). Und im Grunde kannst Du mit einer .EXE machen was Du willst. Veränderst Du dabei den Code bekommst Du entweder einen Checksummenfehler oder das "Programm" crasht einfach. Ich hab das früher bei eigenen Programmen ausgiebig genutzt, einige Programme haben sich beim ersten Aufruf selbst verschlüsselt und die verschlüsselte Version in der .EXE abgelegt so daß man sich nicht mit einem externen Programm darum kümmern brauchte.
Ben _ schrieb: > Und im Grunde kannst Du mit einer .EXE machen was Du willst. Veränderst > Du dabei den Code bekommst Du entweder einen Checksummenfehler oder das > "Programm" crasht einfach. also das mit der Checksumme glaube ich nicht, ich habe auch schon Programmanpassungen an einer EXE vorgenommen (im code-Teil) und dabei ist es zu keinem Checksummen Problem gekommen. Oder ist sie Optional?
Scheint optional, ich kenne keinen .EXE-Loader der sie auswertet. Ist auch bei vielen Dateien ausgenullt. Aber es gibt sie halt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.