Trainer

Hey Leute ,

ich beschäftige mich seit einiger Zeit mit Assembler und OllyDbg , etc.

Da habe ich mal ein bisschen geggogelt, und was über trainer gefunden.
Und dann habe ich das gefunden :
http://www.delphi-library.de/topic_34077.html&sid=

Hab alles nachgemacht, hat auch geklappt!
Nur, der Code da unten ist in Delphi, und ich kann keine Delphi :(
Kann man sowas auch in C++ machen? Ist da mehr Arbeit nötig?
(WinApi und sowas nötig)

Und eine frage nebenbei: Kann man für das, was im Tutorial gezeigt wird, auch mit dem OllyDgb oder W32dasm machen, anstatt mit tSearch ?

Ich hoffe auf nützliche Antworten ;)

Danke im Vorraus!

MFG
 
Du kannst das fast 1:1 in C machen aber brauchst ebend Kenntnisse über die WinAPI sollte bissel mehr Code werden. Denke da gibt es auch genügende Reversing Tutorials in Sachen Loader, Process patching,....
 
Auf http://gamereversal.com findest du auch ein paar Tutorials zu dem Thema.

Edit:
Ich habe eben einen kleinen Trainer für das Windows-Pinball-Spiel geschrieben (meinen ersten eigenen Trainer), vielleicht interessiert dich der Source Code ja:
Code:
#include <windows.h>
#include <iostream>
#define EXCEPTION 1
using namespace std;

char *winName = "3D-Pinball für Windows - Space Cadet";
HANDLE handle = NULL;

void Open()
{
    HWND hwnd;
    DWORD pid, byte;

    while (1) {
        try {
            hwnd = FindWindow(0, winName);
            if (hwnd == 0) {
                cout << "Spiel nicht gefunden!" << endl;
                throw EXCEPTION;
            }
    
            GetWindowThreadProcessId(hwnd, (unsigned long *)&pid);
    
            handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
            if (handle == 0) {
                cout << "Prozess konnte nicht geoeffnet werden!" << endl;
                throw EXCEPTION;
            }
            break;
        } catch (int i) {
            Sleep(1000);
        }
    }
}

DWORD Read(DWORD address)
{
    DWORD byte;
    if (!ReadProcessMemory(handle, (void *)address, &byte, 4, NULL)) {
        cout << "Lesevorgang fehlgeschlagen!" << endl;
        throw EXCEPTION;
    }
    
    return byte;
}

void Write(DWORD address, DWORD value)
{
    if (!WriteProcessMemory(handle, (void *)address, &value, 4, NULL)) {
        cout << "Schreibvorgang fehlgeschlagen!" << endl;
        throw EXCEPTION;
    }
}

int main()
{
    long points;
    
    cout << "Microsoft Pinball Trainer\n"
              << "==============================\n"
              << " F3: Pause (eingebaut)\n"
              << " F4: Vollbild-Modus (eingebaut)\n"
              << " F5: Unendlich viele Baelle\n"
              << " F6: Mache F5 rueckgaengig\n"
              << " F7: Gib 100.000 Punkte (erst nach Update zu sehen)\n"
              << " F8: Steuerung aendern (eingebaut)\n"
              << "==============================\n"
              << "Viel Spass! Euer Eydeet ;)\n" << endl;


    Open();

    while (1) {
        try {
            if (GetAsyncKeyState(VK_F5)) {
                Write(0x010175B2, 0x8B569040);
                cout << "Patched." << endl;
            }
            if (GetAsyncKeyState(VK_F6)) {
                Write(0x010175B2, 0x8B56C085);
                cout << "Unpatched." << endl;
            }
            if (GetAsyncKeyState(VK_F7)) {
                points = Read(0x00AA0C72);
                points += 100000;
                Write(0x00AA0C72, points);
                cout << "Du hast jetzt " << points << " Punkte." << endl;
            }
            Sleep(100);
        } catch (int i) {
            Open();
        }
    }
}
 
Zurück
Oben