![]() |
Patches programmieren
Guten Morgen :hi:
Wie programmiert man eigentlich Patches ? Ich meine kleine Programme die ein anderes fertiges Programm verändern. Zum Beispiel wollte ich die Caption eines Programmes mittels eines Patches verändern. Wie geht das ? Thx |
Re: Patches programmieren
Du musst die compilierten Teile des Projekts austauschen, d.h. die exe-Datei und/oder die *.dcu-Dateien
|
Re: Patches programmieren
Zitat:
|
Re: Patches programmieren
![]() |
Re: Patches programmieren
Du musst eigentlich das tun, was ein Resourcenhacker machen kann: den Text in der compilierten exe veraendern. Wie man das genau macht wuesste ich jetzt auch nicht, aber ich schaetze mal, du machst ein Patchfile. Du hast die alte exe und die neue, und laesst diese bitweise vergleichen. Die Unterschiede schreibst du dir in eine Datei, und das Patchprogramm gleicht dann die Unterschiede aus (z.B. macht aus einem "A" ein "B"). So hast du ein kleines Patchprogramm.
@Filou: Das macht garantiert KEIN Patchprogramm. Wozu brauch ich ein Programm um Dateien auszutauschen? Das kann der Nutzer auch selbst. @arbu man: Bei der naechsten Ausfuehrung ist die Caption dann gleich. So wie ich das verstanden habe, will er die exe selbst patchen. Greetz alcaeus |
Re: Patches programmieren
@arbu man: Weißt du überhaupt, was ein Patch ist? :gruebel:
Üblicherweise versteht man unter einem Patch eine kleine Binärdatei, die eine andere Datei ändert. Das heißt, es wird in den Bytes der Datei rumgeschrieben, so dass aus der Version 1.0 plötzlich Version 1.1 wird, usw. Klar wird dabei nicht wild in der Datei herumgeschrieben, sondern das Patchprogramm vergleicht die alte und die neue Version und notiert sich quasi nur die Änderungen. Nachteil: Der Patch ist nur auf eine bestimmte Datei (damit meine ich die Version!) anwendbar. Vorteil: Während die neue Exe vllt. mehrere 100k ausmacht, ist so ein Patch unter Umständen nicht mal 100k groß. Nachteil: Gibt es mehrere Versionen der Exe (v1.0, v1.1, v1.2), die alle gepatcht werden sollen (auf v2.0), dann müssen auch entsprechend viele Patches veröffentlicht werden, oder man stellt gleich die neue Exe zur Verfügung. :stupid: Lange Rede, kurzer [dp="MakeUpd"]Klick[/dp]. |
Re: Patches programmieren
@alci und Mathias: Ja genau sowas meinte ich.
Vielen Dank für den Link ich gugge mal ob ich was brauchbares finde. ;) |
Re: Patches programmieren
Ich kann für nichts garantieren, aber du könntest beide EXEn als TextFiles öffnen, die exakte Position im Str angeben, bei der sich neu und alt unterscheiden und die Änderung, als Record abspeichern und dann im Patch selbst diese Datei wieder auslesen und Änderungen durchführen lassen.
|
Re: Patches programmieren
Zitat:
|
Re: Patches programmieren
Hi,
es sei aber doch eerwähnt, dass, selbst wenn man vom Einspielen von Patches, oder dem Patchen eines Programmes spricht, heutzutage doch meistens gemeint ist, dass ein Programm (und um Himmels Willen nicht der User manuell), Dateien austauscht. Grüsse Woki |
Re: Patches programmieren
Zitat:
Das mit nem Hexeditor sollte aber eigentlich auch gehen, oder ? |
Re: Patches programmieren
Das ganze muss nicht sein wenn man die Ressourcen aus DLL's läd!
|
Re: Patches programmieren
wenn man viel auslagert sind die einzelenen dateien kleiner, dann muss man nur die änderungen weitergeben.
problem beim patchen ist wenn sich z.b. die größe einer exe ändert,dann wirds komplizierter. Wollte mal so einen patchersteller schreiben wenn ich in den nächsten tagen mal zeit habe mach ich das mal :) |
Re: Patches programmieren
Zitat:
Fakt ist: sobald sich ein Programm aendert, muss man die Aenderungen zum Kunden bringen. Ob ich eine DLL patche oder eine EXE macht keinen Unterschied ;) Greetz alcaeus |
Re: Patches programmieren
DLL patchen ginge bei mir auch nicht weil ich keine DLL's verwende. Und die Endanwendung ist mittlerweile 3500KB groß, wenn ich da jedesmal die richtige EXE austauschen müsste... ;)
|
Re: Patches programmieren
Hallo,
da ich das grad für mein aktuelles Projekt umgesetzt habe, hier mal, wie ich das gelöst habe. Ich habe ein Zusatzprogramm (Updater.exe) geschrieben, daß aus dem Hauptprogramm aufgerufen wird. Das Hauptprogramm wird dann geschlossen (eine offene Datei zu patchen wird schwer). Das Update-Programm läd sich dann von meiner Homepage das aktuelle Update herunter, das kumulativ ist. Alle relevanten Daten werden dann getauscht und das Update-Programm ruft dann das Hauptprogramm wieder auf und beendet sich selber. Das ganze habe ich noch mit einer Art Scriptsprache versehen, falls doch noch andere Programme vor dem Hauptprogramm ausgeführt werden müssen, oder falls andere Dateien in anderen Verzeichnissen kopiert werden müssen. Jetzt muß ich mir nur noch überlegen, wie ich das mache, wenn ich das Updater-Programm updaten will. Vermutlich prüfe ich noch vor dem Aufruf des Updater-Programms, ob auch dort eine neue Version existiert und tausche es vor dem Aufrufen auf. Ist zwar kompliziert und mit viel Arbeit verbunden, aber bei klappt das einwandfrei. Ablauf: * User oder Programm prüft auf Updates * Update wird gefunden und das Updater-Programm wird geprüft, ob auch hier neue Updates vorliegen * Wenn ja -> aktuelles Updater-Programm wird heruntergeladen * Hauptprogramm ruft Updaterprogramm auf und beendet sich selbt * Updater-Programm läd Dateien herunter und aktualisiert * Updater-Programm ruft wieder Hauptprogramm (oder andere) auf und beendet sich selbst Symantec macht das mit Live-Update ganz ähnlich. Die Scriptdatei sieht bei mir z.B. so aus:
Code:
Das Wort <UPDATE> leitet das Update ein
<UPDATE>
<FILES> /update/ramdefrag/onlineupdate/;ram_defrag.zip;[PROGRAMDIR];true </FILES> <START> [PROGRAMDIR]ram_defrag.exe;0 </START> </UPDATE> Unter <FILES> stehen die Dateien, die heruntergeladen werden, und wohin entpackt werden soll. "True", ob überschrieben werden soll, oder nicht. Unter <START> alle Programme, die danach wieder aufgerunfen werden sollen. Die Zahl dahinter in Sekunden wielange gewartet werden soll, bis sich das Updateprogramm dann selbst beendet. Bei weiteren Fragen - frag ;) |
Re: Patches programmieren
Zitat:
Wenns wie bei mir 3,5 MB sind, was hast du für nen Traffic im Monat ? |
Re: Patches programmieren
Zitat:
Im Prinzip machen beide das gleiche. Nur ein normaler Patch erwartet eine ganz bestimmte Version, weil er logischerweise immer nur zwei Dateien miteinander vergleichen kann. Bitte nicht falsch verstehen. Der Patch selbst kann meinetwegen 1000 Dateien aktualisieren. Aber bei jeder dieser 1000 Dateien wird immer nur die zu patchende alte Version (1.0, bspw.) mit der neuen 2.0 verglichen. Wer also bereits die Version 1.1 benutzt, kann den Patch 1.0->2.0 nicht verwenden, bzw. bestimmte Dateien, die nicht der erwarteten Version entsprechen, werden nicht aktualisiert. Und da kommt das kumulative Update, das alle Updates enthält. Kennt man ja auch von den IE-Sicherheitsupdates. Meist reicht es, das jeweils aktuellste Update zu ziehen. Die vorher veröffentlichten sind mit drin. Darum kann so ein Update von einem User angewendet werden, der eine vollkommen ungepatchte Version hat. Und es kann ein User anwenden, der die vorher veröffentlichten Patches schon drauf hat. In solchen Fällen werden die Dateien, die sich innerhalb der einzelnen Versionen verändert haben (1.0->1.1->1.2->...->2.0) komplett reingepackt, weil eben der gezielte Vergleich zwischen Version X und 2.0 nicht möglich wäre, ohne Benutzer anderer Versionen auszuschließen. |
Re: Patches programmieren
zum erstellen von patches nehme ich derzeit Patchmaker (s kumulative Update), ist sogar kostenlos.
![]() Rauf auf den Webserver damit. Ein Kleines updateprogramm fragt mit einem code an, ob eine neue version vorhanden ist. wenn ja wird das entsprechende File geladen. Die Frage ist jetzt nur, wie vergibt man diese prüfcodes. Das kann a) die Anwendung mit der Version sein, davon einen md5 machen b) wie a) nur dass noch lizenz (Free,Privat,Pro) unterschieden wird, wenn man bestimmte Patches nur speziellen Lizenznehmern gönnen will/darf. Man kann hier auch einen Berechtigungs-key einbinden, der nur 1 Jahr gilt. b) md5 über jede Datei und diese einzeln auf dem Server abfragen bei a) und b) muss das update-programm den code irgend wo herholen und bei dem update muss dieser auch aktuallisiert werden. |
Re: Patches programmieren
Zitat:
Im März hatte ich 5125033 KB bei knapp 130.000 Hits - war aber teilweise schon das 10-fache :wink: Zum prüfen, ob eine aktuelle Version vorliegt: In meinem Programm gibt es bestimmte Variablen, die mit jeder neuen Version geändert werden. z.B.
Delphi-Quellcode:
usw...
ProgVersion := '2.80';
ProgRevision := 'Alpha2'; ProgCopyrightYear := '©2002 - 2005'; ProgCopyrightFirm := 'Catbytes Software'; ProgCopyrightAuthor := 'Armin Cristalli'; ProgName := 'RAM Defrag'; ProgType := 'SHAREWARE-VERSION'; Diese Variablen nutze ich dann im ganzen Programm - sei es um die Caption zu erzeugen oder eben die Version zu prüfen. So vermeide ich auch, daß irgendwo noch eine alte Versionsnummer im Programm steht. Auf dem Server liegt dann eine Textdatei, in der die Version auf dem Server gespeichert wird. Die wird per "HttpCli" aus den FPiette-Komponenten runtergeladen und verglichen. Stimmen beide überein, ist die Version noch aktuell - wenn nicht, startet eben auf Wunsch der Download wie oben beschrieben. |
Re: Patches programmieren
Sicherer als so ein Versionsnummern-Vergleich ist aber allemal ein binärer Vergleich, so wie das dir mir bekannten Patchmaker machen. ;)
|
Re: Patches programmieren
Zitat:
Neben den von dir genannten Delphi Programm (update.exe) gibts auch noch andere Lösungen. Patchfactory ist z.B ein alternatives Tool. Kostet aber leider ein bischen :-( Aber alles in allem wurde ein Programm bislang noch nicht besprochen. Nehmen wir an, auf einem Webserver liegt ein Patch (also ein richtiges Patch, das nur die Unterschiede beinhaltet), welches eine Version 2.0 zu 3.0 updatet. Das stellt kein Problem dar. Was aber, wenn der Benutzer noch selbst Version 1.0 nutzt, und in einem Schritt auf Version 3.0 updaten will. Das vorliegende Patch ist für ihn sinnlos... MSI Installationsskripte bieten jedoch aúch ein Möglichkeit, dieses Problem zu lösen. Allerdings kriegt man das nicht mit Installshield Express hin, das bei Delphi Prof. beiliegt, sonder man braucht dazu schon die Vollversion oder Wise. Die Dinger kosten aber gleich ein Arsch voll Geld. Ich bastele gerade selbst an einer Lösung, wie man dieses Problem beheben kann. Das Ganze soll dann irgendwann in ![]() ![]() |
Re: Patches programmieren
Zitat:
![]() |
Re: Patches programmieren
Zitat:
|
Re: Patches programmieren
Ich wollte dich nicht bremsen, so war das nicht gemeint. Probiere ruhig! Nur bedenke bitte, dass die neuere Exe-Datei (oder generell die neue Dateiversion) kleiner oder auch größer als die alte sein kann. Ein Bytevergleich reicht also nicht. Position und evtl. Größe der unterschiedlichen Blöcke müsstest du also auch berücksichtigen, ... usw. usw.
Nicht zu vergessen, dass ein Bytevergleich u.U. ein "Vergleichsprotokoll" erzeugt, das um ein Vielfaches größer ist als die zu patchende Datei. Eine Komprimierung darf´s also auch noch sein. :stupid: |
Re: Patches programmieren
:shock: :pale:
Mal schaun. Aber afaik dürfte das die bessere Lösung sein, solange ungefähr die Hälfte der Exe gleich bleibt. |
Re: Patches programmieren
Zitat:
Das Problem, das man sich u.U. alte Dateiversionen einfängt, tritt IMHO nur bei Updates auf, die die zu ersetzenden Dateien komplett enthalten. Also keine Patches im Sinn des Wortes. Und da hast du dann natürlich Recht. In solchen Fällen wird nach der Versionsnummer geguckt. Wenn man dann als Entwickler merkt, dass man gar keine Versionsnummer benutzt hat, na ja ... :lol: |
Re: Patches programmieren
Bei BMPs und bei TXTs funktioniert es perfekt, aber ich habe noch ein Prob bei EXEn und WAVs. Mal sehen.
|
Re: Patches programmieren
Liste der Anhänge anzeigen (Anzahl: 1)
Bittesehr, funktioniert perfekt. Man muss halt immer zuvor schauen, ob es sich rentiert, einen Patch zu erstellen oder die komplette Datei weiterzugeben.
Mit WinRar kann man die Patches oft noch auf mehr als auf die Hälfte der Dateigröße verringern. Und wundert euch nicht, wenn es bei manchen Dateien ziemlich lange dauert, wenn ihr auf "Patch erstellen" klickt, schließlich werden die beiden Dateien byteweise verglichen. Es funktioniert übrigens mit ALLEN Dateitypen, nicht nur mit EXEn. |
Re: Patches programmieren
Zitat:
Zitat:
Zitat:
|
Re: Patches programmieren
Was erwartest du?
Ich bin 14, habe keine Vorerfahrung und hab das Teil in 4 Stunden geproggt, davon war viel Test. |
Re: Patches programmieren
Ich hab den PatchmakerV1.0. mal ausprobiert. Der Patch war so 3 MB bei einer 800 kB EXE. Nach dem Patchen war allerdings die gepatchte EXE verschwunden, während der Patch noch da war.
|
Re: Patches programmieren
Seltsam, ich hatte es auch mal probiert und es ging. Das Programm war so 600KB groß und der Patch 750KB.
|
Re: Patches programmieren
@Garfield: Meine Tests waren alle erfolgreich. ich hatte keine probleme. DIe alte datei wird übrigens nach dem patchen in die neue umbenannt.
Ich sagte auch nicht, dass es ein besonders gutes Programm ist. Ich wollte nur zeigen, dass es funktioniert. |
Re: Patches programmieren
Zitat:
Zitat:
|
Re: Patches programmieren
Naja, ich habe zumindest wieder etwas gelernt. Danke an alle, die es getestet werden, und jetzt höre ich besser auf, hier zu posten, sonst werden die Mods wieder gaaanz sauer.
|
Re: Patches programmieren
Hi,
Such mal mit WinMerge alle unterschiede herraus die bei der neuen und alten Datei auftauchen wenn es nur ein paar byte sind kannst du ja locker n Patch schreiben der diese ändert. Dafür kann ich dir auch ein paar Zeilen Code zukommen lassen wenn du damit Probleme hast! Eigentlich seh ich da wenig Probleme dafür einen Patch zu coden! Greetz Boombuler |
Re: Patches programmieren
WinMerge? Kenn ich nicht. Ansonsten ist deine Idee wohl die gleiche, wie die, die ich in meinem Programm verwendet habe.
|
Re: Patches programmieren
Da das mit den anderen Patch Programmen doch nicht so gut geklappt hat, habe ich jetzt mal
![]() TRotzdem bin ich immer noch auf der Suche sowas selbst zu machen. Ist es nicht irgendwie möglich die einzelnen Bytes einer EXE zu verändern ? |
Re: Patches programmieren
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz