Delphi-PRAXiS
Seite 3 von 3     123   

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)

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 07:57 Uhr.
Seite 3 von 3     123   

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