Delphi-Forum.de Delphi-Library.de
C-Sharp-Forum.de C-Sharp-Library.de
Registrieren Login Suche Hilfe Sitemap
Spiele Trainer erstellen
spacer
Autor Nachricht
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star

Beiträge: 1783
Dabei seit: 13.08.2004


Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Di 04.03.08 10:48  Antworten mit Zitat Beitrag melden
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var bla: array[0..5of byte = ($90,$90,$90,$90,$90,$90);
// bzw = ($D9,$9E,$F4,$1B,$00,$00)
procedure TForm1.Button1Click(Sender: TObject);
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);
              WriteProcessMemory(HandleWindow,pointer($480802), @bla[0],6,write);
    closehandle(HandleWindow);
    MessageDlg('Geld ist eingefroren',  mtwarning,[mbOK],0);
end;


versuch mal obiges

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Private Nachricht sendenPosting in privater Nachricht zitieren
cherrymoon69
Hält's aus hier

Beiträge: 12
Dabei seit: 09.02.2008



BeitragVerfasst: Di 04.03.08 15:43  Antworten mit Zitat Beitrag melden
vielen dank. das scheint so zu funktionieren.

aber es gibt das nächste problem. wenn ich in einen bereich des speichers schreiben möchte wo noch nichts steht, also z.b.:
00400F87 - 00 00 - add [eax],al

dann schreibt die prozedur nichts. absolut keine veränderung. weiß jemand rat? ich möchte an diese position 22 Bytes (als hex) schreiben.

---Moderiert von Narses: Beiträge zusammengefasst---

habe etwas rausgefunden. wenn ich mit ein em hexeditor mir die speicheradresse angucke, gibt es die option make writable. wenn ich das mache, kann ich mit der prozedur meinen wert schreiben. ich suche jetzt also eine lösung um einen speicherbereich von 22 byte schreibfähig zu machen. wie geht das in kombination mit der oben genannten prozedur?
Private Nachricht sendenPosting in privater Nachricht zitieren
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star

Beiträge: 1783
Dabei seit: 13.08.2004


Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 05.03.08 13:43  Antworten mit Zitat Beitrag melden
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
var old: DWord;
begin
VirtualProtectEx(processhandle, pointer(@addresse{$00400F87}), size{22}, PAGE_EXECUTE_READWRITE, old);
WriteProcessMemory(processhandle...);
VirtualProtectEx(processhandle, pointer(@addresse{$00400F87}), size{22}, old, old);


