• Trainer
  • Forums
  • Suche
  • Members
  • Kalender
  • Hilfe
  • Extras
Forum stats
Show team
Neue Beiträge ansehen
Heutige Beiträge ansehen
Home of Gamehacking - Archiv
Login to account Create an account
Login
Benutzername:
Passwort: Passwort vergessen?
 



  Home of Gamehacking - Archiv Coding Delphi Kleine Hilfe zu WriteProcessMemory gesucht...

Seiten (7): « Zurück 1 ... 3 4 5 6 7 Weiter »
Ansichts-Optionen
Kleine Hilfe zu WriteProcessMemory gesucht...
darius83 Offline
Junior Member
**
Beiträge: 34
Themen: 2
Registriert seit: Sep 2012
Bewertung: 0
#41
14.09.2012, 18:54 (Dieser Beitrag wurde zuletzt bearbeitet: 14.09.2012, 21:12 von darius83.)
(14.09.2012, 17:14)sILeNt heLLsCrEAm schrieb: Da hab ich dich schon richtig verstanden, aber irgendwie hatte ich mit meinem Handy nen Verbindungsabbruch und der Beitrag wurde widererwarten nicht gepostet...

Egal... Hier siehst Du ein Beispiel...
[code=Delphi]var
BaseAdress: PByte;
begin
BaseAdress:= VirtualAllocEx (hProcess, nil, 1000, Mem_Commit or Mem_Reserve, Page_Execute_ReadWrite);[/code]

Da die Basisadresse des zugewiesenen Speichers ja bekannt ist (BaseAdress) musst Du davon ausgehend auch wissen wo der Jump hinsoll. Nehmen wir mal an die Basis Adresse ist 10000000h und der Jump steht an Adresse 10000500h. Dann könntest Du das auch so verstehen das der Jump an "Basisadresse + 0x500h" steht.
Das wiederrum würde dann so aussehen...
[code=Delphi]WriteProcessMemory(hProcess, Pointer(BaseAdress+$500), lpBuffer, nSize, lpNumberOfBytesWritten);[/code]

grEEtZ sILeNt heLLsCrEAm

Hihi, ihr habt mich beide nicht verstanden :/ Man, ich hasse das, wenn ich nicht weiss, wie ich das erklären soll...
Das was du grad geschrieben hast, hab ich verstanden, mein Problem ist Folgendes:
BaseAdress: Pointer
BaseAdress:= VirtualAllocEx(...) // Nehmen wir mal an: 00400100
Wie komme ich jetzt an diese 00400100, um diese an entsprechender Stelle im Originalcode als Jump zu schreiben?
Manuell mach ich das ja so:

WriteBytesToMem(Pidhandle,ENERGIEVERBRAUCH,Written,JmpEnergieverbrauch);
wobei JmpEnergieverbrauch:array[0..4] of byte;
welches sich aus 5 Bytes zusammensetzt, JmpByte+4ZielBytes, die ich berechnen könnte, wenn ich diese 00400100 als 4 Bytes vorliegen hätte.
Alternativ dein Lösungsansatz mit: Push Baseadress;Ret; -> $68 $00$01$40$00 $C3
Wenn ich es richtig verstanden habe, aber ich habe ja 00400100 und nicht $00$01$40$00, also, wie splitte ich jetzt, bzw, wie wandle ich die mir vorliegende Aresse in Pointerform in die benötigte Array of Byte-Form um, um den Originalcode mit dem Jump zur Cave zu ersetzen?

Ich hoffe, ich habe es jetzt besser erklärt, wo es bei mir hängt...
LG Darius83

Edit: Habs jetzt zwar irgendwie zum Laufen bekommen, aber würd mich trotzdem freuen, wenn mir da nochmal jemand hilft... Habs jetzt so gelöst, dass ich den Befehl erst mit 00000000 als Adresse komplett geschrieben habe und anschliessend einen write ausgeführt habe, der nur die Adresse überschreibt:

JmpEnergieverbrauch:array[0..7] of byte = ($68,$00,$00,$00,$00,$C3,$90,$90);
WriteBytesToMem(Pidhandle, ENERGIEVERBRAUCH, Written, JmpEnergieverbrauch);
WriteProcessMemory(Pidhandle, Pointer(ENERGIEVERBRAUCH+$01), @BaseAddr, 4, Written);


