Autor |
Beitrag |
bieberpelz
      
Beiträge: 26
|
Verfasst: Mo 08.08.05 10:36
Guten Tag,
ich hätte gerne etwas Hilfe eurerseits da ich durch sämtliche Suchen im Internet bisher nichts Hilfreiches finden konnte.
Es geht um folgendes.
Ich habe ein Spiel welches zwischenzeitlich gewisse Daten im RAM Speicher ablegt. Die Adresse dazu habe ich.
Nun möchte ich wissen wie es mir möglich ist diese Stellen im RAM-Speicher auslesen zu können um dessen Werte zu erhalten.
Zu dem Spiel: Es handelt sich hierbei um ein MMOPG wo ich gerne die Erfahrungspunkte genauer auslesen möchte. Diese ist zwar durch mehrere Programme/Tools möglich, diese sind aber verboten da diese auch andere verwendungen besitzen die illegal sind. Spricht dieses soll dann ein legales Tool für die Community werden. Diese wurde auch von dem Betreiber abgesegnet so das ich es nur einmals vorführen muss um es veröffentlichen zu dürfen.
Mein Problem ist halt nur die mangelnde Erfahrung bezüglich des auslesen und den Wert zu erhalten.
Und daher brauche ich hilfe ausserhalb. Ich erwähne euch auch gerne in den Creditz oder verlinke in dem Tool wenn ihr es möchtet.
Ich wäre über Hilfe jeglicher art imens dankbar.
Mfg Bieberpelz
P.S. Welche Entwicklungsumgebung ich nutze ist mir dabei egal.
P.P.S. Wüste nicht in welche Sektion es sonst gehört.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 08.08.05 10:57
SPIELETRAINER READPROCESSMEMORY WRITEPROCESSMEMORY VIRTUALPROTECT
Alles andere müsste klar sein ...
P.S.: Ich empfehle die Verwendung eines HEX-Editors a la WinHex
P.P.S.: Die genaue Stelle musst Du selber ermitteln
P.P.P.S.: Das ändert aber nix daran, dass man über versteckte ShortCuts auch die Erfahrungspunkte schreiben kann  Hintertüren sind zum einfügen da ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
bieberpelz 
      
Beiträge: 26
|
Verfasst: Mo 08.08.05 11:23
Das ist schonmal ein enormer Fortschrit für mich, danker erstmal soweit.
OK, wie ich die Adresse auslesen hätte können hätte ich auch anders erfahren, hier ists aber wesentlich besser erklärt(@Trainer tut).
Dieses Tutorial bezieht sich aber daraus das ich in einem spiel etwas so änder das ich mehr Mineralien/Exp(geht und soll nicht da Serverseitig) etc... hätte oder einfach nichtmehr verliere.
Ich möchte aber nicht die Adresse umschreiben sondern nur auslesen was ich so anhand deiner suchen nicht finden könnte. Soweit ich weis müsste ich dann doch nur an der Stelle an der hier(@Tutorial) umgeschrieben wird einfach ein befehl zum auslesen nutzen und das dann halt in eine textbox ausgeben, richtig? Nur das problem ist das ich keinerlei Ahnung habe wie der Befehl aussehen müste das Stelle XXXX mir die Mineralienanzahl ausgibt.
Könntest du mir da einen kleinen anschubs geben? Sorry das ich da nichts gefunden hatte/habe bezüglich des Themas. Ist leider nicht immer einfach begriffe zum suchen zu finden die man nicht kennt
Viele dank erstma.
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 08.08.05 12:24
anstatt writeprocessmemory (zum schreiben) zu benutzen musst du halt (readprocessmemory) zum lesen benutzen
beim 1. wird der buffer geschrieben an die adresse geschrieben
beim 2. wird der inhalt der adresse in den buffer geschrieben (also die daten an der addresse gelesen)
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
en!gma
      
Beiträge: 378
win xp
delphi 7.0
|
Verfasst: Mo 08.08.05 12:46
hmm mal ne andere frage, hab auch schonmal drüber nachgedacht so ein ähnliches programm zu schreiben.
aber da oft dynamische variablen benutzt werden, müsste ich das ganze ja mit einem codecave machen,
wie sieht es damit aus, ist das immernoch legal?
denn ich müsste die exe datei ja erst patchen um einen codecave zu erstellen
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 08.08.05 13:11
ich war mal so frei und hab zu meiner uallCollection ein Trainer beispiel hinzugefügt
uall.overclock.ch/uallCollection.zip (immer neuste version, aber vill manchmal down)
Einloggen, um Attachments anzusehen!
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
bieberpelz 
      
