PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Warhammer Online Hack / Game-Trainer Sourcecode



Bonkers
06.09.2010, 15:26
Hey,
Ein Freund von mir fragte gestern nach einem Hack für das MMORPG "Warhammer Online".
Hier mal der Sourcecode, das Programm funktioniert mit der aktuellsten Version.
Die Speedhacks sind einfach in drei "Level" aufgeteilt, je größer die Option im Menü, desto langsamer.
"No Clipping!" bewirkt dass ihr durch Wände und Hindernisse hindurch laufen könnt. Eine kleine Kommentierung habe ich dem Code beigefügt.
Generell könnt ihr mit dem Code für alle möglichen Spiele Trainer / Hacks erstellen.

Gebannt wurden wir noch nicht, obwohl wir den Hack relativ offensichtlich überall eingesetzt haben ;)

Viel Spaß damit, über Kritik würde ich mich freuen. (Gerne auch positiv! :D )



#include <windows.h>
#include <iostream>
#include <stdio.h>

int read_memory(unsigned adress, HANDLE handle);
using namespace std;

int main()
{
HWND hwnd = FindWindow(0, "Warhammer: Age of Reckoning, Version 1.3.6, Copyright 2001-2010 Electronic Arts, Inc."); // Das Fenster wird gesucht...
DWORD proc_id;
GetWindowThreadProcessId(hwnd, &proc_id); //... und die Proc_ID wird ermittelt.
DWORD wtr=0;

int buffer_current = 0;
int buffer_maximum = 0;
int buffer_ap_maximum = 0;
int buffer_ap_current = 0;

int speedhack_littlefoot = 1075353216; // Eine Auswahl an Werten, die gesetzt werden können.
int speedhack = 1080353216;
int speedhack_ultra = 1100353216;
int speed_normal = 1065353216;
int ninja_on = 3322716160;
int ninja_off = 1065353216;


unsigned adress_base_player = 0x00FE1684; // Die Basis-Adresse für die Spielerdaten. Wird anhand der Adresse des Lebens zurückberechnet.
unsigned adress_base_player_offset = 0;

HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, false, proc_id);
adress_base_player_offset = read_memory(adress_base_player, handle); // Wir lesen das Basis-Offset für die Spieler-Daten aus.

unsigned offset_superjump = 0xaC; // Die Offsets, mit denen auf bestimmte Daten zugegriffen werden kann.
unsigned offset_current = 0x18C;
unsigned offset_maximum = 0x188;
unsigned offset_ap_maximum = 0x198;
unsigned offset_ap_current = 0x19C;
unsigned offset_speed = 0x9c;
unsigned ninja_test = read_memory(0x00FC5F60, handle); ninja_test = ninja_test + 0x5C;
unsigned speed_fix = adress_base_player_offset+offset_speed;



while(true) {
system("cls");

buffer_maximum = read_memory(adress_base_player_offset+offset_maxim um, handle); // Das Leben und die AP's werden aktualisiert.
buffer_current = read_memory(adress_base_player_offset+offset_curre nt, handle);
buffer_ap_maximum = read_memory(adress_base_player_offset+offset_ap_ma ximum, handle);
buffer_ap_current = read_memory(adress_base_player_offset+offset_ap_cu rrent, handle);

printf(" ++++++++++++++++++++++++++++++++++++++++++++++++++ +++\n"); // Kleiner Header + Anzeige.
printf(" + Warhammer Online - Memory Manipulation +\n");
printf(" ++++++++++++++++++++++++++++++++++++++++++++++++++ +++\n");
printf(" + Base-Adress: 0x%X +\n", adress_base_player);
printf(" ++++++++++++++++++++++++++++++++++++++++++++++++++ +++\n\n ");
printf(" Players Life: %i / %i \n", buffer_maximum, buffer_current);
printf(" Players AP's: %i / %i \n\n", buffer_ap_maximum, buffer_ap_current);


printf("0. Speedhack - Ultra\n1. Speedhack - Super\n2. Speedhack - Littlefoot\n3. Disable Speedhacks\n4. No Clipping!\n5. Clipping!\n6. Exit\n");
printf("Choice: "); // Das Menü...
int option = 0;
cin >> option;
if(option == 0) { WriteProcessMemory(handle, (LPVOID) speed_fix, &speedhack_ultra, sizeof(speedhack_ultra), NULL); } // Hier schreiben wir die Werte in den Speicher.
if(option == 1) { WriteProcessMemory(handle, (LPVOID) speed_fix, &speedhack, sizeof(speedhack), NULL); }
if(option == 2) { WriteProcessMemory(handle, (LPVOID) speed_fix, &speedhack_littlefoot, sizeof(speedhack_littlefoot), NULL); }
if(option == 3) { WriteProcessMemory(handle, (LPVOID) speed_fix, &speed_normal, sizeof(speed_normal), NULL); }
if(option == 6) { exit(0); }
if(option == 4) { WriteProcessMemory(handle, (LPVOID) ninja_test, &ninja_on, sizeof(ninja_on), NULL); }
if(option == 5) { WriteProcessMemory(handle, (LPVOID) ninja_test, &ninja_off, sizeof(ninja_off), NULL); }
option = NULL;
}
CloseHandle(handle);
return 0;
}

int read_memory(unsigned adress, HANDLE handle) {
int buffer = 0;
ReadProcessMemory(handle, (LPCVOID)adress, &buffer, sizeof(buffer), NULL);
return buffer;
}

Surflam
06.09.2010, 16:03
sieht doch schonmal ganz nice aus, habs nicht getestet aber source sieht gut aus finde ich ;)