Es gibt 10 verschiedene Typen von Personen, die, die ich mag und die, die ich nicht verstehen kann...
Suchen
Antworten
iNvIcTUs oRCuS Offline
Super Moderator
****
Beiträge: 2.688
Themen: 529
Registriert seit: Aug 2010
Bewertung: 19
#42
15.09.2012, 17:21
Ist doch ganz einfach...
Zugegeben, ich habe auch erst mal recherchieren müssen da ich nicht gleich drauf gekommen bin.
Schreib halt den berechneten Jump als Integer und nicht als Array of Byte. Ganz einfach casten und das wars schon...

Im übrigen hast Du mich nicht verstanden... In meinem Codeabschnitt siehst Du ja das...
[code=Delphi]var
BaseAdress: PByte;[/code]
und nicht...
[code=Delphi]var
BaseAdress: Pointer;[/code]
Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer !!!

Traineranfragen per PM werden prinzipiell gelöscht...

[Bild: signatur6akm7.gif]
Suchen
Antworten
darius83 Offline
Junior Member
**
Beiträge: 34
Themen: 2
Registriert seit: Sep 2012
Bewertung: 0
#43
15.09.2012, 19:54 (Dieser Beitrag wurde zuletzt bearbeitet: 15.09.2012, 22:01 von iNvIcTUs oRCuS.)
Öhm machts einen Unterschied? Die Hilfe in RadCE sagte mir, dass der Rückgabewert vom Typ Pointer ist und nicht PByte... Deswegen hatte ich Pointer genommen, hatte ich ja schon, bevor du deinen Codeschnipsel gepostet hattest.

Ja auf das mit dem Integer schreiben hätte ich auch kommen können :/ Danke für den Tip. Naja hier mal der momentan funktionierende Code, noch ohne das IntegerWrite, dafür mit 2. Hotkey für gestoppten Energieverbrauch (Verbrauch wird nicht erhöht, solange aktiv)




[code=delphi]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, tlhelp32, ExtCtrls, StdCtrls;
type
TWMHotkey = record
Msg: Cardinal;
idHotKey: Word;
Modifiers: Integer;
VirtKey: Integer;
end;

type
TForm1 = class(TForm)
Timer1: TTimer;
Memo1: TMemo;
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
public
end;

var
Form1: TForm1;
BaseAddr: Pointer;
GoldCheatAktiv: Boolean = False;
EnergieCheatAktiv: Boolean = False;
Caveadress1, Caveadress2, Caveadress3: Cardinal;

implementation

{$R *.dfm}

const
PROCESS : String = 'game.dat'; // Prozessname des Spiels
GOLDSAMMELN: Integer = $00566D77; // Adresse 1 Gold
GOLDAUSGEBEN: Integer = $00566CD5; // Adresse 2 Gold
ENERGIEVERBRAUCH: Integer = $00566EBF; // Adresse Energieverbrauch
ID = $FF;
JmpGoldSammeln:array[0..10] of byte = ($68,$00,$00,$00,$00,$C3,$90,$90,$90,$90,$90);
JmpGoldSammelnOriginal:array[0..10] of byte = ($89,$46,$04,$C7,$44,$24,$74,$FF,$FF,$FF,$FF);
JmpGoldAusgeben:array[0..10] of byte = ($68,$00,$00,$00,$00,$C3,$90,$90,$90,$90,$90);
JmpGoldAusgebenOriginal:array[0..10] of byte = ($89,$47,$04,$C7,$44,$24,$74,$FF,$FF,$FF,$FF);
JmpEnergieverbrauch:array[0..7] of byte = ($68,$00,$00,$00,$00,$C3,$90,$90);
JmpEnergieverbrauchOriginal:array[0..7] of byte = ($89,$4E,$08,$8B,$C1,$8B,$4E,$0C);
// $00004E20; 20000 Gold (Bytes 2-5)
CodeCave1:array[0..21] of byte = ($B8,$20,$4E,$00,$00,$89,$46,$04,$C7,$44,$24,$74,$FF,$FF,$FF,$FF,$68,$82,$6D,$56,$00,$C3);
CodeCave2:array[0..21] of byte = ($B8,$20,$4E,$00,$00,$89,$47,$04,$C7,$44,$24,$74,$FF,$FF,$FF,$FF,$68,$E0,$6C,$56,$00,$C3);
CodeCaveEnergieverbrauch:array[0..18] of byte = ($B9,$00,$00,$00,$00,$89,$4E,$08,$8B,$C1,$8B,$4E,$0C,$68,$C7,$6E,$56,$00,$C3);

