Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wie kann man einen Loader programmierern? (https://www.delphipraxis.net/12544-wie-kann-man-einen-loader-programmierern.html)

Uncle Cracker 29. Nov 2003 13:46


Wie kann man einen Loader programmierern?
 
Ich würde gern einen Loader programmieren, der mehr als nur 2 Byte patchen kann.

Ich habe dazu folgenden Code für einen Loader:

Delphi-Quellcode:
program loader;

uses
  Windows, Messages;

{$R Loader.RES}

var
  si : Startupinfo;
  pi : Process_Information;
  NewData : array[0..1] of byte = ($90,$90);
  NewDataSize : DWORD;
  Bytesread : DWORD;
  Olddata : array[0..1] of byte;
begin
 // ZeroMemory(@si,sizeof(si));
 // ZeroMemory(@pi,sizeof(pi));
 // FillChar(Si,Sizeof(si),0);
 // Si.cb:=Sizeof(si);

  NewDataSize := sizeof(newdata);
  IF CreateProcess(nil,'Example.exe',nil,nil,FALSE,
           Create_Suspended,nil,nil,si,pi) = true then

  begin
    ReadProcessMemory(pi.hprocess,Pointer($403CEA),@olddata,2,bytesread);
    if (olddata[0] = $75) and (olddata[1] = $19) then
    begin
      WriteProcessMemory(pi.hProcess, Pointer($403CEA), @NewData, NewDataSize, bytesread);
      ResumeThread(pi.hThread);
      CloseHandle(pi.hProcess);
      CloseHandle(PI.hThread);
    end else
    begin
      Messagebox(0,pchar('Bytes not found! Wrong version?...'),pchar('Error'),mb_iconinformation);
      TerminateProcess(PI.hProcess,0);
      CloseHandle(PI.hProcess);
      CloseHandle(PI.hThread);
    end;
  end;

end.
Jedoch patchet dieser nur einen Offset mit je zwei Bytes. Nun wollte ich wissen wie das geht das mehrere Bytes im Speicher gepatchet werden können?

Vielleicht hat jemand ein Beispiel für mich?


:love: Danke UC


PS: Dieser Loader wird nicht für illegale Zwecke verwendet. Wollte ich nur noch mal klar stellen, nicht dass jemand etwas falsches denkt.

scp 29. Nov 2003 13:50

Re: Wie kann man einen Loader programmierern?
 
Erweitere
Delphi-Quellcode:
NewData : array[0..1] of byte = ($90,$90);
und
Delphi-Quellcode:
Olddata : array[0..1] of byte;
einfach. Z. B. für 4 Bytes:

Delphi-Quellcode:
NewData : array[0..3] of byte = ($90,$90,$90,$90);
und
Delphi-Quellcode:
Olddata : array[0..3] of byte;

Uncle Cracker 29. Nov 2003 14:28

Re: Wie kann man einen Loader programmierern?
 
Das wusste ich auch schon, es geht mir aber dadrum:

Delphi-Quellcode:
ReadProcessMemory(pi.hprocess,Pointer($403CEA),@olddata,2,bytesread);
    if (olddata[0] = $75) and (olddata[1] = $19) then
    begin
      WriteProcessMemory(pi.hProcess, Pointer($403CEA), @NewData, NewDataSize, bytesread);
      ResumeThread(pi.hThread);
      CloseHandle(pi.hProcess);
      CloseHandle(PI.hThread);
    end else
An dieser Stelle wird aber nur ein Offset geändert, ich würde aber gerne mehrere Stellen ändern.

scp 29. Nov 2003 16:07

Re: Wie kann man einen Loader programmierern?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Siehe Anhang.

[edit]
Paar Fehler korrigiert.
[/edit]

Uncle Cracker 29. Nov 2003 17:29

Re: Wie kann man einen Loader programmierern?
 
:love: Danke schön.

Deiner Funktion nach, könnte ich jetzt soviele ALoaderList einfügen wie ich will, oder?

scp 29. Nov 2003 18:16

Re: Wie kann man einen Loader programmierern?
 
genau. musst halt nur immer SetLength(ALoaderList, x) ändern und darunter entsprechend viele Einträge anlegen (Zählung beginnt, wie im Beispiel bei 0, also ALoaderList[0] bis ALoaderList[x-1].

Uncle Cracker 29. Nov 2003 18:34

Re: Wie kann man einen Loader programmierern?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Kann es sein, dass dein Loader irgendwie nicht richtig funktioniert, denn wenn ich die EXE-Datei patchen wilL (im Anhang), dann passiert gar nix, keine Meldung, einfach nix.

Der Offset ist $403CEA, olddata= $75, $19, Newdata $90,$90.
Vielleiht kannst du das mit deinem neuen Loader nochmal hinbekommen, mit der alten Version funktioniert alles.

scp 29. Nov 2003 19:30

Re: Wie kann man einen Loader programmierern?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry, Flüchtigkeitsfehler, aber gut, das du mir die EXE deschickt hast. Jetzt gehts.

Uncle Cracker 30. Nov 2003 00:29

Re: Wie kann man einen Loader programmierern?
 
:love: Danke, jetzt funktioniert alles ohne Probleme

Uncle Cracker 30. Nov 2003 01:40

Re: Wie kann man einen Loader programmierern?
 
Nochmal zum Loader, funktioniert alles super, doch leider möchte ich 82 Bytes patchen, die alle nacheinander kommen, doch ich habe keine Lust die 82 alle von Hand aus einzugeben. Ist es irgendwie möglich von einer bestimmten Stellen an, bis zu einer bestimmten Stelle alles zu patchen, indem ich einfach den Originalwert eingebe und dann den Wert, der entstehen soll.

Is das vielleicht irgendwie möglich?


:love: Danke Uc

Christian Seehase 30. Nov 2003 01:58

Re: Wie kann man einen Loader programmierern?
 
Moin UC,

dann nehme doch strings.
Da kannst Du dann ja z.B. die Werte mit #nn angeben, wenn sie nicht darstellbar sind.

Uncle Cracker 30. Nov 2003 12:42

Re: Wie kann man einen Loader programmierern?
 
:wiejetzt: Ich weiß nicht wie du das meinst

Christian Seehase 30. Nov 2003 12:50

Re: Wie kann man einen Loader programmierern?
 
Moin UC,

ich meine, dass Du als Buffer einen String nehmen sollst:

Delphi-Quellcode:
var
  sBuffer : string;

begin
  sBuffer := #$75#$19; // ggf. mehr
  WriteProcessMemory(...,...,@sBuffer[1],2,...);
end;
Beim Lesen muss dann nur die Grösse initialisiert werden.

Uncle Cracker 30. Nov 2003 14:30

Re: Wie kann man einen Loader programmierern?
 
Ich habe das nochmal versucht so zu machen wie du, doch irgendwie will das nicht so richtig.


Ich würde nämlich gern die Datei von diesen Werten:

Code:
000001f0: 00 00 00 00 00 00 00 00 55 50 58 30 00 00 00 00
00000200: 00 60 03 00 00 10 00 00 00 00 00 00 00 04 00 00
00000210: 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 E0
00000220: 55 50 58 31 00 00 00 00 00 00 02 00 00 70 03 00
00000230: 00 F2 01 00 00 04 00 00 00 00 00 00 00 00 00 00
00000240: 00 00 00 00 40 00 00 E0 2E 72 73 72 63 00 00 00
00000250: 00 10 00 00 00 70 05 00 00 0C 00 00 00 F6 01 00

In diese Wert umpatchen:

Code:
000001f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000200: 00 D0 00 00 00 10 00 00 00 00 00 00 00 04 00 00
00000210: 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 C0
00000220: 00 00 00 00 00 00 00 00 00 80 00 00 00 E0 00 00
00000230: 00 74 00 00 00 04 00 00 00 00 00 00 00 00 00 00
00000240: 00 00 00 00 40 00 00 C0 2E 72 73 72 63 00 00 00
00000250: 00 10 00 00 00 60 01 00 00 04 00 00 00 78 00 00

Aber ich bekomme das einfach nicht hin, denn ich will nicht jeden Wert einzeln eintragen.
Kann mir vielleicht jemand dabei helfen, wie das gehen soll?



:love: Danke UC

Christian Seehase 30. Nov 2003 15:09

Re: Wie kann man einen Loader programmierern?
 
Moin UC,

dann erklär mir doch mal bitte, wo Du bei meinem, stilisierten, Beispiel das Problem hast statt 2 eine grössere Anzahl anzugeben.
Das versteh' ich nämlich jetzt nicht.

Uncle Cracker 30. Nov 2003 16:08

Re: Wie kann man einen Loader programmierern?
 
Danke Christian, deine Methode funktioniert doch, hab's Sie nur am Anfang nicht verstanden. Sieht jetzt so aus:

Delphi-Quellcode:
program loader;

uses
  Windows, Messages;

var
  si : Startupinfo;
  pi : Process_Information;
  Bytesread : DWORD;
  Olddata : array[0..1] of byte;
  sBuffer : string;
 

begin
  sBuffer := #$90#$90;
  IF CreateProcess(nil,'Example.exe',nil,nil,FALSE,
           Create_Suspended,nil,nil,si,pi) = true then

  begin
    ReadProcessMemory(pi.hprocess,Pointer($403CEA),@olddata,2,bytesread);
    if (olddata[0] = $75) and (olddata[1] = $19) then
    begin
      WriteProcessMemory(pi.hProcess, Pointer($403CEA), @sBuffer[1], 2, bytesread);
      ResumeThread(pi.hThread);
      CloseHandle(pi.hProcess);
      CloseHandle(PI.hThread);
    end else
    begin
      Messagebox(0,pchar('Bytes not found! Wrong version?...'),pchar('Error'),mb_iconinformation);
      TerminateProcess(PI.hProcess,0);
      CloseHandle(PI.hProcess);
      CloseHandle(PI.hThread);
    end;
  end;


end.

Man könnte das Olddata auch noch in einen String umwandeln, doch dazu habe ich keine Lust :zwinker:

scp 30. Nov 2003 21:41

Re: Wie kann man einen Loader programmierern?
 
Was für einen Vorteil hast du jetzt davon? Was tippt man schneller?
$75,$19 oder #$75#$19 ? Dürfte ziemlich gleich ausfallen, oder?

Uncle Cracker 30. Nov 2003 21:46

Re: Wie kann man einen Loader programmierern?
 
Wenn man jedoch mehere Werte ändern will geht das aber schneller

scp 30. Nov 2003 21:51

Re: Wie kann man einen Loader programmierern?
 
Wieso? Du brauchst bei meinem Beispiel auch nichts anderes ändern ausser den/die Werte, die du ändern willst. Keine arrays festlegen oder ähnliches.

Und wenn du jetzt sagst, das das bei mir komplexer aufgebaut ist, darf ich ich daran erinnen, das du auch mehrere Offsets haben wolltest, was diesen Aufbau nötig macht.
Das BA([ ]) musst du ja auch nur einmal tippen, egal, ob du 2 oder 80 Bytes eintippts.


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