[HELP] Code Verständnis

Hallo,
ich bin neu hier ich habe mich hier registriert um etwas Hilfe bei meinem kleinen Projekt zu bekommen.
Ich möchte eine Art Trainer programmieren für das Spiel GTA:SAMP. (wobei dies kein richtiges Hacken ist!)
Ich habe einen code gefunden, welcher viele coole Funktionen bitet, doch dieser ist nicht mehr für die aktuelle samp version nutzbar, da andere Adressen usw.
Hier ist der code welcher in AHK_L geschrieben wurde, aber leicht zu verstehen sein sollte: Link

Nun es geht mir einfach darum zu verstehen wie und was da gemacht wird, damit ich das updaten kann.
Wäre nett, wenn mir das jemand erklären könnte, wie ich weiter komme.

Gruß
 
Also im Großen und Ganzen ist die UDF nicht sonderlich kompliziert. Kurz zusammengefasst, manipuliert sie einfach nur verschiedene Adressen innerhalb der samp.dll und dem Hauptmodul.
Höchstwahrscheinlich wird es reichen, wenn du diese Adressen aktualisierst:
Code:
; GTA Adressen
global ADDR_ZONECODE                := 0xA49AD4
global ADDR_POSITION_X                := 0xB6F2E4
global ADDR_POSITION_Y                := 0xB6F2E8
global ADDR_POSITION_Z                := 0xB6F2EC
global ADDR_CPED_PTR                := 0xB6F5F0
global ADDR_CPED_HPOFF                := 0x540
global ADDR_CPED_ARMOROFF            := 0x548
global ADDR_VEHICLE_PTR                := 0xBA18FC
global ADDR_VEHICLE_HPOFF            := 0x4C0

; SAMP Adressen
global ADDR_SAMP_INCHAT_PTR            := 0x2071F0
global ADDR_SAMP_INCHAT_PTR_OFF        := 0x54
global ADDR_SAMP_USERNAME            := 0x206B87
global ADDR_SAMP_CHATMSG_PTR        := 0x2071C0
global ADDR_SAMP_CHATMSG_PTR_OFF    := 0x152
global FUNC_SAMP_SENDCMD            := 0x60C30
global FUNC_SAMP_SENDSAY            := 0x4A10
global FUNC_SAMP_ADDTOCHATWND        := 0x5F890
global FUNC_SAMP_SHOWGAMETEXT        := 0x91D80


Am besten findet man Adressen mit Cheat Engine oder OllyDbg, aber da SAMP recht bekannt ist, gibt es dazu vllt sogar Tutorials. Da ich das Spiel nicht kenne, weiss ich nicht wie schwierig es ist.
Möglicherweise findest du die neuen Adressen auch über Google.

Falls sich das interne System grundlegend geändert hat, musst du quasi komplett von vorne anfangen und erstmal verstehen, wie das Spiel intern funktioniert. Dies ist aber extrem unwahrscheinlich.
Die WinAPI bietet dir zur Speichermanipulation fremder Prozesse folgende (und noch mehr) Funktionen:
OpenProcess
ReadProcessMemory
WriteProcessMemory

Um an den BasePointer eines Moduls zu kommen, musst du hingegen etwas mehr Aufwand betreiben. Ich habe dazu eine Funktion in C++ geschrieben:
PHP:
/* Sucht den ModuleEintrag mit dem Namen szModule und speichert ihn in me32 ab. Falls er ihn gefunden hat, gibt er true zurück
    ansonsten false. Wenn szModule NULL ist, wird nach dem Hauptmodul des Prozesses gesucht. Das bedeutet konkret, dass er den ersten Eintrag mit der Endung .exe 
    benutzt. 
    Includes: tchar.h, windows.h, TlHelp32.h */
/* Fehlerkonstanten */
const DWORD INVALID_HPROCESS = 0x20000001;
const DWORD SNAPSHOT_FAILED = 0x20000002; //keine Modulinformationen oder das Speichern vom Snapshot ging schief
const DWORD MODULE_NOT_FOUND = 0x20000003;