Beiträge: 26
|
Verfasst: Mo 08.08.05 13:16
Was genau du nun mit codecaven meinst(ka was das ist) weis ich nun nicht aber soweit es mir bekannt ist muss ich die Exe des Spieles welches ich meine nicht patchen. Wofür denn?
Die Adresse sollte sich ja leicht herauszufinden sein, wie du in deinem Tutorial schreibst. Besonders da Exp angaben eine einzelnen Monster ja vorhanden sind. Und dann müsste die Sache ja nurnoch aus dem Ram gelesen werden lassen und im Programm angezeigt werden.
Bzw wozu dynamische Variablen? Die Adresse ist bis zum nächsten Patch immer die selbe, danach müsste nur der Code, der in eine .ini soll, wieder geändert werden damit er weis wo er zu suchen hat. Das sollen die User dann manuell machen oder eventuel mit nem updater. Mal schauen.
Legal und illegal ist halt solch eine Sache. Laut dessen Betreiber der Europäischen Version sollte es tolleriert werden soweit, nicht wie bei den anderen Tools, keine anderen Funktionen beinhaltet sind die dem Spieler das spielen erleichtern.
Es soll sich halt nur um eine reine Information Sache handeln die das Tool ausgibt, die eher das Rechnen erleichter bzw genauer nimmt.
Danke erstmal für die antworten.
Fals du möchtest kannst du es mir ja erklären was du bezüglich patchen etc... meinst, weis nu nicht genau was du meinst.
Edit: Oh, danke für die beispiele, ich werde mal versuche da was raus zu verstehen und mir anscheuan wenn ich back @ home bin
|
|
en!gma
      
Beiträge: 378
win xp
delphi 7.0
|
Verfasst: Mo 08.08.05 13:37
fast alle games heutzutage benutzen dynamische variablen.
jedes mal wenn du das spiel neustartest, benutzt das spiel andere speicherplätze für die variablen.
wenn du einen trainer schreiben möchtest, wie willst du dann die addresse rausfinden die du patchen musst?
es geht einfach nicht, da sie sich ständig ändert.
also muss man aus einer dynamischen variable, eine statische machen.
also so, dass das programm die variablen immer an der gleichen stelle speichert.
dann kannst du fest sagen, dass du auf die und die variable an der und der position zugreifen willst.
und das macht man halt mit einem codecave soweit ich das verstanden hab
|
|
bieberpelz 
      
Beiträge: 26
|
Verfasst: Mo 08.08.05 13:41
Bei dem Game ist es allgemein bekannt welcher Server welche Adressen in der .ini benutzt. Die halten immer bis zum nächsten update und werden in der illegalen Szene bekannt gegeben. Bis auf die der europäischen version halt, da ists nicht so bekannt.
Aber auch die kann man kriegen. Somit müssen diese Adressen dann statisch sein weil da nie was gepatcht werden musste, nur die Ini musste funktionieren und er die Daten ausgelesen.
Ich werde es einfach nachher mal testen aber normalerweise sollte bei diesem spiel, zu dem Thema, nicht dynamisch sein. Hoffe das ich mich da jetzt nicht vertue
|
|
bieberpelz 
      
Beiträge: 26
|
Verfasst: Mo 08.08.05 18:21
Nun habe ich ein Problem, habe mir deine Sachen dort gedownloaded und dort dann halt die trainer.dpr gestartet.
Mal auf play und schon hat er folgedens Problem.
Quelltext 1: 2: 3: 4: 5:
| [Error] trainer.dpr(7): Identifier expected but '..' found [Error] trainer.dpr(7): Illegal character in input file: '\' ($5C) [Error] trainer.dpr(8): Identifier expected but '..' found [Error] trainer.dpr(8): Illegal character in input file: '\' ($5C) [Fatal Error] trainer.dpr(8): File not found: 'source.dcu' |
Das an folgender Stelle im Quellcode
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| uses windows, ..\..\source\uallUtil, ..\..\source\uallProcess;
{ memory reading/writing example game executable = game.exe game memory = $00405664 size of memory = 4
if u want to read more memory u have to change the buffer to ex. buf: array [0..255] of byte; } |
Mag sich vielleicht doof anhören aber ich bin nicht gerade der Crack in Delphi und weis beim besten wille nicht wie ich mit deinen Beispielen umzugehen habe.
Wäre wirklich über Hilfe froh, am besten wenn man dich mal kontaktieren könnte. Mit den bisherigen sachen komme ich kein stück weiter, auch nicht das Tutorial bezüglich des Trainers, dort macht der erst garnichts.
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Mo 08.08.05 18:48
das müsste wohl eher so aussehen:
Delphi-Quelltext 1: 2: 3: 4:
| uses windows, uallutil in '..\..\source\uallUtil.pas', uallprocess in '..\..\source\uallProcess.pas'; |
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 08.08.05 18:48
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
bieberpelz 
      