Bonkers
06.09.2010, 17:54
Haha, schön wenn der Code deine Ästhetik angesprochen hat!

dYnAm1c
06.09.2010, 18:20
Nen hack Source Code ist so kurz? oO

blackberry
06.09.2010, 18:23
Wieso nach dem offensichtlichen fragen?
Ja, klar ist der so kurz. Er verändert ja auch nur ein paar Werte im Speicher von dem Spiel - wieso sollte man dafür mehr Code brauchen?

dYnAm1c
06.09.2010, 18:26
Was glaubst du warum ich frage?

blackberry
06.09.2010, 18:31
Weil deine geistigen Fähigkeiten vermutlich eingeschränkt sind und du kein C++ kannst.

l0dsb
06.09.2010, 18:39
Fehlerabfragen täten dem Source ganz gut (sämtliche API-Calls). while(true) verdient ein break und kein exit(0), besser: bool Done = false; while(!Done) { ... }.

Die if-Abfragen eignen sich besser als switch-Konstruktion (oder zumindest if - else if - else if - ...). Genau genommen wären Streams zur Aus- und Eingabe angebrachter (siehe Topic: C++).

Letztendlich kleinere Kosmetikspielereien, z. B. würde ich angeführte Werte als Konstanten oder zumindest konstante unsigned longs deklarieren.

dYnAm1c
06.09.2010, 18:46
Aha erklär mir doch bitte was geistige Fähigkeiten mit programmieren zu tun haben.

EDIT by AlterHacker:
**SCHNIPP** - Wir wollen doch nett bleiben, oder? :P

Bonkers
06.09.2010, 18:46
Letztendlich kleinere Kosmetikspielereien

Ich habe das Menü nur kurz hinzugefügt um das Programm für die Öffentlichkeit auch benutzbar zu machen - Ich und mein Kumpel haben das am Anfang manuell bedient...


Die if-Abfragen eignen sich besser als switch-Konstruktion

Das wäre vielleicht professioneller, aber nicht unbedingt "besser". Ich finde meine Lösung liest sich vernünftig, und ein Problem hat sich daraus bisher auch nicht ergeben ;)

QpL
06.09.2010, 18:51
Naja - passt auf bei Warhammer online - die haben zum Anfang hin bei Punkbuster nach "AntiCheat" gefragt. Ist zwar nicht offiziell als Supported eingetragen auf der Punkbuster-Website, aber vielleicht haben die beim AC geholfen.

Ansonsten kann man das als Grundgerüst eines Trainers betrachten! (Spamvermeidungssatz complete)!

@dYnAm1c (http://free-hack.com/member.php?u=60958)
Geistige Fähigkeiten = Intelligenz!
Aber ja, der Sourcecode ist so kurz. Du musst nur das Fenster bzw. den Prozess nehmen, ein paar Werte suchen mit ReadProcessMemory und dann mit WriteProcessMemory neue werte draufhauen. Das sind normale MemoryHacks. Aimbots sind natürlich ein wenig länger und komplizierter(Vektorrechnung, Hook, Proofing etc.)

dYnAm1c
06.09.2010, 18:57
1. Geistige Fähigkeiten = Intelligenz!

2. Aber ja, der Sourcecode ist so kurz. Du musst nur das Fenster bzw. den Prozess nehmen, ein paar Werte suchen mit ReadProcessMemory und dann mit WriteProcessMemory neue werte draufhauen. Das sind normale MemoryHacks. Aimbots sind natürlich ein wenig länger und komplizierter(Vektorrechnung, Hook, Proofing etc.)

Zu 1. das is nicht das einzigste.

Zu 2. das war alles was ich wissen wollte danke, einfach nur nen Kommentar mit Bullshit abgeben hingegen erwarte ich von 12 Jährigen möchtegern Gangstern.

l0dsb
06.09.2010, 18:58
Die Kosmetikspielereien bezogen sich durchaus auf den Source, nicht auf irgendeine GUI. Deine Anreihung von if-Abfragen hat den Nachteil, dass nach Bearbeitung eines Falles der Wert dennoch weiter verglichen wird (und das sollte man sich so schnell wie möglich abgewöhnen, ganz egal, wie trivial der Fall ist).

Sehe auch gerade, dass du printf und cin vermischst - wieso nicht gleich konsequent printf/scanf (wobei ich auf den Titel verweise) bzw. cout/cin?

Und welchen Grund hat es, dass du option auf NULL setzt (kommst du etwa aus dem VB-Bereich)?

Letztendlich lässt sich deine Serie von if-Abfragen in statische Daten übertragen (konstantes Array, Menüpunkt wird zum Index, Zusammenfassung aller WriteProcessMemory-Aufrufe).

Bonkers
06.09.2010, 19:02
(kommst du etwa aus dem VB-Bereich)

Java. (Bei VB.NET gibts sogar NOTHING soweit ich weiß :D )


(konstantes Array, Menüpunkt wird zum Index, Zusammenfassung aller WriteProcessMemory-Aufrufe)

Das hatte ich eigentlich auch vor, besonders weil der Hack eigentlich noch eine Art Persistenz beinhalten sollte, also um die aktivierten Werte bei Änderung durch das Spiel wieder zu aktualisieren.
Wie gesagt, auf das Menü habe ich wenig Zeit konzentriert, nachdem ich durch die Cheat-Engine-Hölle gegangen bin, um die Adressen und Offsets überhaupt zu finden :)


Sehe auch gerade, dass du printf und cin vermischst - wieso nicht gleich konsequent printf/scanf

Das ist mir auch gerade aufgefallen, hab das irgendwie einfach eingetippt und nicht besonders drüber nachgedacht ;) Danke für deinen kritischen Blick!