Autor |
Beitrag |
derDoc
Beiträge: 623
Win Vista Prof
D2007 Prof
|
Verfasst: Di 06.02.07 11:55
Natürlich geht das auch. Allerdings ist es halt ein wenig Arbeit.
Mit folgenden Quellcode sollte es dennoch funktionieren:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| const ProcessName = 'DeineDatei.exe'; var hSnapshot: THandle; hProcess: THandle; ProcessEntry: TProcessEntry32; Schleife: BOOL; pID: Integer; begin hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); ProcessEntry.dwSize := Sizeof(ProcessEntry); Schleife := Process32First(hSnapshot, ProcessEntry); while Schleife do begin if (CompareText(ProcessEntry.szExeFile, ProcessName) = 0) then pID := ProcessEntry.th32ProcessID; Schleife := Process32Next(hSnapshot, ProcessEntry); end; CloseHandle(hSnapshot); hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); |
_________________ MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
|
|
Wegi
Hält's aus hier
Beiträge: 13
Win XP Pro
Delphi 7 Personal, Turbo Delphi 2006
|
Verfasst: Fr 23.03.07 15:32
Hallo, bin Delphi-Anfänger und habe ein paar fragen dazu... WriteProcessMemory(HandleWindow,ptr($401F75),buf,1,write); //es wird der speicher umgeschrieben in der addresse 401F75 und es wird 1 byte geschrieben WriteProcessMemory(HandleWindow,ptr($401F76),buf,1,write); WriteProcessMemory(HandleWindow,ptr($401F77),buf,1,write); WriteProcessMemory(HandleWindow,ptr($401F78),buf,1,write); WriteProcessMemory(HandleWindow,ptr($401F79),buf,1,write); WriteProcessMemory(HandleWindow,ptr($401F7A),buf,1,write); diese zeile: Wenn ich es richtig verstanden habe muss ich dort um einen Wert mit 8 Zeichen zu ändern nur 4 Zeilen schreiben oder? Und wo kann ich dort den Wert eintragen wenn ich zum Beispiel will das meine Goldmine auf 20000 Aufgestockt oder auf dieser zahl gefreezed wird? Mein Fall: Will den Goldvorrat der Goldmine in Warcraft 3 ändern. Es war die Adresse 4A50444 mit 6F39727. Muss ich also folgendes schreiben?: Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.Button1Click(Sender: TObject); const v1 = $90; begin WindowName := FindWindow(nil,WindowTitle); If WindowName = 0 then MessageDlg('...erst spiel starten...dann trainer starten =)', mtwarning,[mbOK],0) else begin ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId); HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); GetMem(buf,1); buf^ := Chr(v1); WriteProcessMemory(HandleWindow,ptr($4A50444),buf,1,write); WriteProcessMemory(HandleWindow,ptr($4A50445),buf,1,write); WriteProcessMemory(HandleWindow,ptr($4A50446),buf,1,write); WriteProcessMemory(HandleWindow,ptr($4A50447),buf,1,write); FreeMem(buf); closehandle(HandleWindow); end; end; |
_________________ Zitat: | Zitat von: Ernst Waltemathe (*1935), dt. Politiker (SPD)Es gibt Leute, die haben immer schon eine Lösung, bevor überhaupt ein Problem da ist. |
|
|
derDoc
Beiträge: 623
Win Vista Prof
D2007 Prof
|
Verfasst: So 08.04.07 16:07
Ein paar Erläuterungen zu folgendem Quellcode:
Delphi-Quelltext 1:
| WriteProcessMemory(HandleWindow, ptr($401F75), buf, 1, write); |
Wie du richtig erkannst hast, stellt $401F75 die Adresse dar. Zudem wird ein Byte aus der Variable buf dort hingeschrieben. Die Variable write, welche in deinem Beispiel undefiniert wäre, gibt die Anzahl der tatsächlich geschriebenen Bytes wieder.
Weiterhin würdest du in deinem Beispiel den Goldbestand mit 0x90 überschreiben. Das gäbe dir dann ca. 2,5 Mrd. Einheiten. Eigentlich ist 0x90 als Opcode für den Assembler Befehl nop gedacht und soll wohl den Wert einfrieren. Dazu darfst du aber nicht den tatsächlichen Wert überschreiben, sondern musst die entsprechende Funktion - üblicherweise ein sub oder mov Befehl - überschreiben.
Gesetz den Fall, du wolltest nur den Wert ändern, dann kannst du das mit folgendem Code, der schon eine Seite weiter vorne stand, machen:
Delphi-Quelltext 1: 2: 3: 4: 5:
| var Value: Cardinal; begin Value := $FFFFFFFF; WriteProcessMemory(hWindow, ptr($4A50444), @Value, 4, Write); |
_________________ MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
|
|
M4$73R$
Hält's aus hier
Beiträge: 1
|
Verfasst: Fr 03.08.07 00:31
Titel: C&C Tiberium Wars
Hi Leute,
Kann mir jemand dabei helfen einen Trainer für C&C Tiberium Wars zu erstellen?
Ich weis zwar wie ich die resurcen und die energie manipulieren kann weis aber überhaubt nicht wie ich mit TSearch machen kann das ich z.B. Schnell Bauen, Immer die Superwaffen bereit habe oder einheiten unendlich leben geben und Befördern kann?
Das mit "Einheiten befördern" wär mir am wichtigsten, ich denke das es eigentlich gehn müsste da man ja auch Einheiten unendlich leben geben kann.
Wäre für eure HILFE sehr dankbar
|
|
napsterxx
Hält's aus hier
Beiträge: 5
|
Verfasst: Mi 15.08.07 09:42
Also ich wollte mich mal an COmman & Conquer Generäle - Die Stunde Null probieren.
Geldhack!
Adresse für das Geld war schnell gefunden. Wenn ich die in Autohack einfrier bekomm ich beim bauen nichts mehr abgezogen
Nun dachte ich geht das ja auch in Delphi:
Meine Adresse:
Quelltext 1:
| 4ff9d5 mov [edi+0x4],eax |
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| Const WindowTitle = 'Command & Conquer Generäle - Die Stunde Null';
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); const v1 = $90; begin WindowName := FindWindow(nil,WindowTitle); If WindowName = 0 then MessageDlg('', mtwarning,[mbOK],0); ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId); HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); GetMem(buf,1); buf^ := Chr(v1); WriteProcessMemory(HandleWindow,ptr($4FF9D5),buf,1,write); //Habe schon alles getestet anstatt der 1 eine 2,3,4 und 5 FreeMem(buf); closehandle(HandleWindow); end; |
Aber egal was ich als Byte verwende, 1,2,3 oder 4, mein Game stürtzt IMMER ab sobald ich was bauen will, wenn ich auf den button geklickt habe. Kann jemand helfen?
//Edit
Mit Generice Game Trainer hab ich jetzt auch mal die Adresse rausgesucht. Da ist die "Size" aber nicht Byte sonder DWord. Hat das was zu sagen? Ist das vielleicht die Ursache warum mein Game immer abstürzt?
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Fr 17.08.07 13:58
versuch mal:
Delphi-Quelltext 1: 2: 3: 4:
| var buf: integer; begin buf := $90909090; WriteProcessMemory(HandleWindow,ptr($4FF9D5),@buf,3,write); |
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
Dark-§hadow
Beiträge: 24
|
Verfasst: Sa 29.09.07 01:12
Hey!
Ich habe mich am Trainer versucht ( Command & Conquer - Alarmstufe Rot 2) und habe jedoch noch ein paar Probleme. Ich krieg zum Beispiel (es handelt sich um eine dynamische Adresse) nicht die richtige Adresse heraus und ich hab das noch nicht so ganz mit den Hexzahlen verstanden, wie man es ausrechnet, wozu usw.
Wäre dankbar, wenn mir das einer nochmal erklären könnte, am liebsten auch in aller Ruhe über ICQ o.ä., falls Interesse besteht, addet mich doch bitte ICQ: 261-419-131
Ansonsten bin ich natürlich auch über Posts hier im Thread erfreut.
Danke im Vorraus
D-§
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Sa 29.09.07 11:07
irr ich mich oder kann man mit diesem Tutorial auch nen cheat für onlinegames erstellen z.b: Unendlich leben bei WarRock??
lg elundril
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Sa 29.09.07 16:30
@Dark-Shadow: Um an die reale Adresse dranzukommen musst du eben einen Hardware Breakpoint setzen. (Bzw. Das Programm Debuggen) Das ist weitaus schwieriger und ich glaube es hat keiner so viel Zeit das über ICQ zu erklären. (Wenn ich langeweile habe mach ich dazu vielleicht mal ein Tutorial)
@elundril: Die Informationen über HealthPoints/Geld etc. in Onlinespielen wird auf dem Server gespeichert. Hast du Zugriff dadrauf (bzw. hostest selbst einen) dann ist das natürlich möglich.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: So 30.09.07 10:30
ich mein eigentlich so onlinespiele wie Counterstrike. also eine exe die ich ausführe. oder meintest du das eh??
lg elundril
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: So 30.09.07 11:59
genau das meinte ich
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
Regan
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: So 30.09.07 12:41
elundril hat folgendes geschrieben: | ich mein eigentlich so onlinespiele wie Counterstrike. also eine exe die ich ausführe. oder meintest du das eh??
lg elundril |
Des Weiteren sind die meisten CS Server durch Vac geschützt. Das erkennt Veränderungen .
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: So 30.09.07 13:36
ja bei cs aber es gibt ja noch so spiele wie warrock oder americas armz und so weiter. ich wollt eigentlich nur theoretisch fragen. ich hasse cheater sowieso!
lg elundril
|
|
gamer94
Beiträge: 41
Win7 HP, WinXP
Delphi 7 Pers.
|
Verfasst: Sa 17.11.07 14:03
Ich kann die Search-Komponente unter keinem der Links finden. Auch bei Google bin ich nicht fündig geworden. Kennt jemand noch ne Seite, oder kann sie jemand hochladen? Das wäre echt total super!
|
|
KIEZBOZZ
Hält's aus hier
Beiträge: 2
|
Verfasst: Fr 07.12.07 00:23
kann mir einer helfen ein trainer für DIE ERBEN VON ST. PAULI zu erstellen?
ich blick da nämlich voll nicht durch
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 07.12.07 13:00
was sind denn allgemein deine Erfahrungen mit Delphi?? Was hast du schon programmiert und so? Wenn du noch ziemlicher Neuling bist, würd ich dir von diesem Projekt abraten, da es schon sehr "extrem" ist.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
KIEZBOZZ
Hält's aus hier
Beiträge: 2
|
Verfasst: So 09.12.07 01:03
wie kann man das denn machen weil für das spiel gibt es keine cheats und ich komm ned weiter
deswegen brauch ich hilfe kann mir einer son ding erstellen oder sagen wie das geht
|
|
cherrymoon69
Hält's aus hier
Beiträge: 12
|
Verfasst: Di 19.02.08 15:33
hallo erst mal. ich finde das ein super thema.
bin grad dabei einen trainer für Hearts of iron - doomsday zu schreiben.
ich habe mit tsearch den wert für geld ermittelt. leider handelt es sich hierbei auch um immer wieder eine neue adresse pro instanz.
habe dann den pointer gefunden. $480802 Wert D99EF41B0000.
tsearch schreibt 6 bytes zum freezen. damit klappt es wunderbar. freezen unfreezen, kein thema.
jetzt habe ich den trainer folgendermaßen geschrieben:
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: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| var Form1: TForm1; WindowName : integer; ProcessId : integer; ThreadId : integer; buf : PChar; HandleWindow : Integer; write : cardinal;
Const WindowTitle = 'HoI 2';
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); const v1 = $90; 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,1); buf^ := Chr(v1); WriteProcessMemory(HandleWindow,ptr($480802),buf,1,write); WriteProcessMemory(HandleWindow,ptr($480803),buf,1,write); WriteProcessMemory(HandleWindow,ptr($480804),buf,1,write); WriteProcessMemory(HandleWindow,ptr($480805),buf,1,write); WriteProcessMemory(HandleWindow,ptr($480806),buf,1,write); WriteProcessMemory(HandleWindow,ptr($480807),buf,1,write); FreeMem(buf); closehandle(HandleWindow); MessageDlg('Geld ist eingefroren', mtwarning,[mbOK],0); end;
procedure TForm1.Button2Click(Sender: TObject); var Value1: Cardinal; Value2: Cardinal; begin Value1 := $D99EF41B; Value2 := $0000; 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,1); WriteProcessMemory(HandleWindow,ptr($480802),@Value1,4,write); WriteProcessMemory(HandleWindow,ptr($480806),@Value2,2,write); FreeMem(buf); closehandle(HandleWindow); MessageDlg('Geld ist nicht mehr eingefroren', mtwarning,[mbOK],0); end;
end. |
das freezen geht jetzt spitzenmäßig. wenn ich das richtig verstanden habe, dann muß beim unfreezeb der alte wert geschrieben werden. nämlich D99EF41B0000.
habe anfänglich die gleiche vorgehensweise wie beim freezen, nur umgekehrt, verwandt. geht nicht. was ich auch tu, das spiel stürzt sofort ab. weiß jemand rat?
ach ja. und wie kann ich denn im delphicode den wert f+r geld verändern. also nicht nur freezen. die adresse ist ja immer anders. das habe ich nicht verstanden.
bitte um hilfe.
danke
PS: ich weiss, dass ich 6 bytes beim freezen geschrieben habe. mit 6 bytes beim unfreezen hat es nicht gefunzt. der code beim unfreezen ist nur ein versuch.
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
*Knust*
Beiträge: 95
|
Verfasst: Do 21.02.08 21:58
Moin!
Wie ist der Speicher angeordnet?
Also nach blablabla7 folgt blablabla8 sowei war ich schon...
und nach 9 kommt A(lässt sich bei dir erkennen^^) aber wie gehts dann weiter?
werden dann alle buchstaben genommen???
Knust
|
|
cherrymoon69
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 22.02.08 20:52
um ehrlich zu sein weiß ich nicht genau was du jetzt von mir wissen möchtest.
möchtest du ein speicherabbild? z.b. ?
|
|
|