Beiträge: 26
|
Verfasst: Mo 08.08.05 19:38
Viele Dank schonmal bis hier hin, nun habe ich mir irgendwie aus den erhaltenen Sachen was gestrickt und soweit erkennt er ja das das Game auch da ist.
2 Sachen kriege ich momentan nicht raus, um weitere Hilfe wäre ich dankbar.
1. Das Programm stürzt ab sobald ich das gesuchte Spiel nicht habe. Was fehlt? Schliesslich musste ich es von der Consolenversion zu einer Formular Version abändern.
2. Ich habe bisher nur Blödsinn mit der ReadProcessMemory Function erhalten. Habe es in BoolToStr umgewandelt und es kommt 0 raus was nicht richtig sein sollte.
Irgendwie ne idee was ich falsch mache?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uallUtil, uallProcess, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; edtTest: TEdit; edtexp: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var pr: integer; read: cardinal; buf: integer; begin edtTest.Text := 'searching game.exe... press ED t abort'; repeat pr := FindProcess('ragexe.exe'); sleep(1000); until (pr > 0) or ((GetAsyncKeystate(VK_END) and 1) = 1); if pr > 0 then begin edtTest.text:='Gefunden'; edtTest.text:= BoolToStr(ReadProcessMemory(pr,pointer($7052F8),@buf,sizeof(buf),read)); end else
end; end. |
Dazu muss ich sagen das ich in der ReadProcessMemory die Adresse beim Pointer geändert habe in die Adresse die ich suche, also
ReadProcessMemory(pr,pointer($00405664),@buf,sizeof(buf),read)
in
ReadProcessMemory(pr,pointer($7052F8),@buf,sizeof(buf),read)
wobei ich irgendwie befürchte das das verkehrt ist.
Wie kriege ich es nun hin das die Adresse 7052F8 aus dem RAM mir den richtigen wert zurück gibt?
Viele Dank für die Hilfe bissher. Ich wäre euch danbar wenn ihr mir da weiter helfen könnt.
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 08.08.05 19:42
das was du im moment gemacht hast macht nicht viel sinn
1.) stürzt das programm nicht ab sondern es hängt nur
2.) der rückgabewert steh in buf als integer und nicht etwa der rückgabewert von RPM -> der sollte 4 sein
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
bieberpelz 
      
Beiträge: 26
|
Verfasst: Mo 08.08.05 19:48
Ó.o nu bin ich verwirrt
OK, das es nicht viel Sinn macht glaube ich, schlieslich habe ich nicht viel verstanden.
Nur leider weis ich nicht wie weiter um den Rückgabewert der RAM Adresse zu kriegen.
Mir wurden diese Beispiele gezeigt und gesagt ich solle dieser ReadProcessMemory nutzen, welchen ich aus dem Beispiel versucht habe zu nutzen. Leider anscheinend verkehrt oder ich denk komplett verkehrt.
Könntest du mir vielleich einen Tip geben was ich ändern müsste um halt einen Rückgabewert zu erhalten?
Nochmals vielen Danke ^_^
Edit: Vielleich frage ich mal anders. Wo muss ich meine Adresse angeben und wie muss ich welche funktion anwenden so das ich dann die DAte als ausgabewert erhalte?
Oh man ist mir das peinlich
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 08.08.05 19:52
der ist in BUF drin nach dem aufruf von RPM
kompilier mal das beispiel (starte die game2.exe) danach dann die Trainer.exe und an dem text der ausgegeben wird kannste dir das ja zusammenreimen wie das funktioniert
sorry aber totalen anfängern helf ich nicht, da das für diese noch zu hoch ist, und sie machen nur copy&paste was ic nicht wirklich unterstützen will
für alle anderen fragen such aml anch dem crashkurs, da kannst dann erstmal was über die delphi grundlagen lernen
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
bieberpelz 
      
Beiträge: 26
|
Verfasst: Mo 08.08.05 20:33
Edit: Habe es anderweitig rausgefunden, habe bemerkt das diese Dinge da nicht wirklich so zu geeignet waren und demnach viel zu kompliziert. Zusätzlich hat dieses andere werte ausgegeben als die Möglichkeit jetzt.
Trotzdem danke, mein Problem ist gelöst.
|
|
|