Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi File patchen (https://www.delphipraxis.net/132027-file-patchen.html)

kuba 4. Apr 2009 19:25


File patchen
 
Hallo,

ich möchte in einer Datei eine HEX-Zeichenkette finden und durch eine andere ersetzen.
Gibt es da nicht eine einfache Möglichkeit ? Kann mir jemand einen Hinweis geben (am besten Codebeispiel) ?

KUBA

mr_emre_d 4. Apr 2009 20:03

Re: File patchen
 
Wenn du fragst "gibt es keine einfachere Möglichkeit" heißt es, dass du schon eine Möglichkeit hast --> Poste die mal. Ich kann leider nicht :glaskugel:

Noch ne Frage: Was meinst du mit Datei ? Windows Executables ?
Falls ja, dann wird das umständlich, wenn die zu ersetzende Zeichenkette kürzer ist als die Neue, denn die Section im PE-Header muss dann eben angepasst werden!

MfG

Meflin 4. Apr 2009 20:08

Re: File patchen
 
Zitat:

Zitat von mr_emre_d
Wenn du fragst "gibt es keine einfachere Möglichkeit" heißt es, dass du schon eine Möglichkeit hast

Er frägt ja auch nur nach einer einfachen :stupid:

FileSeek, Fileread, FileWrite, Blockread und BlockWrite könnten weiterhelfen - aber wie schon erwähnt, ala "Suchen und Ersetzen" wirds je nach Dateityp nicht unbedingt zum gewünschten Ergebnis führen.

kuba 4. Apr 2009 20:16

Re: File patchen
 
Hy,

bisher habe ich nur Textdateien ausgelesen, jetzt will ich den ntldr patchen, und zwar so:

search for the Hex value "CD 16 0F 85 09." When the value is located, replace it with "CD 16 90 90 90." Now when you reboot, press f8 for safe mode, you will not be able to select any options on the menu.

Da ich diese Geschichte in mein Softwarepaket integrieren will benötige ich "Examplecode"

kuba

mr_emre_d 4. Apr 2009 22:01

Re: File patchen
 
TmpCode: (keine Suche)
Delphi-Quellcode:
var
  F: File of Byte;
begin
  AssignFile( F, 'C:\Beispielsdatei.beispielsendung' );
  //-- wenn datei existiert, dann resetten:
  Reset( F );
  //-- wenn es sie nicht gibt, kann nichts resettet werden -> erstellen (überschreiben):
  Rewrite( F );
  //-- Zu einem bestimmten Byte gehen (Offset):
  Seek( F, Offset );
  //-- Folgende zwei Instruktionen erhöhen den Offset um jeweils >Anzahl der Bytes, die eingelesen werden sollen<:
  //-- Lesen:
  BlockRead( F, Variable in die eingelesen werden soll, Anzahl der Bytes die eingelesen werden sollen );
  //-- Schreiben:
  BlockWrite( F, .. siehe BlockRead
  //-- Wichtig -> schließen nie vergessen, da Änderungen sonst nicht angenommen werden:
  CloseFile( F );
end;

kuba 4. Apr 2009 22:34

Re: File patchen
 
Hallo,

ich finde bereits die Sequenz im ntldr, die Funktion ScanFile habe ich hier im Forum gefunden:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  thepos: integer;
begin
  version := '';
  thepos := ScanFile('c:\ntldr',(#205+#22+#15+#133+#9),true);
  if thepos = -1 then showmessage('Code gefunden');
end;
KUBA

mr_emre_d 4. Apr 2009 22:37

Re: File patchen
 
Warum schreibst du dir diese Routinen nicht selbst ?

himitsu 4. Apr 2009 22:42

Re: File patchen
 
Code:
if thepos = -1 then showmessage('Code [color=#ff0000][b]NICHT [/b][/color]gefunden');

kuba 4. Apr 2009 22:44

Re: File patchen
 
Zitat:

Zitat von mr_emre_d
Warum schreibst du dir diese Routinen nicht selbst ?

Die Routine ScanFile ?

Wozu das Rad zweimal erfinden, ich entwickle meine Software wie jeder andere Programmierer unter zuhilfenahme von Komponenten und bereits bestehenden Public Domain Auszügen.

Mit Binären Dateien habe ich bisher noch nicht gearbeitet, daher meine Frage hier im Forum.

KUBA

kuba 4. Apr 2009 22:47

Re: File patchen
 
Zitat:

Zitat von himitsu
Code:
if thepos = -1 then showmessage('Code [color=#ff0000][b]NICHT [/b][/color]gefunden');

stimmt, Mist :wall:

KUBA

jaenicke 4. Apr 2009 23:02

Re: File patchen
 
Du musst das doch nur exakt wie in ScanFile schon gezeigt machen. Nur eben statt nur suchen ggf. auch ersetzen. :gruebel:

Wobei ich mich allerdings frage was für einen Sinn das hat. Außer um einen Virus zu schreiben. Denn schließlich bringt das ja keinerlei Vorteil für die Sicherheit oder Benutzung des Systems, verhindert aber ggf. die Reparatur des Systems.

kuba 4. Apr 2009 23:16

Re: File patchen
 
Zitat:

Zitat von jaenicke
Du musst das doch nur exakt wie in ScanFile schon gezeigt machen. Nur eben statt nur suchen ggf. auch ersetzen. :gruebel:

Wobei ich mich allerdings frage was für einen Sinn das hat. Außer um einen Virus zu schreiben. Denn schließlich bringt das ja keinerlei Vorteil für die Sicherheit oder Benutzung des Systems, verhindert aber ggf. die Reparatur des Systems.

Es ist zur Einrichtung eines KIOSK PC gedacht, dieser darf nicht durch Tastatureingaben in der Startphase unterbrochen werden ! Der abgesicherte Modus ermöglicht weitreichende Manipulationsmöglichkeiten um das System zu kompromittieren.

Der KIOSK PC läuft in einer virtuellen Maschine, daher muss F8 ausser Kraft gesetzt werden !

Die Information mit der F8 Taste kommt selbstverständlich von Microsoft und ist eigentlich nicht für Virenhersteller gedacht.

Die Reparatur des System erfolgt ggf. durch Barts PE :zwinker:

KUBA

jaenicke 4. Apr 2009 23:43

Re: File patchen
 
Zitat:

Zitat von kuba
Der abgesicherte Modus ermöglicht weitreichende Manipulationsmöglichkeiten um das System zu kompromittieren.

Aber nur, wenn kein Administratorpasswort usw. gesetzt ist, denn sonst kommt man erst gar nicht ins System hinein...

Trotzdem: es ist wie gesagt ja eigentlich fast nichts zu ändern im Vergleich zu dem verlinkten ScanFile. :gruebel:
Hier mal eine Version, die auch für Delphi 2009 eine byteweise Ersetzung mittels AnsiStrings zulässt. 3 Zeilen und ein Parameter sind neu und eine Zeile geändert, sonst nur String durch AnsiString und PChar durch PAnsiChar ersetzt.
Delphi-Quellcode:
function ReplaceInFile(const FileName, SearchString, NewString: AnsiString;
  CaseSensitive: Boolean): Longint;
  { returns position of string in file or -1, if not found }
const
  BufferSize = $8001; { 32K+1 bytes }
var
  pBuf, pEnd, pScan, pPos: PAnsiChar;
  filesize: LongInt;
  bytesRemaining: LongInt;
  bytesToRead: Integer;
  F: file;
  SearchFor: PAnsiChar;
  oldMode: Word;
begin
  Result := -1; { assume failure }
  // NEW (first line): if length of string to search and new string does not match, cancel.
  // Of course one could move the rest of the file accordingly instead.
  if (Length(SearchString) <> Length(NewString))
    or (Length(SearchString) = 0) or (Length(FileName) = 0) then Exit;
  SearchFor := nil;
  pBuf     := nil;

  { open file as binary, 1 byte recordsize }
  AssignFile(F, FileName);
  oldMode := FileMode;
  FileMode := fmOpenReadWrite;   { NEW: access to read and write }
  Reset(F, 1);
  FileMode := oldMode;
  try
    { allocate memory for buffer and pchar search string }
    SearchFor := StrAlloc(Length(SearchString) + 1);
    StrPCopy(SearchFor, SearchString);
    if not caseSensitive then { convert to upper case }
      AnsiUpper(SearchFor);
    GetMem(pBuf, BufferSize);
    filesize      := System.Filesize(F);
    bytesRemaining := filesize;
    pPos          := nil;
    while bytesRemaining > 0 do
    begin
      { calc how many bytes to read this round }
      if bytesRemaining >= BufferSize then
        bytesToRead := Pred(BufferSize)
      else
        bytesToRead := bytesRemaining;

      { read a buffer full and zero-terminate the buffer }
      BlockRead(F, pBuf^, bytesToRead, bytesToRead);
      pEnd := @pBuf[bytesToRead];
      pEnd^ := #0;
       { scan the buffer. Problem: buffer may contain #0 chars! So we
         treat it as a concatenation of zero-terminated strings. }
      pScan := pBuf;
      while pScan < pEnd do
      begin
        if not caseSensitive then { convert to upper case }
          AnsiUpper(pScan);
        pPos := StrPos(pScan, SearchFor); { search for substring }
        if pPos <> nil then
        begin { Found it! }
          Result := FileSize - bytesRemaining +
            Longint(pPos) - Longint(pBuf);

          // NEW: replace it
          Seek(F, Result);
          BlockWrite(F, PAnsiChar(NewString)^, Length(NewString));

          Break;
        end;
        pScan := StrEnd(pScan);
        Inc(pScan);
      end;
      if pPos <> nil then Break;
      bytesRemaining := bytesRemaining - bytesToRead;
      if bytesRemaining > 0 then
      begin
       { no luck in this buffers load. We need to handle the case of
         the search string spanning two chunks of file now. We simply
         go back a bit in the file and read from there, thus inspecting
         some characters twice
       }
        Seek(F, FilePos(F) - Length(SearchString));
        bytesRemaining := bytesRemaining + Length(SearchString);
      end;
    end; { While }
  finally
    CloseFile(F);
    if SearchFor <> nil then StrDispose(SearchFor);
    if pBuf <> nil then FreeMem(pBuf, BufferSize);
  end;
end; { ScanFile }

kuba 5. Apr 2009 00:21

Re: File patchen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

vielen, vielen Dank !!!

Es funktioniert prima, anbei der "Patcher"

KUBA :cheers:

PS: winexec ersetzt durch FileSetReadOnly('c:\ntldr', False);

kuba 5. Apr 2009 00:24

Re: File patchen
 
Zitat:

Zitat von jaenicke
Zitat:

Zitat von kuba
Der abgesicherte Modus ermöglicht weitreichende Manipulationsmöglichkeiten um das System zu kompromittieren.

Aber nur, wenn kein Administratorpasswort usw. gesetzt ist, denn sonst kommt man erst gar nicht ins System hinein...

Aber der Computer befindet sich dann leider im "abgesicherten Modus" und nicht im "KIOSK-Modus" :thumb:

kuba

jaenicke 5. Apr 2009 00:29

Re: File patchen
 
Na hast du natürlich Recht.

Nur nebenbei: Kennst oder benutzt du eigentlich schon Windows SteadyState?
http://www.microsoft.com/windows/pro...s/default.mspx

Das hilft beim Einrichten eines solchen öffentlichen PCs ja sehr viel weiter und ist ja kostenlos.

kuba 5. Apr 2009 00:37

Re: File patchen
 
Zitat:

Zitat von jaenicke
Na hast du natürlich Recht.

Nur nebenbei: Kennst oder benutzt du eigentlich schon Windows SteadyState?
http://www.microsoft.com/windows/pro...s/default.mspx

Das hilft beim Einrichten eines solchen öffentlichen PCs ja sehr viel weiter und ist ja kostenlos.

Sicher, mein KIOSK-Release bietet auch sehr viel, wenn man mal ganz genau hinsieht - wenn nicht mehr !!

KUBA

PS: ist ja auch kostenlos :zwinker:

Luckie 5. Apr 2009 03:54

Re: File patchen
 
Ich hoffe du weißt den Benutzer auch daraufhin, dass du original Systemdateien manipulierst. Ich würde solch eine Software nämlich nicht installieren.

Die Muhkuh 5. Apr 2009 06:32

Re: File patchen
 
Hi,

wäre noch schön, wenn Du anstatt WinExec ShellExecute benutzt, WinExec ist mittlerweile veraltet.

jaenicke 5. Apr 2009 06:43

Re: File patchen
 
Dass WinExec veraltet ist, ist sicher richtig, schon seit 14 Jahren, aber wo steht hier im Thread etwas davon? :wiejetzt:

Die Muhkuh 5. Apr 2009 06:43

Re: File patchen
 
Er hat das Projekt angehängt und wenn man sich es anschaut, steht da WinExec drin :stupid:

jaenicke 5. Apr 2009 07:05

Re: File patchen
 
Das Projekt habe ich mir gar nicht angeschaut. Dann ist das natürlich richtig.

Leider gibt es eben immer noch einige Seiten im Internet, deren Autoren offenbar nicht die geringste Ahnung haben und WinExec weiterhin empfehlen...

Die Muhkuh 5. Apr 2009 07:07

Re: File patchen
 
Deswegen auch der Hinweis von mir ;-)

Mikescher 5. Apr 2009 11:03

Re: File patchen
 
Zitat:

Zitat von jaenicke
Leider gibt es eben immer noch einige Seiten im Internet, deren Autoren offenbar nicht die geringste Ahnung haben und WinExec weiterhin empfehlen...

Ich benutze zwar auch (weils alle sagen) ShellExecute aber was ist denn daran so schlimm eine veraltete Methode zu benutzen ? Es funktioniert doch und in der fertigen Exe sieht man es ja nicht mehr :!: Wo ist denn da das Problem :?:
MfG Mikescher

DeddyH 5. Apr 2009 11:04

Re: File patchen
 
Das Problem liegt darin, dass diese Routine in neueren künftigen Windows-Versionen evtl. gar nicht mehr oder nur noch als Dummy vorhanden sein könnte.

jaenicke 5. Apr 2009 11:24

Re: File patchen
 
Erstens das und zweitens ist es ein Sicherheitsrisiko worauf in der Dokumentation von MS auch hingewiesen wird...

Was WinExec in neueren Versionen macht ist CreateProcess aufzurufen, also warum sollte man das nicht gleich machen?

kuba 5. Apr 2009 21:22

Re: File patchen
 
Zitat:

Zitat von jaenicke
Erstens das und zweitens ist es ein Sicherheitsrisiko worauf in der Dokumentation von MS auch hingewiesen wird...

Was WinExec in neueren Versionen macht ist CreateProcess aufzurufen, also warum sollte man das nicht gleich machen?

ntldr patchen ist auch ein Sicherheitsrisiko, darauf möchte ich an dieser Stelle nochmal aufmerksam machen :mrgreen:

Zitat:

Zitat von Luckie
Ich hoffe du weißt den Benutzer auch daraufhin, dass du original Systemdateien manipulierst. Ich würde solch eine Software nämlich nicht installieren.

Darüber habe ich nochmal nachgedacht ! Ich habe gesehen, dass andere Hersteller Programme anbieten bei denen ein eigener Bootloader enthalten ist, dort wird nur der MBR auf der Festplatte geändert. Der MBR ist "genormt", während der "ntldr" eine Systemdatei von Microsoft ist. Warum die Information von Microsoft ? Eine Panne ?

KUBA

PS: danke nochmal für den Hinweis !!

Andreas13 26. Jan 2023 12:14

AW: Re: File patchen
 
Zitat:

Zitat von kuba (Beitrag 899346)
Hallo,
vielen, vielen Dank !!!
Es funktioniert prima, anbei der "Patcher"
...;

Hallo Community,
ich versuche den betagten "Patcher" (nof8_982.zip aus dem Jahr 2009) von Kuba zum Laufen zu bringen, aber der Code läßt sich selbst mit meinem recht alten XE5 (aus 2013) nicht kompilieren. :pale:
Hat jemand von Euch eine angepaßte Version davon?

Danke im Voraus!
Viele Grüße
Andreas

Klaus01 26. Jan 2023 13:10

AW: File patchen
 
.. das liegt an dem hier:

Delphi-Quellcode:
SearchFor := StrAlloc(Length(SearchString) + 1);
searchFor ist ein pAnsiChar
StrAlloc liefert ein pWideChar

vielleicht funktioniert es so:
Delphi-Quellcode:
SearchFor := pAnsiChar(StrAlloc(Length(SearchString) + 1));
Grüße
Klaus

Andreas13 26. Jan 2023 13:17

AW: File patchen
 
Vielen Dank, Klaus! :thumb: :-D
Das war's.

Viele Grüße
Andreas

Andreas13 26. Jan 2023 14:30

AW: File patchen
 
Ja das Programm läuft zwar (natürlich mit harmlosen Testdateien), aber es wird gar nichts gepatcht: Weder eine Exe, noch eine simple TXT-Datei. :(

Weiß jemand einen Rat?
Danke im Voraus!

Viele Grüße
Andreas

himitsu 26. Jan 2023 15:17

AW: File patchen
 
Zitat:

Zitat von Klaus01 (Beitrag 1517888)
vielleicht funktioniert es so:
Delphi-Quellcode:
SearchFor := pAnsiChar(StrAlloc(Length(SearchString) + 1));

Das mag vielleicht "erstmal" so halbwegs gehen, aber richtig ist es so
Delphi-Quellcode:
SearchFor := AnsiStrAlloc(Length(SearchString) + 1);
.

Außerdem noch StrPCopy zu StrPCopyA usw.

Andreas13 26. Jan 2023 16:26

AW: File patchen
 
Danke Himitsu, :thumb:
es wird schon besser!
StrPCopyA kennt XE5 noch nicht (oder vielleicht nicht mehr?), aber
ich habe:
Delphi-Quellcode:
StrPCopy(..)  durch  System.AnsiStrings.StrPCopy(..)
StrEnd(..)            durch  System.AnsiStrings.StrEnd(..)
StrDispose(..)        durch  System.AnsiStrings.StrDispose(..)
ersetzt und benutzt. Damit konnte ich eine TXT-Datei erfolgreich patchen, nicht jedoch eine EXE, auch nicht dann, wenn der neue String dieselbe Länge hatte wie der alte in der EXE.

himitsu 26. Jan 2023 17:30

AW: File patchen
 
Hab den Code nicht komplett angesehn, aber ich denke mal er wird immer abrauchen, sobald ein #0 vorkommt, was in der EXE garantiert der Fall sein wird. :stupid:

KodeZwerg 26. Jan 2023 19:56

AW: File patchen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Im Anhang ein total simpler byte patcher.
Delphi-Quellcode:
       Offsets : ARRAY [1..8] OF LONGINT = ($2e57, $2e58, $42b4, $42b5, $63a4, $67bf, $68ff, $6c4e);
     OrgValues : ARRAY [1..8] OF BYTE = ($7c, $0f, $7c, $18, $85, $85, $8d, $75);
     NewValues : ARRAY [1..8] OF BYTE = ($90, $90, $90, $90, $84, $84, $85, $eb);
darüber wird der ablauf gesteuert.
Geschrieben vor einer Ewigkeit, gerade nur mal kurz getestet ob es kompiliert und noch das tut was es soll.
Vielleicht hilft es Dir?

Andreas13 26. Jan 2023 21:23

AW: File patchen
 
Danke KodeZwerg! :thumb: :-D

kompilieren geht auch bei mir, kann jedoch das Programm im Debugger nicht starten, weil folgende Fehlermeldung kommt:
„Fehler
Prozess kann nicht erzeugt werden: Der angeforderte Vorgang erfordert erhöhte Rechte.“

obwohl ich auf meinem PC der Administrator bin. :shock:
Gibt es einen Trick dafür? :gruebel:

Könntest Du bitte evtl. auch die im Programm verwendete xyz.exe raufladen, damit ich den Ablauf studieren kann.

Danke & viele Grüße
Andreas

KodeZwerg 26. Jan 2023 21:46

AW: File patchen
 
Zitat:

Zitat von Andreas13 (Beitrag 1517911)
Danke KodeZwerg! :thumb: :-D

Gern geschehen!
Zitat:

Zitat von Andreas13 (Beitrag 1517911)
Gibt es einen Trick dafür? :gruebel:

Das erzeugte Kompilat als Administrator ausführen.
Zitat:

Zitat von Andreas13 (Beitrag 1517911)
Könntest Du bitte evtl. auch die im Programm verwendete xyz.exe raufladen, damit ich den Ablauf studieren kann.

xyz.exe gibt es nicht, das sollte nur ein rudimentäres Beispiel darstellen.
Der ablauf?
Datei xyz.exe öffnen, per "Seek" zu einem Offset springen und den Wert einlesen/auswerten/patchen, entweder wird ein Patch eingespielt oder entfernt oder gemeckert das es weder original noch dem Patch entspricht.

Heutzutage würde ich das ganze per Stream erledigen, die art und weise bleibt identisch, Seek -> Patch.
Ob die zu patchenden Daten wie in meinem Beispiel aus einem Array kommen oder moderner per Liste ist Geschmackssache.

Andreas13 26. Jan 2023 21:56

AW: File patchen
 
Zitat:

Zitat von KodeZwerg
Das erzeugte Kompilat als Administrator ausführen.

Das heißt, so ein Programm läßt sich gar nicht debuggen?
Beim Start des etwas angepaßten Programms als Administrator erhalte ich bei einer Test.exe von mir gleich Runtime error 105. :oops:

[Edit]: "Runtime error" - Problem behoben. :oops:

KodeZwerg 26. Jan 2023 22:24

AW: File patchen
 
Zitat:

Zitat von Andreas13 (Beitrag 1517913)
Zitat:

Zitat von KodeZwerg
Das erzeugte Kompilat als Administrator ausführen.

Das heißt, so ein Programm läßt sich gar nicht debuggen?

Ich habe keine Ahnung wozu Du es debuggen möchtest aber wenn, dann start Delphi auch als Administrator.
Es gibt doch nur diese drei Konstanten die der code durchläuft also ist das einzige was zu "debuggen" ist, die Konstante :D

Ich schreib Dir morgen mal was aktuelleres per FileStream und Forms und ohne Admin und zum debuggen etc :lol:

Andreas13 27. Jan 2023 10:07

AW: File patchen
 
Vielen Dank für Deine Hilfe, KodeZwerg! :-D :-D
Grüße, Andreas


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz