Patches für Programme



  • Ich würde gerne wissen wie das mit den Patches funktioniert, habe mir zwar bereits ein paar Gedanken dazu
    gemacht, aber ich bin dabei auf einige Probleme gestoßen.
    Ich dachte mir man schreibt nen Programm welches die alten Binaries durchgeht und mit den neuen
    vergleicht und die Abweichungen speichert, diese werden, dann irgendwie in ner Datei gespeichert
    und der Installer liest die Änderungen aus und nimmt sie an den Binaries vor.

    Aber was, wenn man ne Version patchen möchte die nicht auf dem aktuellen Stand ist sondern viel
    Älter, dann muss man die Zwischenschritte ja irgendwie auch speichern.

    Und wie kann man in binaries schreiben, damit das ganze nacher noch funktioniert?

    Ich habe mit google leider nicht gefunden und würde mich über ein paar links, oder Erklärungen wie das funktioniert freuen 🙂



  • Ist im Prinzip wie du sagtst. Die Unterschiede werden in einer seperaten Datei oder im Anhang an das Patch-Tool gespeichert. Beim Ausführen werden diese Daten extrahiert und in der entsprechenden Binary gepatcht.

    http://www.gnu.org/software/patch/patch.html



  • das Thema hatten wir doch schon mehrfach 🙄 Ist vielleicht was für die FAQs, wenn wir mal eine vernünftige Sammlung an Tools haben 🙂

    Ja, du gehst die alte und die neue Datei (egal ob Quellcode oder Binärdatei, du musst nur auf den Lesemodus achten 🙄) byte für byte durch, merkst dir die Position, wo es unterschiede gibt und führst dann einfach die Änderungen in der Datei durch, die du patchen willst. Aus dem Grund erwarten die meisten Patches eben bestimmte Versionen oder enthalten intern noch zu installierende Patches.



  • Ok, also die beiden Programme von der GNU Seite sind zu groß um sich da
    einzuarbeiten in der Zeit kann ich auch gleich von vorne anfangen und
    experimentieren (will ja nix fertiges nehmen, sonst wäre es ja ok :))

    Bin mir jetzt nicht sicher, ob ich es richtig verstanden habe, daher mal nen Beispiel

    Version1.0

    4D 3F 43 12 FF 34 56 67 9A 1B
    

    Version 2.0

    4D 3F 43 13 5B 7C 8A FF 34 56 67 9A 1B
    

    -öffne Datei1 und Datei2
    -1. Byte einlesen und vergleichen -> gleich
    -2. Byte einlesen und vergleichen -> gleich
    -3. Byte einlesen und vergleichen -> gleich
    -4. Byte einlesen und vergleichen -> verschieden -> speichern von 4.Byte = 13
    -5. Byte einlesen und vergleichen -> verschieden -> speichern von 5.Byte = 5B
    -6. Byte einlesen und vergleiche -> verschieden -> speichern von 6.Byte = 7C
    ...

    Mein Grundgerüst scheitert ab da wo zusätzliche Zeichen eingefügt werden, so würde
    ja der Rest des Binaries verschieden sein, da die Bytes ja verschoben wurden.

    Wie kann ich das lösen? Ich weiß ja nicht ob das 8.Byte aus Datei1 und das 11.Byte
    aus Datei2 das gleiche symbolisieren und nur zufällig den gleichen Wert haben.



  • speicher am besten am Anfang gleich die Länge der 2. Version und fahr dann eben fort mit 11=...



  • Wie meinst du das genau? Ist mir grad irgendwie nicht so ganz klar 😕

    Ich habe heute Mittag mal kurz Zeit gehabt um mir die Quellcodes von dem Difftool etwas näher
    anzuschauen und in der Datei analysis.c bin ich auf folgenden Kommentar gestoßen: "The basic algorithm is described in:
    "An O(ND) Difference Algorithm and its Variations", Eugene Myers,
    Algorithmica Vol. 1 No. 2, 1986, pp. 251-266;
    see especially section 4.2, which describes the variation used below.
    Unless the --minimal option is specified, this code uses the TOO_EXPENSIVE
    heuristic, by Paul Eggert, to limit the cost to O(N**1.5 log N)
    at the price of producing suboptimal output for large inputs with
    many differences.

    The basic algorithm was independently discovered as described in:
    "Algorithms for Approximate String Matching", E. Ukkonen,
    Information and Control Vol. 64, 1985, pp. 100-118. "

    Ich habe bei Amazon mal nach diesen Büchern oder den Autoren gesucht, aber nichts dazu gefunden.
    Aber mit ner ungenauen Suche bzw. nem ungenauen Vergleich (natürlich zu gunsten der neueren Version) die Dateien abzugleichen,
    leuchtet mir irgendwie ein, jetzt müsste man nur noch wissen wie so etwas funktioniert





  • das GNU diff Tool ist glaube ich eh nicht für Binarys geeignet. Aber du könntest das Format so machen:

    dateia: AA BB CC DD EE
    dateib: AA BB CC DD EE FF 11
    diff:
    length=7
    5=FF
    6=11
    

    im patch Tool erzeugst du dann eben ein Array der Länge 7 und liest alle bytes aus dateia, bis irgend ein Datei in der diff Datei anders angegeben wurde.



  • Bei der Methode stoße ich ja auf das oben genannte Problem. Anscheinend gibt es nur wenige die so etwas können, bei codeproject.com
    verwenden die undokumentierte API Funktionen von Windows dafür.
    Ich denke ich werde auch zu dieser Methode greifen 🙂

    Scherfgen benutzt wohl auch einen einfachen vergleich



  • bei codeproject.com verwenden die undokumentierte API Funktionen von Windows dafür.

    gib mal links auf die artikel bitte 🙂





  • kingruedi schrieb:

    das GNU diff Tool ist glaube ich eh nicht für Binarys geeignet.

    Stimmt, dafür verwendet man xdelta. 🙂



  • @SirLant
    nein, du stößt nicht auf das Problem, du scheinst mich nur nicht zu verstehen



  • Dann erklärs mir doch noch einmal 🙂



  • das ist ja nur eine Frage der Syntax deines diff-Formats, du kannst ja die Informationen so abspeichern

    Byte=10 Insert=FF AA

    dann weisst du ja, dass du einfach nur zwei bytes an der Position 10 einfügen sollst. Replace nimmst du dann wenn du ersetzen willst usw.



  • Habe jetzt lange darüber nach gedacht und glaube ich habe dich jetzt verstanden.

    Bei meinem Beispiel würde das File dann so aussehen

    Version1
    4D 3F 43 12 FF 34 56 67 9A 1B

    Version2
    4D 3F 43 13 5B 7C 8A FF 34 56 67 9A 1B

    Das Patchfile

    Byte = 4; Insert = 13 5B 7C 8A FF 34 56;

    Also das Programm stoppt dort wo der erste Unterschied ist und liest anschließend
    Byte für Byte das sich unterscheidet in das Patchfile, bis die Bytes wieder
    gleich sind.

    Meinst du das so?



  • ich würde bei Insert einfach nur einfügen und am Ende einfach mit der normalen Datei fortfahren. Replace nimmt man dann fürs ersetzen oder so



  • Aber wie unterscheide ich wann ich einsetzen oder ersetzen soll, beim erstellen der Datei (beim patchen selber ist ja klar, da stehts dann in der datei 😃 )



  • hmm, du könntest suchen ob das Muster was folgt innerhalb der nächsten n Bytes nocheinmal vorkommt 🙂



  • SirLant schrieb:

    Aber wie unterscheide ich wann ich einsetzen oder ersetzen soll

    Mach doch 2 Läufe.
    Beim 1. Lauf wird nur eingefügt bzw. gelöscht.
    Beim 2. Lauf wird dann aus eingefügt und danach gelöscht ein ersetzen.
    Also quasi eine Optimierung 😉


Anmelden zum Antworten