das gilt aber nur wenn der speicher schon existiert. du schreibst da den imageheader putt, wenn du selbst speicher brauchst dann hol dir welchen mit

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
var mem: pointer;
begin
mem := VirtualAllocEx(processhandle, nil, size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(processahndle,...);
VirtualFreeEx(processhandle, mem, 0, MEM_RELEASE);

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Private Nachricht sendenPosting in privater Nachricht zitieren
cherrymoon69
Hält's aus hier

Beiträge: 12
Dabei seit: 09.02.2008



BeitragVerfasst: Mi 05.03.08 14:11  Antworten mit Zitat Beitrag melden
das mit dem speicher holen klingt interessant, aber welche adresse bekomme ich dann?

ich muß ja den jmp-befehl auf diese adresse legen.

vielen dank soweit.

acj ja. und was macht diese zeile?

VirtualProtectEx(processhandle, pointer(@addresse{$00400F87}), size{22}, old, old);
Private Nachricht sendenPosting in privater Nachricht zitieren
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star

Beiträge: 1783
Dabei seit: 13.08.2004


Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 05.03.08 18:55  Antworten mit Zitat Beitrag melden
den Jump-Befehl kannst du ja dynamisch berechnen, ein $E9 distance jump berechnet man durch ZUadresse-VONadresse-5
das VirtualProtect setzt wieder den alten Wert, sollte es aber ausführbarer code bleiben solltest du es auf PAGE_EXECUTE_READWRITE belassen

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Private Nachricht sendenPosting in privater Nachricht zitieren
cherrymoon69
Hält's aus hier

Beiträge: 12
Dabei seit: 09.02.2008



BeitragVerfasst: Mi 05.03.08 19:00  Antworten mit Zitat Beitrag melden
du hast mir sehr geholfen. danke.

aber:
zitat: den Jump-Befehl kannst du ja dynamisch berechnen, ein $E9 distance jump berechnet man durch ZUadresse-VONadresse-5

habe ich nicht wirklich verstanden. dafür bin ich wohl noch nicht weit genug fortgeschritten, fürchte ich. :roll:
Private Nachricht sendenPosting in privater Nachricht zitieren
bensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star

Beiträge: 44
Dabei seit: 07.12.2006



BeitragVerfasst: Sa 19.04.08 20:11 
Titel: wie sieht das bei dma aus?
Antworten mit Zitat Beitrag melden
der trainer ist ja speziell für sma erstellt wurden. wie würde das jetzt bei dma aussehen?

also ich hab hier ein game, wo sich der wert der mannschaft nach jedem neustart ändert. der wert wird also auf einer dynamischen speicheradresse abgelegt. nun habe ich den static pointer gesucht, der auf die speicheradresse der mannschaft zeigt. den habe ich gefunden, dieser liegt unter der adresse 9D903C. dieser pointer zeigt auf einen weiteren (dynamischen) pointer. ich müsste jetzt also den wert der adresse 9D903C (dem statischen pointer) auslesen, um die adresse für den dynamischen pointer zu erhalten, der widerrum auf die mannschaftsadresse zeigt. wie mache ich das?

das auslesen von der adresse 9D903C habe ich so gemacht:

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
    hProcess: THandle; //Prozesshandle des Spiels
    wert:integer;  //wert des ausgelesenen speichers
    BytesRead: DWORD;
    adresse:pointer;  //adresse, die ausgelesen werden soll
...

adresse:=ptr($9D903C);

ReadProcessMemory(hProcess,adresse,@wert,sizeof(wert), BytesRead );

...


jetzt habe ich einen wert, den ich mit 96 addieren müsste, um an die speicheradresse des nächsten dynamischen pointers zu gelangen. aber da hängt es schon: wie kann ich den eben ausgelesenen wert, der in der variable wert gespeichert wurde, mit 96 addieren, und dann die speicheradresse dieses ergebnisses wieder auszulesen?


EDIT: mir wurde jetzt in diesem thread ( www.delphi-forum.de/....php?p=498803#498803 ) geholfen. falls jemand ähnliche schwierigkeiten hat wie ich, so hats bei mir funktioniert:

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
ReadProcessMemory(hProcess, adresse, @wert, SizeOf(wert), BytesRead);  // originaladresse lesen
adresse := Ptr(wert + $60);  // Wert + 96dez
ReadProcessMemory(hProcess, adresse, @wert, SizeOf(wert), BytesRead);  // eben berechnette adresse auslesen
CloseHandle(hProcess);
Edit1.Text := IntToStr(wert);


gruß bensch
Private Nachricht sendenPosting in privater Nachricht zitieren
gemy
Hält's aus hier

Beiträge: 1
Dabei seit: 15.05.2006



BeitragVerfasst: Do 28.08.08 02:09 
Titel: Mein Erkentnisse darüber.
Antworten mit Zitat Beitrag melden
Hallo,

hab auch mal eine Frage. Momentan schreibe ich in den Speicher fremder Programme mit diese Funktion:


ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function WriteMemory(Adress:Pointer; Buffer:array of char):Bool;
begin
        try
                Result:=False;
                VirtualProtectEx(handlewindow, Pointer(Adress), Length(Buffer), PAGE_EXECUTE_READWRITE, old);
                If (WriteProcessMemory(handleWindow, Pointer(Adress), @Buffer, Length(Buffer), BytesWritten)
                and (BytesWritten = Length(Buffer)))
                then Result:=True else Result:=False;
        finally
        VirtualProtectEx(Handlewindow, Pointer(Adress), Length(Buffer), old, old);
        end;
end;



aufrufen tue ich die Funktion mit:

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
Adress:= Ptr($00400400);
                pcardinal(@buffer[0])^ := $8B4154A3;
                pcardinal(@buffer[4])^ := $00054000;
                pcardinal(@buffer[8])^ := $C3000000;
                pcardinal(@buffer[12])^:= $00000000;
                pcardinal(@buffer[16])^:= $00000000;

                If WriteMemory(Adress, Buffer) = True then Memo1.Lines.Add('OK'else Memo1.Lines.Add('Err');


Klappt auch wunderbar. Was mir nun aufgefallen ist, ist das der Speicher bei $00400400 nicht so beschrieben wird:

8B 41 54 A3 00 05 40 00 C3 00 00 00

sondern so :

A3 54 41 8B

usw.. Also genau umgekehrt. ich habe ganz oben in meinem Project die variable "Buffer: array [0..19] of char;". Nun habe ich aber nicht immer 20 Bytes zum schreiben. Manchmal auch nur 8 oder 12.

Hat jemand eine Lösung oder Function, die


a) die 4 bytes im Buffer immer umdreht, und
b) nur soviel Buffer schreibt wie auch nur tatsächlich bytes da sind.

also manchmal: z.b.

($89,$96,$88,$09,$00,$00,$89,$15,$40,$05,$40,$00,$C3); und ein andermal
($8B,$41,$54,$A3,$00,$05,$40,$00,$C3);.

Also immer verschieden lang.


Gruß, gemy #delphi.de@quakenet
Private Nachricht sendenPosting in privater Nachricht zitieren
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star

Beiträge: 3145
Erhaltene Danke: 10
Dabei seit: 28.12.2005
Wohnort: Österreich, Wien

Windows Vista
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 28.08.08 04:15  Antworten mit Zitat Beitrag melden
probiers doch mal mit einem dynamischen array und einer bitweisen operation (and,or,xor)

lg elundril

_________________
"Und warum studierst du Informatik?" - "Weil ich gerne Computerspiele spiele, programmieren hass ich eigentlich." *wallbash*
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
ness
Hält's aus hier

Beiträge: 7
Dabei seit: 21.07.2009



BeitragVerfasst: Fr 31.07.09 23:41  Antworten mit Zitat Beitrag melden
Ich habe jetzt den vollkommenen Blackout und aus meinem Gehirn spruehen FUNKEN heraus!

Mal ein ganz einfaches Beispiel,damit ich es auch verstehen kann!

Aaalso,keine Angst,mein Ziel ist NICHTS BOESES und damit hole ich mir kein Vorteil,es ist auch kein Internetspiel etc.

Ich habe die Adresse mit CHEAT ENGINE herausgekriegt:

0103EB28

Und der Value betraegt 24!

Type ist 4 Bytes!

Wie kann ich das auf 50 mit Delphi erfolgreich aendern?
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Beiträge vom vorherigen Thema anzeigen:   
home home