Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Übersetzung von C nach Delphi - Problem: writeprocessmemory (https://www.delphipraxis.net/91382-uebersetzung-von-c-nach-delphi-problem-writeprocessmemory.html)

SaraHx 4. Mai 2007 08:57


Übersetzung von C nach Delphi - Problem: writeprocessmemory
 
Hallo, ich verwende seit einiger Zeit Delphi7 für meine Programmentwicklung.
Da ich mich nun langsam in den Bereich der Speichermanipulation wagen möchte habe ich mir ein Programm (bzw Source) angeschaut,
was einen einfachen Replace im Memory durchführt:

Delphi-Quellcode:
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
#include <conio.h>

using namespace std;

//original:      241D0851   0F84 20040000    JE client.241D0C77
//patched:       241D0851   E9 21040000      JMP client.241D0C77
//base address:  24000000   + 1D0851
BYTE flash0[6] = { 0x0F, 0x84, 0x20, 0x04, 0x00, 0x00 };
BYTE flash1[5] = { 0xE9, 0x21, 0x04, 0x00, 0x00 };

DWORD mpc;

int main()
{   
   
    cout << "patch ;/" << endl << endl << "> waiting for window" << endl;
   
    HWND hwnd = NULL;
    while(!hwnd)
    {
        hwnd = FindWindow(0, "Windowname");
        Sleep(10);
    }
   
    DWORD dwPID;
    GetWindowThreadProcessId(hwnd,&dwPID);
    cout << "> Window found - Process ID: " << dwPID << endl;

    HANDLE hProcess;
    hProcess = OpenProcess(PROCESS_ALL_ACCESS,TRUE,dwPID);

    cout << "> press any key for patching" << endl;
    getch();
    WriteProcessMemory(hProcess,(void*)(0x24000000 + 0x1D0851),&flash1,5,&mpc);
    cout << "> k" << endl << endl;

    cout << "> press any key for patching it back" << endl << endl;
    getch();
    WriteProcessMemory(hProcess,(void*)(0x24000000 + 0x1D0851),&flash0,6,&mpc);
   
    cout << "> k" << endl << "> press any key to close the patch" << endl;
    getch();
    return 0;
}

Das in C geschriebene Funktioniert soweit einwandfrei doch nun habe ich probiert es in Delphi zu übersetzen:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

const
ori = $0F8420040000;
patched = $E921040000;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var _hwnd:HWND;
processID,lala: DWORD;
Process:THANDLE;

begin
_hwnd := 0;

while (_hwnd = 0) do begin
_hwnd := FindWindow(0, 'Windowname');
Sleep(10); //Bringts eh nicht
end;
GetWindowThreadProcessID(_hwnd,processID);
label1.caption := 'ProcessID: ' + FloatToStr(processID);
Process := OpenProcess(PROCESS_ALL_ACCESS,TRUE,processID);

WriteProcessMemory(Process,ptr($24000000 + $1D0851),@patched,sizeof(patched),lala);
Label2.Caption := FloatToStr(lala);
end;

end.
Mein direktes Problem liegt hier in dem Befehl WriteProcessMemory: Delphi spuckt mir nun folgendes aus: "Variable Required" und setzt mir dabei den Cursor auf den Bereich WriteProcessMemory.

Könnte mir jemand erklären bzw. aufzeigen wie ich diesen Fehler beheben kann bzw wie die Übersetzung von C nach Delphi besser und vor allem funktionierender wär?


lg
Sarah

Gehstock 4. Mai 2007 09:55

Re: Übersetzung von C nach Delphi - Problem: writeprocessmem
 
Delphi-Quellcode:
unit unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  var
  WindowName : integer;
  ProcessId : integer;
  ThreadId : integer;
  buf : PChar;
  HandleWindow : Integer;
  write : cardinal;


  Const WindowTitle = 'spiel'; //hier einfach den namen von unserm fenster eingeben! einfach spiel starten,
          //dann alt+tab drücken und in der taskleiste einfach nachschaun welche caption
                                        //unser programm hat und diese einfach einfügen.


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const v1 = $E921040000;
begin
 WindowName := FindWindow(nil,WindowTitle);
          If WindowName = 0  then MessageDlg('...erst spiel starten...dann trainer starten =)', mtwarning,[mbOK],0);
    ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
    HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
    GetMem(buf,sizeof(Chr(v1)));
    buf^  := Chr(v1);
    WriteProcessMemory(HandleWindow,ptr($24000000 + $1D0851),buf,sizeof(buf),write);
    FreeMem(buf);
    closehandle(HandleWindow);
end;

end.
existierenden Code umgebastelt nicht getestet

SaraHx 4. Mai 2007 10:12

Re: Übersetzung von C nach Delphi - Problem: writeprocessmem
 
Vielen Dank für die Antwort, leider gibts immernoch Probleme:

Das Zielprogramm hängt sich einfach auf.

Ich hatte zuerst die Variable buf direkt bei mir eingefügt und das Programm angepasst.
Habe ich nun versucht eine Speicherabänderung durchzuführen kam vom Zielprogramm eine Fehlermeldung
und es musste beendet werden.

Das selbe passiert wenn ich deinen Quelltext 1:1 kopiere und ihn so verwende.


Eine Idee woran das liegen kann?

lg
sarah

p0w3r5tr34m3r 4. Mai 2007 11:01

Re: Übersetzung von C nach Delphi - Problem: writeprocessmem
 
dann überprüf mal die hex-daten.. vielleicht hat sich da n fehler eingeschlichen der zum "einfrieren" führt

sirius 4. Mai 2007 11:07

Re: Übersetzung von C nach Delphi - Problem: writeprocessmem
 
Bei Gehstock haben sich ein paar Fehler eingeschlichen.
wenn wir den einen berichtigen brauchen wir (hoffentlich) den Rest nicht mehr beachten
"V1 ist kein string."

Mach mal aus Gehstocks Werk:

Delphi-Quellcode:
const v1:string[5]=#$E9#$21#$04#$00#$00; //Längenangabe nicht vergessen, sonst ist es ein Pchar der im 4. Byte endet
//buf brauchen wir nicht

WriteProcessMemory(HandleWindow,ptr($24000000 + $1D0851),@v1[1],sizeof(v1),write);

SaraHx 4. Mai 2007 11:20

Re: Übersetzung von C nach Delphi - Problem: writeprocessmem
 
danke an sirius, nun funktioniert alles :>


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 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 by Thomas Breitkreuz