function GetID(Const ExeFileName: string; var ProcessId: integer): boolean;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := false;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do begin
if (StrIComp(PChar(ExtractFileName(FProcessEntry32.szExeFile)),PChar(ExeFileName)) = 0)
or (StrIComp(FProcessEntry32.szExeFile,PChar(ExeFileName)) = 0) then begin
ProcessId:= FProcessEntry32.th32ProcessID;
result := true;
break;
end;
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end; // function GetID

function GetAdress(Pidhandle: Integer; BasePointer: Cardinal; Offsets: Array of Cardinal) : Cardinal;
var
i, Anzahl: Integer;
Written: Cardinal;
begin
Written := 0;
Result := BasePointer;
Anzahl := High(Offsets);
if Anzahl = 1 then
Result := Result + Offsets[1]
else begin
for i := 1 to Anzahl do begin
ReadProcessMemory(Pidhandle, Pointer(Result), @Result, 4, Written);
Result := Result + Offsets[i];
end;
end;
end; // function GetAdress

procedure WriteBytesToMem(Processhandle, Adress, Written: Cardinal; ByteArray: Array of Byte);
var i: Cardinal;
begin
for i := 0 to high(ByteArray) do
WriteProcessMemory(Processhandle, Pointer(Adress+i), @ByteArray[i], 1, Written);
end; // procedure WriteBytesToMem

