Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Patcher (https://www.delphipraxis.net/53471-patcher.html)

N47R0N 17. Sep 2005 11:28


Patcher
 
Hi ich wollte schon immer mal wissen wie patcher funktionieren , in bezug auf cracks und so es gibt ja solche patcher mit denen man einfach nur die exe auswählt und der die datei dann patcht.

Wie funkt sowas?

Phistev 17. Sep 2005 11:36

Re: Patcher
 
Entweder nutzen die einen Filestream oder eine file of byte und schreiben dann an der entsprechenden Position die geänderten Bytes. Evtl. wird noch vorher ein Hash berechnet, um festzustellen, ob es auch die richtige Datei ist.

Tubos 17. Sep 2005 11:37

Re: Patcher
 
Diese Programme verändern einfach bestimmte Befehle in der Datei.
Zum Beispiel könnte ein Sprung-Befehl zu einer CD-Abfrage durch eine NOP-Anweisung (no operation) ersetzt werden, wodurch man nicht jedesmal beim Spielen die CD einlegen muss.

N47R0N 17. Sep 2005 11:48

Re: Patcher
 
ja das das so geht weis ich nur wie kann man das in delphi machen?

z.B:

der wert auf adresse : 004468F6 lautet immer 85
und ich will das mein patch aus diesem wert 63 macht
wie bewerkstellige ich das??

und wie kann ich vorher überprüfen lassen wie groß die datei ist?

Danke schonmal

Phistev 17. Sep 2005 11:55

Re: Patcher
 
Siehe mein erster Beitrag.
Delphi-Quellcode:
var str: TFileStream;
    value: byte;
{...}
str:= TFileStream.Create('blubb.exe', fmOpenWrite);
if str.Size = 2000 then begin //hier Dateigröße einsetzen
  str.Seek($004468f6, soFromBeginning);
  value:= $63;
  str.Write(value, 1);
end;
str.Free;
Fehlt noch ein try-finally-Block

N47R0N 17. Sep 2005 13:56

Re: Patcher
 
kannste den source noch etwas erklären??

Phistev 17. Sep 2005 14:02

Re: Patcher
 
Nutz einfach die Online-Hilfe. Ganz grob:
  1. Datei zum Schreiben öffnen
  2. Dateigröße überprüfen
  3. Schreiben
  4. Schließen
der finally-Teil in einem try-finally-Block wird auch dann ausgeführt, wenn eine Exception auftritt.

N47R0N 17. Sep 2005 14:06

Re: Patcher
 
Das funktioniert mit den ändern des wertes nicht so gans

Phistev 17. Sep 2005 14:10

Re: Patcher
 
Was funktioniert denn nicht?

BlackJack 17. Sep 2005 14:39

Re: Patcher
 
naja ganz so einfach geht das ja auch nicht. nur wenn man die adresse z.b. einer variablen im RAM kennt kann man nicht einfach die gleiche stelle in der exe editieren und das wars.
z.b. stimmt adresse eines bytes im speicher nicht mit dem offset eines bytes in einer datei überein, da exen standardmäßig an die adresse $00400000 geladen werden, die exen ja noch einen header haben etc.

Stanlay Hanks 17. Sep 2005 14:48

Re: Patcher
 
Zitat:

Zitat von N47R0N
Hi ich wollte schon immer mal wissen wie patcher funktionieren , in bezug auf cracks [...]

Zitat:

Zitat von N47RON
ja das das so geht weis ich nur wie kann man das in delphi machen?

Ohne dir etwas unterstellen zu wollen, das liest sich, als wolltest du einen Crack schreiben :roll:

TheMiller 17. Sep 2005 15:09

Re: Patcher
 
Vielleicht will er aber auch nur sein Programm versuchen zu cracken. Muss ja nix illegales sein.

N47R0N 17. Sep 2005 21:45

Re: Patcher
 
Nö will keinen Crack machen will nen Patch machen

Also die werte ändern sich nicht den wenn ich mein Programm mit dem
HexEditor öffne dann ist die adresse immer gleich. Ich will nur den
wert an dieser adresse ändern, z.B weiß ich das wenn ich auf diese
adresse 00441C34 gehe 75 als Hexwert steht dies will ich in sagen
wir mal 84 ändern und das per knopfdruck machen.

Phistev 17. Sep 2005 21:49

Re: Patcher
 
Bist du auch sicher, dass der Quelltext deine Datei öffnet? Gib doch einfach mal den absoluten Pfad (LW:\Pfad\zur\Exe\name.exe) bei TFilestream.Create() an.

PierreB 17. Sep 2005 21:51

Re: Patcher
 
Zitat:

Zitat von N47R0N
Nö will keinen Crack machen will nen Patch machen

Also die werte ändern sich nicht den wenn ich mein Programm mit dem
HexEditor öffne dann ist die adresse immer gleich. Ich will nur den
wert an dieser adresse ändern, z.B weiß ich das wenn ich auf diese
adresse 00441C34 gehe 75 als Hexwert steht dies will ich in sagen
wir mal 84 ändern und das per knopfdruck machen.

Sofern du das nicht in Delphi machen willst:
W32DASM + Brat Patch & Hiew, dass sind die 2 Programme die du dafür brauchst. Sollte selbsterklärend sein => Arbeit von 2 Minuten. Solltest du nicht klarkommen, bei Google gibt es hunderte Anleitungen & Tutorials.

N47R0N 17. Sep 2005 22:26

Re: Patcher
 
Das kann ich doch schon lange

nur will ich das mit nem Patch machen, is für den User doch
einfacher

MiniKeks 17. Sep 2005 22:29

Re: Patcher
 
Ihr immer mit dem "Es hört sich an als ob du einen Crack schreiben willst"

- Und wenn schon, das ist seine sache. Er muss dafür büsen bei der Polizei und nicht ihr oder?

Seit doch mal nicht so misstrauisch ehrlich, diese Fragen nerven mich langsam.

Tubos 17. Sep 2005 22:31

Re: Patcher
 
Zitat:

nur will ich das mit nem Patch machen, is für den User doch
einfacher
Ich verstehe ehrlich gesagt nicht, wo das Problem ist. Phistev hat doch schon einen Codeausschnitt gepostet.
Wenn du Probleme damit hast, dann sag doch mal genau was nicht funktioniert.

N47R0N 17. Sep 2005 23:08

Re: Patcher
 
so ich bin mir sicher das er die datei öffnet, schreiben tut er aber nicht der alte wert auf dieser adresse muss gelöscht und durh meinen geändert werden wenn das richtig gemacht wird muss mein programm eigendlich funktionieren, das tut es aber nicht. ich weiß nicht warum

alcaeus 17. Sep 2005 23:10

Re: Patcher
 
Zitat:

Zitat von MiniKeks
- Und wenn schon, das ist seine sache. Er muss dafür büsen bei der Polizei und nicht ihr oder?

Seit doch mal nicht so misstrauisch ehrlich, diese Fragen nerven mich langsam.

Nur um es mal klarzustellen: Im Notfall muss Daniel dafuer geradestehn, und genau deshalb sind wir so penibel, denn das koennen wir uns einfach nicht leisten; die Frage ist also durchaus erlaubt.

Greetz
alcaeus

Phistev 17. Sep 2005 23:11

Re: Patcher
 
Step doch mal durch dein Programm, um festzustellen, ob alles auch ausgeführt wird, welche Werte die Variablen haben...

N47R0N 17. Sep 2005 23:22

Re: Patcher
 
das hab ich jetzt nicht so richtig verstanden die adressen in meinem Programm sind richtig

Phistev 17. Sep 2005 23:24

Re: Patcher
 
Es geht nicht nur um die Adressen. Wenn die Größe nicht stimmt, kann's schon ein Problem geben usw.

N47R0N 17. Sep 2005 23:31

Re: Patcher
 
ich habe die anfrage über die größe entfernt und es nochmal gemacht funkt immer noch nicht

ErazerZ 17. Sep 2005 23:33

Re: Patcher
 
Delphi-Quellcode:
program Patch;

{$APPTYPE CONSOLE}

uses
  Windows;

procedure PatchOffset(Handle: Cardinal; Offset: LongInt; NewCode: LongInt);
var
  Buffer: Pointer;
  FileSizeA: Cardinal;
begin
  FileSizeA := GetFileSize(Handle, nil);
  Buffer := Pointer(LocalAlloc(0, FileSizeA));
  _lread(Handle, Buffer, FileSizeA);
  _llseek(Handle, 0, FILE_BEGIN);
  PByte(Cardinal(Buffer) + Offset)^ := NewCode;
  _lwrite(Handle, Buffer, FileSizeA);
end;

var
  h: Cardinal;
begin
  h := _lopen(PChar(ParamStr(1)), OF_READWRITE);
  if h <> INVALID_HANDLE_VALUE then
  begin
    PatchOffset(h, $1, $90);
  end;
  _lclose(h);
end.

N47R0N 17. Sep 2005 23:41

Re: Patcher
 
kannste das ma ein bischen komentieren bin noch neu

ErazerZ 17. Sep 2005 23:47

Re: Patcher
 
Zitat:

Zitat von ErazerZ
Delphi-Quellcode:
program Patch;

{$APPTYPE CONSOLE}

uses
  Windows; // brauchst nur windows unit wegen den winapi's

// handle = handle des modules, offset = welchen offset es patchen sollte, newcode = der neue code in integer, eg. jle = 0F8E
procedure PatchOffset(Handle: Cardinal; Offset: LongInt; NewCode: LongInt);
var
  Buffer: Pointer; // .. der zeiger zu den daten
  FileSizeA: Cardinal; // hier wird die dateigröße gespeichert
begin
  FileSizeA := GetFileSize(Handle, nil); // dateigröße auslesen ..
  Buffer := Pointer(LocalAlloc(0, FileSizeA)); // speicher reservieren oder wie auch immer
  _lread(Handle, Buffer, FileSizeA); // auslesen
  _llseek(Handle, 0, FILE_BEGIN); // den zeiger auf den offset setzen ..
  PByte(Cardinal(Buffer) + Offset)^ := NewCode; // den offset patchen in der memory
  _lwrite(Handle, Buffer, FileSizeA); // den geänderten speicher schreiben ..
end;

var
  h: Cardinal; // hier speichert man den dateihandle
begin
  h := _lopen(PChar(ParamStr(1)), OF_READWRITE); // datei öffnen (paramstr(1) = c:\bla\bla.exe <paramstr1>)
  if h <> INVALID_HANDLE_VALUE then // wenn handle nicht ungültig ist ..
  begin
    PatchOffset(h, $1, $90); // patche module h, beim offset 1, mit nem nop
  end;
  _lclose(h); // module schließen ..
end. // ende ..



Alle Zeitangaben in WEZ +1. Es ist jetzt 14:24 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