Announcement

Collapse
No announcement yet.

Patchengine schreiben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Patchengine schreiben

    Hallo !
    Ich möchte für meine eigenen Programme eine Patchengine schreiben die folgendermaßen aufgebaut ist:
    1.Vergleich von 2 meiner ExeDateien
    2.Eine weitere Exedatei erstellen die diese Unterschiede in die zu patchende Exe von mir reinschreibt

    Herzlichen Dank für eure Hilfe !
    Mit freundlichen Grüßen
    Zuletzt editiert von Gast_1; 31.03.2010, 13:21.

  • #2
    Hi,<BR><BR>
    Ich hab selbst mal ne Patch-Engine programmiert, ich weiß also wovon ich rede.. du musst nur folgende Probleme meistern:<BR>
    <B>1.</B> Du musst in eine Exe-Datei schreiben können ohne deren Lauffähigkeit zu beeinflussen.<BR>
    <B>2.</B> Du musst imstande sein eine Laufende Exe-Datei ohne Fehlermeldung zu öffnen.<BR><BR>
    Zu 1.: Das geht im Prinzip ganz einfach indem du die Information am Ende der Datei anhängst. Natürlich muss dabei die Größe der <B>WIRKLICH AUSFÜHRBAREN</B> Exe bekannt sein. (Entweder als Konstante <B>IN</B> der Exe oder du löst das Problem auf eigene Art und Weise)<BR>
    Zu 2.: Das löst du ganz einfach mit indem du alle (Schreib- und Leserechte) freigibst.<BR><BR>
    Den eigentlichen Aufbau wie die Patch-Information gespeichert werden soll musst du dir schon selbst überlegen.. aber wenn du willst kann ich dir da auch noch Tips geben...<BR><BR>
    Viel Glück, Motz

    Comment


    • #3
      Hmm, so ganz kann ich deinem Text nicht folgen, nicht weil er falsch ist, sondern weil ich keine genaue Vorstellung habe, wie ich das meistern könnte. Wenn ich z.B. die Exedatei erstellen will, wie mache ich z.B. das ? Ich habe ja keinen Compiler in dem Programm.
      Danke für Deine Hilfe !!!
      Schöne Grüße
      Zuletzt editiert von Gast_1; 31.03.2010, 13:21.

      Comment


      • #4
        Hi

        Zu 2.), ich glaube kaum das Du in der Lage sein wirst eine LAUFENDE, also ausgeführte, EXE patchen kannst. Auf das EXE-File hat eine externe EXE keine Zugriffsrechte. Es bleibt also NUR die EXE im Speicher, dynamisch, zu patchen. D.H. jedesmal nachdem die originale EXE geladen wurde muß das Speicherabbild gepatcht werden. Wobei man bei dieser Methode nicht mehr von "patchen" reden kann.

        Anders ist es wenn die EXE noch nicht läuft, das File extern modifiziert wird und erst DANN gestartet wird. In diesem Fall stellt die EXE-Datei nur eine ganz normale binäre Datei dar.

        Gruß Hage

        Comment


        • #5
          Hi,<BR><BR>
          Erst mal zu Hagen.. das man eine Laufende Exe-Datei nicht patchen kann ist mir schon klar, aber ich gehe mal davon aus das der Patch nur aus <B>EINER</B> Datei bestehen soll. Das heißt in dieser einen Datei soll sowohl der Patch, der die Patch-Information verarbeiten soll selbst, als auch die Patch-Information enthalten sein. Damit er also seine Programme jetzt patchen kann muss sich die Exe-Datei SELBST öffnen um die Patch-Informationen auslesen zu können. Das hab ich damit gemeint.<BR><BR>
          Julius: Ich hab das damals so gemacht, ich hab ein Programm geschrieben das den Patch darstellt, hab die Exe-Datei davon erstellt und mir die Grösse angesehen. Die Grösse brauchst du um sie z.B. als Konstante im Patch zu speichern. (zumindest hab ich das so gemacht) und dann das Programm mit der Konstanten dann nochmal erstellen. Diese Exe-Datei integrierst du dann per Resource in deiner Patch-Engine. Wenn du dann einen Patch erstellst speicherst du zuerst den Patch aus der Resource auf die Festplatte und hängst dann die Patch-Info an.<BR><BR>
          Ich hoffe das war verständlich...<BR>
          Viel Glück, Motz

          Comment


          • #6
            Also erstmal danke an euch beide !
            So wie Motzi das geschrieben hat (zu 2.) war das von mir auch gemeint !
            zu Motzi: d.h., ich soll ein proggie coden, dass noch keine patchinfos hat,logisch (mein mainproggie zum erstellen von nem patch).dadrin ist ne konstante mit der größe von der 2.exe(der eigentliche patch) und als resource an die erste ist die zweite exe drangehängt. bis dahin kapier ich es noch halbwegs (weiß noch nicht wie ich ne exe als resource in mein mainproggie kriege, habe das bisher immer nur mit sounds gemacht).
            Und jetzt ?
            Echt, super herzlichen Dank für eure Bemühungen ! (ich hoffe dass ich nicht allzu blöde fragen stelle
            Schöne Grüße
            Zuletzt editiert von Gast_1; 31.03.2010, 13:21.

            Comment


            • #7
              Hi,<BR><BR>
              nicht ganz... also... 2 Proggies:<BR><BR>
              1.) Hauptprogramm:<BR>
              Mit diesem Programm werden die Patches erstellt. Das Prog das den Patch darstellt ist als Resource in diesem Programm enthalten (zum erstellen der Resource siehe unten..) Um schließlich den Patch zu erstellen musst du den Patch (die Resource) auf die Festplatte speichern und die Patchinformation <B> an diese Datei ANHÄNGEN</B>. Am besten vergleichst du vorher die 2 Dateien von denen du den Patch erstellen willst, speicherst die Informationen vorübergehend in einem MemoryStream und erstellst dan einfach einen FileStream in den du ResourceStream und MemoryStream hineinkopierst.<BR><BR>
              2.) Patch:<BR>
              Dieses Programm ist der eigentliche Patch der die Patchinformationen verarbeiten kann. Um jedoch an die Patchinformation heranzukommen (sind schließlich am <B>Ende</B> er Datei angehängt) muss die Größe der Datei bekannt sein. <B>Und zwar in DIESEM Programm!!</B> Das heißt, die Größe muss in <B>DIESEM</B> Programm gespeichert sein!<BR>
              zB:<BR><FONT Face = "Courier New" Size = 4>
              <B>const</B> MAX = 10240;<BR>
              <B>var</B><BR>
              &nbsp;&nbsp;Patch: TFileStream;<BR>
              &nbsp;&nbsp;PatchInfo: TMemoryStream;<BR>
              &nbsp;&nbsp;Buffer: array [1..MAX] of Char;<BR>
              &nbsp;&nbsp;ReadCount: Integer;<BR>
              <B>begin</B>
              &nbsp;&nbsp;Patch := TFileStream.Create(Application.ExeName, fmOpenRead or fmShareDenyNone);<BR>
              &nbsp;&nbsp;PatchInfo := TMemoryStream.Create;<BR>
              &nbsp;&nbsp;Patch.Position := PatchFileSize; {Hier brauchst du die Größe der Datei. Ich hab hier im Beispiel die Konstante eben PatchFileSize genannt}<BR>
              &nbsp;&nbsp;<B>while</B> Patch.Position < Patch.Size <B>do</B><BR>
              &nbsp;&nbsp;<B>begin</B><BR>
              &nbsp;&nbsp;&nbsp;&nbsp;ReadCount := Patch.Read(Buffer, MAX);<BR>
              &nbsp;&nbsp;&nbsp;&nbsp;PatchInfo.Write(Buffer, ReadCount);<BR>
              &nbsp;&nbsp;<B>end</B>;<BR>
              <B>end</B>;</FONT><BR>
              PS: Um die Größe des Patches zu reduzieren kannst du das Programm entweder nur mit API-Befehlen programmieren (Vorteil: sehr klein, ca. 50-60kb, Nachteil: sehr kompliziert) oder einfach packen (zB: mit UPX... Vorteil: wenig Aufwand, Nachteil: große Datei im Gegensatzt zu API)<BR><BR>
              Anhängen einer Binär-Resource:<BR>
              Du öffnest einen ASCII-Editor (z.B. Notepad) und gibst folgende Zeile ein:<BR>
              100 RCDATA "Patch.exe"<BR>
              100: Das ist die ID. Über diese Nummer kannst du die den Patch nachher aus der Resource laden.<BR>
              RCDATA: Das ist der Dateityp (Binär)<BR>
              "Patch.exe": erklärt sich von selbst... (Vorraussetzung ist natürlich dass die Datei existiert..)<BR>
              Das ganze speicherst du unter <I>Patch.rc</I> ab und compilierst es mit dem Resourcen-Compiler <I>brc32.exe</I> (befindet sich unter <I>Delphi/Bin</I>)<BR>
              Falls vorhanden kann man das ganze natürlich um einiges einfacher mit dem Resource-Workshop machen..<BR>
              logischerweise muss die Resource auch ins Programm eingebunden werden.. {$R Patch.res}<BR>
              geladen wird der Patch dann mit: TResourceStream.CreateFromID(HInstance, 100, RT_RCDATA)<BR><BR>
              Viel Glück, Motzi<BR><BR>
              PS: Ich hab ein englisches Tutorial über SFX Archive für Setups. Im Prinzip funktioniert es nach demselben Schema, aber allzu viel hat es mir ehrlich gesgagt nicht gebracht. Wenn du willst kann ich es dir schicken

              Comment


              • #8
                Ach, ich arbeite jetzt schon voll lange an dem Ding, könntest Du mir nicht doch netterweise mal einen Source mit den wichtigstens Sachen drin schicken , Motzi ?!?!?
                Das wäre echt super nett ! Ich kenne das Problem des Sourcecode-Geheimhaltens, da man natürlich stolz auf das ist, was man sich selbst in aller Mühe zusammengebastelt hat, aber das wäre echt suuper nett von Dir !!
                Schöne Grüße
                Zuletzt editiert von Gast_1; 31.03.2010, 13:21.

                Comment


                • #9
                  Naja... also ich weiß nicht... :-)<BR>
                  Klar kannst du den Source haben.. du musst mir nur etwas genauer sagen was du brauchst oder wo dein Problem liegt, da der Source ca. 800 Zeilen umfasst.

                  Motzi

                  PS: Du kannst mich auch über mein Mail ([email protected]) erreichen oder über ICQ (UIN: 60806961) kontaktieren. Damit müssen größere Diskussionen nicht den Umweg übers Forum machen

                  Comment


                  • #10
                    Ok, alles klar !
                    Danke Motzi !!!

                    Schöne Grüße
                    Zuletzt editiert von Gast_1; 31.03.2010, 13:21.

                    Comment


                    • #11
                      Hi!<b>
                      Ich bin auch ein begeisterter Intressent von Patchengines und hätte da eine winzige Frage: <h4>Wie kann ich an den ausführbaren Patch Patchinformationen hinten dranhängen? Wenn ich einfach die Informationen an die Exe dranhäng, dann hat die Exe ja ein ungültiges Format! Wie ist es also möglich Patchinformationen hinten an den Patch.exe dranzuhängen ohne die Exe-Format-Datei zu zerstören???</h4><b>
                      Bitte um Erklärung! Dringend!!

                      Comment


                      • #12
                        Schau dir mal die Jedi Code Library an (http://delphi-jedi.org).
                        JclPeImage kann was du brauchst. Speziell die Debug Extension von Petr Vones zeigt was so alles moeglich ist.
                        Dort wird ein Exe generiert und das komprimierte MAP-File als Segment angetackert und im Programm dann auf dieses Segment zugegriffen.
                        Das Ganze dient zur Generierung eines Stack-Trace mit Zeilennummern bei Exceptions, aber im Prinzip ist das das Gleiche was Du machen willst. Daten an ein Exe anfuegen und im Programm darauf zugreifen

                        Comment


                        • #13
                          <h3>DANKE!!!! Super!!!!</h3&gt

                          Comment


                          • #14
                            Hi,<p>
                            ich weiß, ich komme etwas spät!<br>
                            Ich habe aber noch eine Anmerkung: Das mit dem Anhängen ist die eine Sache, wie sieht es aber mit dem Algorithmus aus, der die Binärdateien nach übereinstimmenden Segmenten überprüft? Um das Patch nicht zu groß zu machen, müsste er wohl ziemlich genau sein. Das allerings geht doch dann ne halbe Ewigkeit, oder?<br>
                            Wer kann mir also mal so einen Algorithmus zeigen. Das interessiert mich.<p>
                            Gruß,<br>
                            Marku

                            Comment

                            Working...
                            X