bool ProcessGetModuleEntry32(HANDLE hProcess, LPCTSTR szModuleName, MODULEENTRY32 &me32) {
    HANDLE hSnapshot;
    DWORD dwPid;
    //============================================================>
    //Pid speichern
    if (!(dwPid = GetProcessId(hProcess))) {
        SetLastError(INVALID_HPROCESS);
        return false;
    }
    //Snapshot vom System holen
    if ((hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPid))==INVALID_HANDLE_VALUE) {
        SetLastError(SNAPSHOT_FAILED);
        return false;
    }
    //me32 vorbereiten
    memset(&me32, 0, sizeof(MODULEENTRY32));
    me32.dwSize = sizeof(MODULEENTRY32);
    //den ersten Eintrag holen
    if (!Module32First(hSnapshot, &me32)) {
        CloseHandle(hSnapshot);
        SetLastError(SNAPSHOT_FAILED); //keine Modulinformationen
        return false;
    }
    do {
        //Wenn nach dem Hauptmodul gesucht werden soll
        if (!szModuleName) {
            //Endet der Modulname mit '.exe'?
            if (_tcscmp(me32.szModule + sizeof(TCHAR) * _tcslen(me32.szModule) - 4, _T(".exe"))) {
                CloseHandle(hSnapshot);
                return true;
            }
        }
        else {
            //Suche nach dem richtigen Modul mit dem Namen szModuleName
            if (_tcscmp(me32.szModule, szModuleName)==0) { //_tcscmp ist strcmp für tchar
                CloseHandle(hSnapshot);
                return true;
            }
        }
    }while(Module32Next(hSnapshot, &me32));
    CloseHandle(hSnapshot);
    SetLastError(MODULE_NOT_FOUND);
    return false;
}

Die Funktion nimmt eine Referenz zu einer MODULEENTRY32-Struktur entgegen und füllt sie mit den Werten des Modules szModuleName. Die Base-Address steht anschliessend in modBaseAddr.

Eigentlich gibt es genügend Tutorials dazu. So schwierig sollte es eigentlich nicht sein, egal ob du die UDF komplett neu schreibst oder nur die Werte aktualisierst.
 
  • Like
Reactions: CDW
-die GTA Adressen sind dieselben
-samp.dll Adressen scheinen alle anders zu sein (ausser SENDSAY)
-mit CE kenn ich mich ein wenig aus

Dann zu Ollydbg hab ich mir die ersten 4 Teile des Tutorials von lena151 angeschaut,wobie es um Cracken ging.
Sollte ich mir das weiter anschauen?

Hab durch Ausprobieren mit CE/Olly die Adresse für SENDCMD gefunden, in die UDF eingesetzt,passt *freu*

@night ist deine Funktion mit dem Basepointer etwa dieselbe wie getModuleBaseAddress aus der UDF?
 
Zuletzt bearbeitet:
samp.dll Adressen scheinen alle anders zu sein (ausser SENDSAY)
Du musst beachten, dass die Adressen in der UDF nur ein Offset zu der Adresse des jeweiligen Moduls sind. Kann also sein, dass die Adressen sich ändern, weil die Dll an eine andere Stelle geladen wurde. Cheat Engine sollte die Adresse aber immer nur als Offset anzeigen (a la: "mydll.dll+043902").

Dann zu Ollydbg hab ich mir die ersten 4 Teile des Tutorials von lena151 angeschaut,wobie es um Cracken ging.
Sollte ich mir das weiter anschauen?
Naja, hauptsache du verstehst wie Assembler so ungefähr funktioniert und weisst wie du damit Pointer suchen kannst. Ich bin auf dem Gebiet aber nicht so der Experte (siehe meinen Thread im Code Kitchen).

@night ist deine Funktion mit dem Basepointer etwa dieselbe wie getModuleBaseAddress aus der UDF?
Nein, sie funktioniert etwas anders. Die Beschreibung ist im Quelltext und im oberen Post von mir. Sie gibt dir nicht die Base-Address zurück, sondern eine MODULEENTRY32-Struktur. In dieser Struktur steht die BaseAddress.
 
Zuletzt bearbeitet:
Zurück
Oben