Autor Beitrag
MagicRain
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

WinXp, Win8, iOS
Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
BeitragVerfasst: Di 09.12.08 00:20 
Hallo Leute ich will in einer externen Datei einen bestimmten wert suchen und diesen ersetzen also zb 35 hex dann möchte ich den zb mit 55h ersetzen. Habt ihr eine Idee wie man das ganze anstellen könnte Tipps oder Code beispiele oder gleiche Projekte die mir helfen könnten oder gar ein Tutorial dann nur her damit danke schon mal.


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 09.12.2008 um 00:32
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Di 09.12.08 10:14 
user profile iconMagicRain hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Leute ich will in einer externen Datei einen bestimmten wert suchen und diesen ersetzen also zb 35 hex dann möchte ich den zb mit 55h ersetzen.


Hallo,

das ist ein fast 100%ig sicherer Weg, die EXE unbrauchbar zu machen. Ich würde das erst mal mit einem Hex-Editor manuell versuchen, bevor ich sinnlose Software dafür schreibe.

Gruss Reinhard
turboPASCAL
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP / Vischda
D6 PE / D2005 PE
BeitragVerfasst: Di 09.12.08 10:47 
user profile iconReinhard Kern hat folgendes geschrieben Zum zitierten Posting springen:
... das ist ein fast 100%ig sicherer Weg, die EXE unbrauchbar zu machen ...

Dito.

Zitat:
String in EXE-File suchen und erstzen

Äh, was denn nun, einen String ("Hallo Welt !") oder ein Byte (Dezimal: 65 / Hex: 41 / als Char: "A") ?

user profile iconMagicRain hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Leute ich will in einer externen Datei einen bestimmten wert suchen und diesen ersetzen also zb 35 hex dann möchte ich den zb mit 55h ersetzen.
Ok, das sollte nicht das Problem sein. Solange du die genaue Position des zu änderen Wertes kennst.
Der Grund, der Wert kann öfters als ein mal an verschiedenen Positionen vorkommen.


Zitat:
Habt ihr eine Idee wie man das ganze anstellen könnte Tipps oder Code beispiele oder gleiche Projekte die mir helfen könnten oder gar ein Tutorial dann nur her damit danke schon mal.
Gegenfrage, hast du die Delphigrundlagen durch ? ;)

_________________
Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus... :P
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Di 09.12.08 14:28 
Hier mal eine Funktion, die in einem Stream ersetzt.

Es wird nach dem Wert old gesucht und an der Position wird dann new geschrieben.
old und new sollten die gleiche länge haben.

In dem String kannst du auch Binärwerte benutzen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure Replace(Stream: TStream; old, new: AnsiString) 
var 
  i: Integer; 
  pos: Int64; 
  pattern: AnsiString; 
begin  
  Stream.Position := 0; 

  while (Stream.size - Stream.Position) >= length(old) do 
  begin 
    pos := Stream.Position; 
  
    Stream.readbuffer(pattern, length(old)); 
    
    Stream.position = pos + 1; // Wir müssen byteweise vorgehen 
    
    if (comparemem(@pattern[0], @old[0], length(old)) = 0) then 
    begin 
      Stream.position = pos; 
      Stream.writeBuffer(new, length(new)); 
      break; // Wenn Mehrfachersetzung erwünscht, break entfernen
    end; 
  end; 
end;


Nicht getestet.


Zuletzt bearbeitet von jfheins am Mi 10.12.08 11:25, insgesamt 2-mal bearbeitet
MagicRain Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

WinXp, Win8, iOS
Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
BeitragVerfasst: Di 09.12.08 16:31 
@jfheins Sauber genau was ich gesucht habe. Vielen Dank!!!

MfG
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 10.12.08 01:10 
user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure Replace(Stream: TStream; old, new: AnsiString) 
var 
  i: Integer; 
  pos: Int64; 
  pattern: AnsiString; 
begin  
  Stream.Position := 0; 

  while (Stream.size - Stream.Position) >= sizeof(old) do //Fehler 1: Muss Length heißen
  begin 
    pos := Stream.Position; 
  
    Stream.readbuffer(pattern, sizeof(old)); //Fehler 2: Auch hier Length
    //Fehler 3: AV Buffer Overflow in write of pattern: Uninitialized Memory!
    
    if (comparemem(@pattern[0], @old[0], length(old)) = 0) then
    begin 
      Stream.position = pos; 
      Stream.writeBuffer(new, length(new)); //Fehler 4: Length(old) <> Length(new) möglich!
      //Fehler 5: Leak of memory contents
      break; // Wenn Mehrfachersetzung erwünscht, break entfernen
    end; 

    //Erst am Ende, spart eine Seek-Operation im Stream
    //Optimierung: Nur bei Stringlänge ungleich 1
    Stream.position = pos + 1; // Wir müssen byteweise vorgehen 
  end; 
end;


Nicht getestet.


Nächster Versuch bitte.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
MagicRain Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

WinXp, Win8, iOS
Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
BeitragVerfasst: Mi 10.12.08 01:42 
Zitat:
Äh, was denn nun, einen String ("Hallo Welt !") oder ein Byte (Dezimal: 65 / Hex: 41 / als Char: "A") ?

Hexwert!
Zitat:
Ok, das sollte nicht das Problem sein. Solange du die genaue Position des zu änderen Wertes kennst.
Der Grund, der Wert kann öfters als ein mal an verschiedenen Positionen vorkommen.

Ja, will ein bestimmtes Offset bearbeiten, verändert und so weiter...Also an einer bestimmten adresse zb 0x0040100..

Moderiert von user profile iconNarses: Doppelposts aufgeräumt
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mi 10.12.08 11:28 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Nächster Versuch bitte.

Wieso, passt doch :angel: :mrgreen:



...



Also bitte den neuen Code nehmen (habs editiert) - vorher hatte ich da n record und hab den Code auf die schnelle umgemodelt, da kann sowas schonmal passieren :P
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 10.12.08 11:55 
Das SetLength für deinen Lese-Puffer fehlt immer noch. Genauso wie es @Var[1] bei Strings heißen muss, sowohl beim Lesen als auch beim Schreiben ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Mi 10.12.08 12:11 
Wenn du weißt, an welcher Stelle du was ändern willst, kannst du direkt per Seek drauf zugreifen (Stream oder ohne).

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure ReplaceAtOffset(Filename: string; Offset: Integer; B: Byte);
var
  F: file of Byte;
begin
  AssignFile(F, Filename);
  FileMode := fmOpenReadWrite;
  Reset(F);
  Seek(F, Offset);
  BlockWrite(F, B, 1);
  CloseFile(F);
end;


Ungetestet und gänzlich ohne Fehlerbehandlung.

Aufzurufen wäre das ganze dann per ReplaceAtOffset('c:\meinedatei', $0040100, $90);
MagicRain Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

WinXp, Win8, iOS
Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
BeitragVerfasst: Mi 10.12.08 13:34 
Oki cool danke euch :)

MfG