procedure Start();
var
Pid: Integer;
Written, lBuf, Adress, Pidhandle: Cardinal;
Offsets: Array of Cardinal;
begin
Pid := 0;
Adress := $0096c9b0;
SetLength (Offsets, 3);
Offsets[1] := $0C;
Offsets[2] := $34;
if GetID(PROCESS, Pid) then begin
Pidhandle := OpenProcess(PROCESS_ALL_ACCESS,False,Pid);
try
lBuf := GetAdress(Pidhandle, Adress, Offsets);
ReadProcessMemory(Pidhandle, Pointer(lBuf), @lBuf, 4, Written);
if lBuf > 0 then begin
RegisterHotKey(Form1.Handle, ID, MOD_Alt, Ord('A'));
RegisterHotKey(Form1.Handle, ID+1, MOD_Alt, Ord('B'));
BaseAddr := VirtualAllocEx(Pidhandle,NIL,2048,MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
Caveadress1 := Cardinal(BaseAddr)+$000;
Caveadress2 := Cardinal(BaseAddr)+$100;
Caveadress3 := Cardinal(BaseAddr)+$200;
WriteBytesToMem(Pidhandle,Caveadress1,Written,CodeCave1);
WriteBytesToMem(Pidhandle,Caveadress2,Written,CodeCave2);
WriteBytesToMem(Pidhandle,Caveadress3,Written,CodeCaveEnergieverbrauch);
Form1.Timer1.Enabled := false;
//ShowMessage(IntToHex(Cardinal(BaseAddr), 8));
end;
finally
closehandle(Pidhandle);
end;
end;
end; // procedure Start

procedure ChangeGoldHack();
var
Pid: Integer;
Written, Pidhandle: Cardinal;
begin
Pid := 0;
Written := 0;
if GetID(PROCESS, Pid) then begin
Pidhandle := OpenProcess(PROCESS_ALL_ACCESS,False,Pid);
try
if not GoldCheatAktiv then begin
WriteBytesToMem(Pidhandle, GOLDSAMMELN, Written, JmpGoldSammeln);
WriteProcessMemory(Pidhandle, Pointer(GOLDSAMMELN+$01), @Caveadress1, 4, Written);
WriteBytesToMem(Pidhandle, GOLDAUSGEBEN, Written, JmpGoldAusgeben);
WriteProcessMemory(Pidhandle, Pointer(GOLDAUSGEBEN+$01), @Caveadress2, 4, Written);
GoldCheatAktiv := true;
end else begin
WriteBytesToMem(Pidhandle, GOLDSAMMELN, Written, JmpGoldSammelnOriginal);
WriteBytesToMem(Pidhandle, GOLDAUSGEBEN, Written, JmpGoldAusgebenOriginal);
GoldCheatAktiv := false;
end;
finally
closehandle(Pidhandle);
end;
end;
end; // procedure Change

procedure ChangeEnergieHack();
var
Pid: Integer;
Written, Pidhandle: Cardinal;
begin
Pid := 0;
Written := 0;
if GetID(PROCESS, Pid) then begin
Pidhandle := OpenProcess(PROCESS_ALL_ACCESS,False,Pid);
try
if not EnergieCheatAktiv then begin
WriteBytesToMem(Pidhandle, ENERGIEVERBRAUCH, Written, JmpEnergieverbrauch);
WriteProcessMemory(Pidhandle, Pointer(ENERGIEVERBRAUCH+$01), @Caveadress3, 4, Written);
EnergieCheatAktiv := true;
end else begin
WriteBytesToMem(Pidhandle, ENERGIEVERBRAUCH, Written, JmpEnergieverbrauchOriginal);
EnergieCheatAktiv := false;
end;
finally
closehandle(Pidhandle);
end;
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
Pid: Integer;
Pidhandle: Cardinal;
begin
Pid := 0;
if GetID(PROCESS, Pid) then begin
Pidhandle := OpenProcess(PROCESS_ALL_ACCESS,False,Pid);
UnRegisterHotKey(Form1.Handle, ID);
UnRegisterHotKey(Form1.Handle, ID+1);
try
VirtualFreeEx(Pidhandle,BaseAddr,0,MEM_RELEASE);
finally
closehandle(Pidhandle);
end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Start();
end;

procedure TForm1.WMHotKey(var Msg: TWMHotkey);
begin
case Msg.IdHotKey of
ID:
begin
ChangeGoldHack();
end;
ID+1:
begin
ChangeEnergieHack();
end;
// Abhängig von der ID wird entschieden, was getan werden soll.
end;
inherited;
end;

end.
[/code]



Es gibt 10 verschiedene Typen von Personen, die, die ich mag und die, die ich nicht verstehen kann...
Suchen
Antworten
iNvIcTUs oRCuS Offline
Super Moderator
****
Beiträge: 2.688
Themen: 529
Registriert seit: Aug 2010
Bewertung: 19
#44
15.09.2012, 20:44
(15.09.2012, 19:54)darius83 schrieb: Öhm machts einen Unterschied? Die Hilfe in RadCE sagte mir, dass der Rückgabewert vom Typ Pointer ist und nicht PByte...

PByte ist ebenfalls ein Pointer. Unschwer zu erkennen an dem großen P.
Ich dachte Du wolltest das Ganze mittels Jumps lösen?! Da müsstest Du das "BaseAdress" als PByte deklarieren anstatt des allgemeinen Pointers. An der Größe selbst ändert sich nichts. Alle Pointer sind 4 Bytes groß.

grEEtZ sILeNt heLLsCrEAm


PS: Dein Quelltext sieht schon ein bissl komisch aus. Die Einrückung alleine ist schon etwas gewöhnungsbedürftig und unübersichtlich. Auch sind teilweise überflüssige Elemente enthalten wie z.B...
[code=Delphi]if (StrIComp(PChar(ExtractFileName(FProcessEntry32.szExeFile)),
PChar(ExeFileName)) = 0)
or (StrIComp(FProcessEntry32.szExeFile,
PChar(ExeFileName)) = 0) then begin[/code]

Das reicht völlig aus...
[code=Delphi]
var
Const ExeFileName = 'SC2.exe'; //Z.B. von Starcraft 2

(CompareText(ProcessEntry.szExeFile, ExeFileName) =0)[/code]
Die Hotkey Funktion hab ich bei weitem nicht so kompliziert gestaltet...
Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer !!!

Traineranfragen per PM werden prinzipiell gelöscht...

[Bild: signatur6akm7.gif]
Suchen
Antworten
darius83 Offline
Junior Member
**
Beiträge: 34
Themen: 2
Registriert seit: Sep 2012
Bewertung: 0
#45
15.09.2012, 21:37 (Dieser Beitrag wurde zuletzt bearbeitet: 15.09.2012, 22:00 von iNvIcTUs oRCuS.)
Öhm ja.... Also ich wollte es eigentlich via Jump lösen, kam aber zum Schluss, dass es mit meinem momentanen Wissen so einfacher geht, daher hab ich den Jump verworfen XD

Was das mit der Einrückung betrifft, tut mir leid, hab vergessen, die Einrückungen wieder raus zu nehmen... Die sind nur drin, weil ich im Editor nicht mehr in eine Zeile bekomme ohnenach rechts und links scrollen zu müssen un das finde ich dann ein wenig nervig, wenn man zwischendurch mal was ändern will... Werd die Einrückungen nochmal anpassen XD

Was ist denn da noch so alles überflüssig?
Und wieso ist die Hotkey-Funktion kompliziert? finds eig recht einfach...


LG Darius83

Edit1: So, hab den Post mit dem Quelltext nochmal editiert, hoffe, er ist nun etwas einfacher zu lesen :P
Es gibt 10 verschiedene Typen von Personen, die, die ich mag und die, die ich nicht verstehen kann...
Suchen
Antworten
iNvIcTUs oRCuS Offline
Super Moderator
****
Beiträge: 2.688
Themen: 529
Registriert seit: Aug 2010
Bewertung: 19
#46
15.09.2012, 22:00
Z.B. so...



[code=Delphi]type
private
Procedure Hotkeyused( var Msg: TWMHotkey ); message WM_HOTKEY;

procedure TForm1.FormCreate(Sender: TObject);
begin
//Beispiele
RegisterHotkey (Handle, 1, 0, VK_NUMPAD0);
RegisterHotkey (Handle, 2, 0, VK_NUMPAD1);
RegisterHotkey (Handle, 3, 0, VK_NUMPAD2);
RegisterHotkey (Handle, 4, 0, VK_NUMPAD3);
RegisterHotkey (Handle, 5, 0, VK_NUMPAD4);
RegisterHotkey (Handle, 6, 0, VK_NUMPAD5);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// Hotkeys wieder freigegeben...
UnregisterHotKey(Handle, 1);
UnregisterHotKey(Handle, 2);
UnregisterHotKey(Handle, 3);
UnregisterHotKey(Handle, 4);
UnregisterHotKey(Handle, 5);
UnregisterHotKey(Handle, 6);
end;

Procedure TForm1.Hotkeyused( Var msg: TWMHotkey );
Begin
// - Hotkey Num0
If msg.hotkey = 1 Then Begin
...
end // Hotkey Num0 Funktion beendet
else

// - Hotkey Num1
If msg.hotkey = 2 Then Begin
...
end // Hotkey Num1 Funktion beendet
else

// - Hotkey Num2
If msg.hotkey = 3 Then Begin
...
end // Hotkey Num2 Funktion beendet
else

...
...
...

end;[/code]
Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer !!!

Traineranfragen per PM werden prinzipiell gelöscht...

[Bild: signatur6akm7.gif]
Suchen
Antworten
darius83 Offline
Junior Member
**
Beiträge: 34
Themen: 2
Registriert seit: Sep 2012
Bewertung: 0
#47
16.09.2012, 00:17
(15.09.2012, 22:00)sILeNt heLLsCrEAm schrieb: Z.B. so...



[code=Delphi]type
private
Procedure Hotkeyused( var Msg: TWMHotkey ); message WM_HOTKEY;

procedure TForm1.FormCreate(Sender: TObject);
begin
//Beispiele
RegisterHotkey (Handle, 1, 0, VK_NUMPAD0);
RegisterHotkey (Handle, 2, 0, VK_NUMPAD1);
RegisterHotkey (Handle, 3, 0, VK_NUMPAD2);
RegisterHotkey (Handle, 4, 0, VK_NUMPAD3);
RegisterHotkey (Handle, 5, 0, VK_NUMPAD4);
RegisterHotkey (Handle, 6, 0, VK_NUMPAD5);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// Hotkeys wieder freigegeben...
UnregisterHotKey(Handle, 1);
UnregisterHotKey(Handle, 2);
UnregisterHotKey(Handle, 3);
UnregisterHotKey(Handle, 4);
UnregisterHotKey(Handle, 5);
UnregisterHotKey(Handle, 6);
end;

Procedure TForm1.Hotkeyused( Var msg: TWMHotkey );
Begin
// - Hotkey Num0
If msg.hotkey = 1 Then Begin
...
end // Hotkey Num0 Funktion beendet
else

// - Hotkey Num1
If msg.hotkey = 2 Then Begin
...
end // Hotkey Num1 Funktion beendet
else

// - Hotkey Num2
If msg.hotkey = 3 Then Begin
...
end // Hotkey Num2 Funktion beendet
else

...
...
...

end;[/code]

Und wo ist da der Unterschied zu meiner Version, ausser dass ich die hotkeys erst registriere, wenn das Spiel läuft und ich meinen Keys via Variable eine ID zuweise?




[code=delphi]
const
ID = $FF;
//...
type
TWMHotkey = record
Msg: Cardinal;
idHotKey: Word;
Modifiers: Integer;
VirtKey: Integer;
end;
//...
private
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
//...
procedure Start();
//...
RegisterHotKey(Form1.Handle, ID, MOD_Alt, Ord('A'));
RegisterHotKey(Form1.Handle, ID+1, MOD_Alt, Ord('B'));
//...
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
//...
UnRegisterHotKey(Form1.Handle, ID);
UnRegisterHotKey(Form1.Handle, ID+1);
//...
procedure TForm1.WMHotKey(var Msg: TWMHotkey);
begin
case Msg.IdHotKey of
ID:
begin
ChangeGoldHack();
end;
ID+1:
begin
ChangeEnergieHack();
end;
// Abhängig von der ID wird entschieden, was getan werden soll.
end;
inherited;
end;
[/code]

LG Darius83
Es gibt 10 verschiedene Typen von Personen, die, die ich mag und die, die ich nicht verstehen kann...
Suchen
Antworten
iNvIcTUs oRCuS Offline
Super Moderator
****
Beiträge: 2.688
Themen: 529
Registriert seit: Aug 2010
Bewertung: 19
#48
16.09.2012, 19:33 (Dieser Beitrag wurde zuletzt bearbeitet: 16.09.2012, 19:34 von iNvIcTUs oRCuS.)
Z.B. kann ich so diesen Überfluss weglassen...
[code=delphi]
const
ID = $FF;
//...
type
TWMHotkey = record
Msg: Cardinal;
idHotKey: Word;
Modifiers: Integer;
VirtKey: Integer;
end;[/code]

Ich habe ja nicht behauptet das Deine Lösung gänzlich unnütz/überflüssig ist.
Aber in deinem Quelltext muss man sich erstmal zurechtfinden.
Du könntest auch die Variablendeklarationen die in mehreren Funktionen/Prozeduren auftauchen nur einmal global deklarieren.
Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer !!!

Traineranfragen per PM werden prinzipiell gelöscht...

[Bild: signatur6akm7.gif]
Suchen
Antworten
darius83 Offline
Junior Member
**
Beiträge: 34
Themen: 2
Registriert seit: Sep 2012
Bewertung: 0
#49
16.09.2012, 22:05 (Dieser Beitrag wurde zuletzt bearbeitet: 16.09.2012, 23:03 von darius83.)
Gut, da geb ich dir recht Wink Na mal schaun, was sich da noch so machen lässt... Ist wirklich ein wenig unübersichtlich das ganze... Ich werds mir nochmal vornehmen

LG Darius83

Edit1:

So habs nochmal ein wenig aufgeräumt...
Ich hoffe, es ist jetzt ein wenig übersichtlicher geworden Wink




[code=delphi]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, tlhelp32, ExtCtrls, StdCtrls;
type
TWMHotkey = record
Msg: Cardinal;
idHotKey: Word;
Modifiers: Integer;
VirtKey: Integer;
end;

type
TForm1 = class(TForm)
Timer1: TTimer;
Memo1: TMemo;
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
public
end;

var
Form1: TForm1;
Pid: Integer = 0;
BaseAddr: Pointer;
GameGestartet: Boolean = False;
GoldCheatAktiv: Boolean = False;
EnergieCheatAktiv: Boolean = False;
Written, Caveadress1, Caveadress2, Caveadress3, Pidhandle: Cardinal = 0;

implementation

{$R *.dfm}

const
PROCESS : String = 'game.dat'; // Prozessname des Spiels
GOLDSAMMELN: Integer = $00566D77; // Adresse 1 Gold
GOLDAUSGEBEN: Integer = $00566CD5; // Adresse 2 Gold
ENERGIEVERBRAUCH: Integer = $00566EBF; // Adresse Energieverbrauch
ID = $FF;
JmpGoldSammeln:array[0..10] of byte = ($68,$00,$00,$00,$00,$C3,$90,$90,$90,$90,$90);
JmpGoldSammelnOriginal:array[0..10] of byte = ($89,$46,$04,$C7,$44,$24,$74,$FF,$FF,$FF,$FF);
JmpGoldAusgeben:array[0..10] of byte = ($68,$00,$00,$00,$00,$C3,$90,$90,$90,$90,$90);
JmpGoldAusgebenOriginal:array[0..10] of byte = ($89,$47,$04,$C7,$44,$24,$74,$FF,$FF,$FF,$FF);
JmpEnergieverbrauch:array[0..7] of byte = ($68,$00,$00,$00,$00,$C3,$90,$90);
JmpEnergieverbrauchOriginal:array[0..7] of byte = ($89,$4E,$08,$8B,$C1,$8B,$4E,$0C);
// $00004E20; 20000 Gold (Bytes 2-5)
CodeCave1:array[0..21] of byte = ($B8,$20,$4E,$00,$00,$89,$46,$04,$C7,$44,$24,$74,$FF,$FF,$FF,$FF,$68,$82,$6D,$56,$00,$C3);
CodeCave2:array[0..21] of byte = ($B8,$20,$4E,$00,$00,$89,$47,$04,$C7,$44,$24,$74,$FF,$FF,$FF,$FF,$68,$E0,$6C,$56,$00,$C3);
CodeCaveEnergieverbrauch:array[0..18] of byte = ($B9,$00,$00,$00,$00,$89,$4E,$08,$8B,$C1,$8B,$4E,$0C,$68,$C7,$6E,$56,$00,$C3);

function GetID(Const ExeFileName: string; var ProcessId: integer): boolean;
//Funktion zum Suchen der ProzessID
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := false;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do begin
if (StrIComp(PChar(ExtractFileName(FProcessEntry32.szExeFile)),PChar(ExeFileName)) = 0)
or (StrIComp(FProcessEntry32.szExeFile,PChar(ExeFileName)) = 0) then begin
ProcessId:= FProcessEntry32.th32ProcessID;
result := true;
break;
end;
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end; // function GetID

function GetAdress(Pidhandle: Integer; BasePointer: Cardinal; Offsets: Array of Cardinal) : Cardinal;
// Kleine Hilfsfunktion um eine Adresse via Basisadresse und Offsets zu suchen.
var
i, Anzahl: Integer;
begin
Result := BasePointer;
Anzahl := High(Offsets);
if Anzahl = 1 then
Result := Result + Offsets[1]
else begin
for i := 1 to Anzahl do begin
ReadProcessMemory(Pidhandle, Pointer(Result), @Result, 4, Written);
Result := Result + Offsets[i];
end;
end;
end; // function GetAdress

procedure WriteBytesToMem(Processhandle, Adress, Written: Cardinal; ByteArray: Array of Byte);
// Kleine Hilfsprozedur, um ein Array of Byte in den Speicher zu schreiben
var i: Cardinal;
begin
for i := 0 to high(ByteArray) do
WriteProcessMemory(Processhandle, Pointer(Adress+i), @ByteArray[i], 1, Written);
end; // procedure WriteBytesToMem

procedure Start();
{*
Hier wird, wenn der Trainer das Spiel als gestartet erkennt, einmalig
Speicher im Prozess reserviert und die Codecaves in den neuen Speicher
geschrieben.
*}
var
lBuf, Adress: Cardinal;
Offsets: Array of Cardinal;
begin
Adress := $0096c9b0;
SetLength (Offsets, 3);
Offsets[1] := $0C;
Offsets[2] := $34;
if GetID(PROCESS, Pid) then begin
Pidhandle := OpenProcess(PROCESS_ALL_ACCESS,False,Pid);
try
lBuf := GetAdress(Pidhandle, Adress, Offsets);
ReadProcessMemory(Pidhandle, Pointer(lBuf), @lBuf, 4, Written);
if lBuf > 0 then begin
BaseAddr := VirtualAllocEx(Pidhandle,NIL,2048,MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
Caveadress1 := Cardinal(BaseAddr)+$000;
Caveadress2 := Cardinal(BaseAddr)+$100;
Caveadress3 := Cardinal(BaseAddr)+$200;
WriteBytesToMem(Pidhandle,Caveadress1,Written,CodeCave1);
WriteBytesToMem(Pidhandle,Caveadress2,Written,CodeCave2);
WriteBytesToMem(Pidhandle,Caveadress3,Written,CodeCaveEnergieverbrauch);
//ShowMessage(IntToHex(Cardinal(BaseAddr), 8));
end;
finally
closehandle(Pidhandle);
end;
end;
end; // procedure Start

procedure ChangeGoldHack();
// Hier wird das Vermögen im Spiel eingefroren auf 20000 Gold
begin
if GetID(PROCESS, Pid) then begin
Pidhandle := OpenProcess(PROCESS_ALL_ACCESS,False,Pid);
try
if not GoldCheatAktiv then begin
WriteBytesToMem(Pidhandle, GOLDSAMMELN, Written, JmpGoldSammeln);
WriteProcessMemory(Pidhandle, Pointer(GOLDSAMMELN+$01), @Caveadress1, 4, Written);
WriteBytesToMem(Pidhandle, GOLDAUSGEBEN, Written, JmpGoldAusgeben);
WriteProcessMemory(Pidhandle, Pointer(GOLDAUSGEBEN+$01), @Caveadress2, 4, Written);
GoldCheatAktiv := true;
end else begin
WriteBytesToMem(Pidhandle, GOLDSAMMELN, Written, JmpGoldSammelnOriginal);
WriteBytesToMem(Pidhandle, GOLDAUSGEBEN, Written, JmpGoldAusgebenOriginal);
GoldCheatAktiv := false;
end;
finally
closehandle(Pidhandle);
end;
end;
end; // procedure Change

procedure ChangeEnergieHack();
//Hier wird der Energieverbrauch-Cave aktiviert/deaktiviert
begin
if GetID(PROCESS, Pid) then begin
Pidhandle := OpenProcess(PROCESS_ALL_ACCESS,False,Pid);
try
if not EnergieCheatAktiv then begin
WriteBytesToMem(Pidhandle, ENERGIEVERBRAUCH, Written, JmpEnergieverbrauch);
WriteProcessMemory(Pidhandle, Pointer(ENERGIEVERBRAUCH+$01), @Caveadress3, 4, Written);
EnergieCheatAktiv := true;
end else begin
WriteBytesToMem(Pidhandle, ENERGIEVERBRAUCH, Written, JmpEnergieverbrauchOriginal);
EnergieCheatAktiv := false;
end;
finally
closehandle(Pidhandle);
end;
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
{*
Hier werden die registrierten Hotkeys wieder freigegeben und falls
das Spiel noch läuft, der reservierte Speicher für den Trainer
ebenfalls.
*}
begin
UnRegisterHotKey(Form1.Handle, ID);
UnRegisterHotKey(Form1.Handle, ID+1);
if GetID(PROCESS, Pid) then begin
Pidhandle := OpenProcess(PROCESS_ALL_ACCESS,False,Pid);
try
VirtualFreeEx(Pidhandle,BaseAddr,0,MEM_RELEASE);
finally
closehandle(Pidhandle);
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
//Hier werden die für den Trainer benötigten Hotkeys angelegt
begin
RegisterHotKey(Form1.Handle, ID, MOD_Alt, Ord('A'));
RegisterHotKey(Form1.Handle, ID+1, MOD_Alt, Ord('B'));
end;

procedure TForm1.Timer1Timer(Sender: TObject);
{*
Prüfen, ob das Spiel gestartet ist,
wenn ja, schreibe die Codecaves und aktiviere die Hotkeys,
wenn nein, warte 1 Sekunde, dann prüfe erneut.
*}
begin
if not GameGestartet then
Start()
else begin
if GetID(PROCESS, Pid) then
GameGestartet := true
else
GameGestartet := false;
end;
end;

procedure TForm1.WMHotKey(var Msg: TWMHotkey);
{*
Hier wird geprüft, ob das Spiel bereits läuft.
Wenn ja, dann werden die Hotkeys ausgewertet und je nachdem,
welche Tastenkombination betätigt wurde, der entsprechende
Bereich ausgeführt. Dieser enthält entweder den Originalcode
oder aber den Sprung zur Codecave.
*}
begin
if GameGestartet then
case Msg.IdHotKey of
ID:
begin
ChangeGoldHack();
end;
ID+1:
begin
ChangeEnergieHack();
end;
// Abhängig von der ID wird entschieden, was getan werden soll.
end;
inherited;
end;

end.
[/code]
Es gibt 10 verschiedene Typen von Personen, die, die ich mag und die, die ich nicht verstehen kann...
Suchen
Antworten
darius83 Offline
Junior Member
**
Beiträge: 34
Themen: 2
Registriert seit: Sep 2012
Bewertung: 0
#50
19.09.2012, 21:09
Hmm ich hab da nochmal eine ganz bescheidene Frage... Und zwar ändere ich ja bisher mit den CodeCaves z.B. den Goldwert, wenn er sich sowieso ändern würde... Quasi, wenn mein Geldsammler zurück ist, oder wenn ich Gold ausgebe um etwas zu kaufen. Ist es auch möglich das ganze einfach via Tastendruck zu machen? Also meinetwegen, wenn ich ALT+A drücke, erhöht sich das Gold um 5000 oder brauche ich dafür einen Pointer? Und wenn das Ganze mit Cave möglich ist, wie muss ich da ansetzen?

LG Darius83
Es gibt 10 verschiedene Typen von Personen, die, die ich mag und die, die ich nicht verstehen kann...
Suchen
Antworten
Share Thread:            
Seiten (7): « Zurück 1 ... 3 4 5 6 7 Weiter »


  • Druckversion anzeigen
  • Thema abonnieren


Benutzer, die gerade dieses Thema anschauen:
2 Gast/Gäste

  • Kontakt
  • Forum team
  • Forum stats
  • Nach oben
 
  • RSS-Synchronisation
  • Lite mode
  • Home of Gamehacking - Archiv
  • Help
 
Forum software by © MyBB - Theme © iAndrew 2014



Linearer Modus
Baumstrukturmodus