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! )

Code:
#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_maximum, handle);  // Das Leben und die AP's werden aktualisiert.
   buffer_current = read_memory(adress_base_player_offset+offset_current, handle);
   buffer_ap_maximum = read_memory(adress_base_player_offset+offset_ap_maximum, handle);
   buffer_ap_current = read_memory(adress_base_player_offset+offset_ap_current, 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;
}