![]() |
Speicherbereich einer Anwendung ermitteln
Hi Leute.
Ich bin dabei einen Trainer zu proggen. Jetzt ist er soweit fertig, und er läuft wunderbar, "auf meien PC" :( Hab das Teil jetzt bei nen Kumpel testen wollen, aber is nicht. (Spiel liegt in einen anderen Speicherbereich) alls Dynamisch. Jetzt will ich das Offset 0 des Spieles ermitteln, und dann die Adresse dazu zählen. Wie komm ich über die ProcessID auf das Offset 0 der Anwendung ? lg Bundy |
Re: Speicherbereich einer Anwendung ermitteln
hmm eigentlich müsstest du ohne probleme mit readprocessmemory und writeprocessmemory auf den speicher zugreifen können.
dazu solltest du vorher den process öffen (openprocess) und eben auch die process id besorgen |
Re: Speicherbereich einer Anwendung ermitteln
Hi,
ich glaub kaum, dass du da große Chancen hast, du müsstest ja mit der physikalischen Adresse arbeiten und das darf afaik nur der Kernel :). Jedes Programm kriegt doch seine 4 GB virtuellen Adressraum und denkt, es wäre allein im Speicher. Ich versteh auch nicht, wie das bei dir funktionieren kann. Außerdem liegt das Spiel doch nicht zuverlässig immer an der selben Adresse, wer weiß, was du alles für Programme aufmachst und so. Falls ich mich irren solle, lasse ich mich auch gern korrigieren, so isses ja nicht :D Snuffi |
Re: Speicherbereich einer Anwendung ermitteln
So sieht code aus
Delphi-Quellcode:
das ganze funktioniert auf meinen PC, aber auf einen anderen nicht !
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, cxControls, cxContainer, cxEdit, cxLabel, ExtCtrls, cxTextEdit, cxMaskEdit, cxSpinEdit, cxCheckBox, Menus, cxLookAndFeelPainters, StdCtrls, cxButtons; type TfmMain = class(TForm) cxLabel1: TcxLabel; Image1: TImage; cxSpinEdit1: TcxSpinEdit; cxLabel2: TcxLabel; cxSpinEdit2: TcxSpinEdit; cxLabel3: TcxLabel; cxSpinEdit3: TcxSpinEdit; cxLabel4: TcxLabel; cxSpinEdit4: TcxSpinEdit; cxCheckBox1: TcxCheckBox; Timer1: TTimer; cxLabel5: TcxLabel; cxLabel6: TcxLabel; cxLabel7: TcxLabel; Shape1: TShape; cxButton1: TcxButton; cxButton2: TcxButton; procedure cxCheckBox1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure cxButton2Click(Sender: TObject); procedure cxButton1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } function ReadValue(aAdresse:integer):integer; function WriteValue(aAdresse,aValue:integer):integer; public { Public-Deklarationen } end; var fmMain: TfmMain; WindowName: Integer; ThreadId: Integer; ProcessId: Integer; HandleWindow: Integer; const // WindowTitle = 'Harry Potter und der Feuerkelch' + #153; WindowTitle = 'Project2'; AddressLeben = $241BC08; AddressSuperShoot = $241D15A; AddressBohnenHarry = $24194F0; AddressBohnenHermin = $24194F8; AddressBohnenRonald = $24194F4; implementation {$R *.dfm} procedure TfmMain.cxButton1Click(Sender: TObject); begin cxSpinEdit1.Value:= ReadValue(AddressLeben); cxSpinEdit2.Value:= ReadValue(AddressBohnenHarry); cxSpinEdit3.Value:= ReadValue(AddressBohnenHermin) ; cxSpinEdit4.Value:= ReadValue(AddressBohnenRonald) ; end; procedure TfmMain.cxButton2Click(Sender: TObject); begin WriteValue(AddressLeben,cxSpinEdit1.Value); WriteValue(AddressBohnenHarry,cxSpinEdit2.Value); WriteValue(AddressBohnenHermin,cxSpinEdit3.Value); WriteValue(AddressBohnenRonald,cxSpinEdit4.Value); end; procedure TfmMain.cxCheckBox1Click(Sender: TObject); begin Timer1.Enabled:=cxCheckBox1.Checked; end; procedure TfmMain.FormCreate(Sender: TObject); begin WindowName := FindWindow(nil, WindowTitle); if WindowName = 0 then begin MessageDlg('Das Spiel läuft nicht !! Spiel Starten !!', mtwarning, [mbOK], 0); Close; end; ThreadId := GetWindowThreadProcessId(WindowName, @ProcessId); HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId); end; function TfmMain.ReadValue(aAdresse:integer): integer; var aValue:integer; Bytesread : DWORD; begin ReadProcessMemory(HandleWindow, ptr(aAdresse), @aValue,sizeof(aValue),Bytesread); Result:=aValue; end; procedure TfmMain.Timer1Timer(Sender: TObject); begin WriteValue(AddressSuperShoot,17130); end; function TfmMain.WriteValue(aAdresse,aValue: integer): integer; var Bytesread : DWORD; begin WriteProcessMemory(HandleWindow, ptr(aAdresse), @aValue, sizeof(aValue), Bytesread); end; end. Es muss doch möglich sein wenn man sich den Hauptspeicher her nimmt. Offset: 0000000000-------------------|Spiel|--------------------FFFFFFFFFF (4 GB) Das erste Offset des Spieles zu finden oder ? |
Re: Speicherbereich einer Anwendung ermitteln
Eigentlich sollte es schon funktionieren, wenn du WriteProcessMemory so verwendest:
WriteProcessMemory(hProcess, ptr(SpeicherAdresseImSpeicherbereich), @DatenDiegeschriebenwerden, Laenge, BytesWritten); also so funktioniert es bei mir ich brauche also keine startadresse oder so. |
Re: Speicherbereich einer Anwendung ermitteln
Aber wie sieht es aus wenn das Spiel nicht immer am gleichen Platz im speicher liegt ?
Oder denke ich da falsch. Sowas wie Dynamischer Speicher oder so dynamic memory addresses (dma) |
Re: Speicherbereich einer Anwendung ermitteln
@SnuffMaster23: Schau' mal in der MSDN nach... Er darf auf den Speicherbereich zugreifen... ;)
|
Re: Speicherbereich einer Anwendung ermitteln
@Daniel G
Wer ist "Er"? Der Kernel oder bundy? Falls du bundy meinst, stellt das jetzt mein ganzes Weltbild auf den Kopf (zumindest teilweise :) ) |
Re: Speicherbereich einer Anwendung ermitteln
Zitat:
ciao, Philipp |
Re: Speicherbereich einer Anwendung ermitteln
@SnuffMaster23:
Wenn es möglich ist, das Handle mit "PROCESS_VM_WRITE and PROCESS_VM_OPERATION" zu erstellen: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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