Autor Beitrag
derDoc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: Di 06.02.07 12:55 
Natürlich geht das auch. Allerdings ist es halt ein wenig Arbeit.

Mit folgenden Quellcode sollte es dennoch funktionieren:
ausblenden 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'// Bitte entsprechend ändern
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) = 0then
      pID := ProcessEntry.th32ProcessID; // <-- Das ist die ProzessID
    Schleife := Process32Next(hSnapshot, ProcessEntry);
  end;
  CloseHandle(hSnapshot);
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); // <-- Das ist dann das gesuchte Handle
//(...)

_________________
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
BeitragVerfasst: Fr 23.03.07 16: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?:


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: So 08.04.07 17:07 
Ein paar Erläuterungen zu folgendem Quellcode:

ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var
  Value: Cardinal;
begin
  Value := $FFFFFFFF// <-- Hier kommt der gewünschte Betrag im Hexadezimal-System hin
  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



BeitragVerfasst: Fr 03.08.07 01: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



BeitragVerfasst: Mi 15.08.07 10: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:

ausblenden Quelltext
1:
4ff9d5  mov [edi+0x4],eax					



ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Fr 17.08.07 14:58 
versuch mal:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
var buf: integer;
begin
    buf := $90909090;
    WriteProcessMemory(HandleWindow,ptr($4FF9D5),@buf,3,write); //Habe schon alles getestet anstatt der 1 eine 2,3,4 und 5

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Dark-§hadow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 24



BeitragVerfasst: Sa 29.09.07 02: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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Sa 29.09.07 12: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Sa 29.09.07 17: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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: So 30.09.07 11:30 
ich mein eigentlich so onlinespiele wie Counterstrike. also eine exe die ich ausführe. oder meintest du das eh??

lg elundril
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: So 30.09.07 12:59 
genau das meinte ich

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: So 30.09.07 13:41 
user profile iconelundril 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 :wink: .
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: So 30.09.07 14: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 41

Win7 HP, WinXP
Delphi 7 Pers.
BeitragVerfasst: Sa 17.11.07 15: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



BeitragVerfasst: Fr 07.12.07 01: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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Fr 07.12.07 14: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



BeitragVerfasst: So 09.12.07 02: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



BeitragVerfasst: Di 19.02.08 16: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:
ausblenden volle Höhe Delphi-Quelltext
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); //es wird der speicher umgeschrieben in der addresse 401F75 und es wird 1 byte geschrieben
              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); //es wird der speicher umgeschrieben in der addresse 401F75 und es wird 1 byte geschrieben
                      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 user profile iconNarses: Delphi-Tags hinzugefügt
*Knust*
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 95



BeitragVerfasst: Do 21.02.08 22:58 
Moin!
Wie ist der Speicher angeordnet?
Also nach blablabla7 folgt blablabla8 sowei war ich schon...:P
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



BeitragVerfasst: Fr 22.02.08 21:52 
um ehrlich zu sein weiß ich nicht genau was du jetzt von mir wissen möchtest. :-)

möchtest du ein speicherabbild? z.b. ?