[AHK][Hilfe] Funktionen erstellen
- _ArtaX
- Geschlossen
- Erledigt
-
-
Wenn du dich wirklich mit dem Thema beschäftigen willst, solltest du Kenntnis haben von:
1. C/C++
2. Calling Conventions
3. den Memory und callWithParams Funktion der UDF, oder deinen eigenen Memory Funktionen
4. grundlegendes AssemblerverständnisAlso die Funktion als Beispiel, einfach nur aus dem s0beit Source in AHK und die UDF Funktion zu integrieren wäre einfach:
Cvoid playerSpawn(void) { if (g_SAMP == NULL) return; ((void(__thiscall *) (void *_this)) (g_dwSAMP_Addr + SAMP_FUNC_REQUEST_SPAWN)) (g_Players->pLocalPlayer); ((void(__thiscall *) (void *_this)) (g_dwSAMP_Addr + SAMP_FUNC_SPAWN)) (g_Players->pLocalPlayer); }
Es gibt zwei Funktionsaufrufe, die komplett identisch sind, bis auf die aufgerufene Funktion natürlich. Du hast also nur einen Parameter, in diesem Fall den Local-Player-Pointer.
Wenn du dir die callWithParams Funktion anschaust, solltest du schnell erkennen, welche Parameter wie zu übergeben sind.
Für so eine einfache Funktion ist es wie gesagt, mit den in der UDF enthalten Memory Funktionen ziemlich einfach. Aber je mehr du ausprobieren willst, desto wichtiger ist es, dass du dich informierst über die Zusammenhänge. -
Beispielweise so?:
Grund Funktion: callWithParams_(hProcess, dwFunc, aParams, bCleanupStack = true, thiscall = false)callWithParams_(hGTA, dwSAMP, SAMP_FUNC_REQUEST_SPAWN, bCleanupStack = true, thiscall = false) ?
-
callWithParams(hGTA, dwSAMP + 0x3AD0, [["i", localPlayerPointer]], false, true)
Wäre ein korrekter Aufruf, localPlayerPointer musst du eben noch auslesen vorher. -
callWithParams(hGTA, dwSAMP + 0x3AD0, [["i", localPlayerPointer]], false, true)
woher hast du 0x3AD0 her?
-
Na aus dem Source Code von s0beit:
#define SAMP_FUNC_REQUEST_SPAWN 0x3EC0
#define SAMP_FUNC_SPAWN 0x3AD0 -
Na aus dem Source Code von s0beit:
#define SAMP_FUNC_REQUEST_SPAWN 0x3EC0achso okay ich versuche mal was
-
Das ist der Pointer. - In dem Fall: #define SAMP_FUNC_SPAWN 0x3AD0
-
-
stLocalPlayer ist eine Struktur in der SAMP.dll. Dazu gibt es in der UDF auch schon Funktionen, die diese Pointer nutzen. In den globalen Variablen wirst du auch die Offsets dazu finden, oder eben im s0beit Source:
C
Alles anzeigenstruct stPlayerPool { uint32_t ulMaxPlayerID; uint16_t sLocalPlayerID; void *pVTBL_txtHandler; std::string strLocalPlayerName; struct stLocalPlayer *pLocalPlayer; int iLocalPlayerPing; int iLocalPlayerScore; struct stRemotePlayer *pRemotePlayer[SAMP_MAX_PLAYERS]; int iIsListed[SAMP_MAX_PLAYERS]; DWORD dwPlayerIP[SAMP_MAX_PLAYERS]; // always 0 };
In der UDF wird es etwas umständlich so gemacht, funktioniert aber problemlos:
PHP
Alles anzeigendwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) if (ErrorLevel || !dwAddress) { ErrorLevel := ERROR_READ_MEMORY return -1 } dwAddress := readDWORD(hGTA, dwAddress + SAMP_PPOOLS_OFFSET) if (ErrorLevel || !dwAddress) { ErrorLevel := ERROR_READ_MEMORY return -1 } dwPlayers := readDWORD(hGTA, dwAddress + SAMP_PPOOL_PLAYER_OFFSET) if (ErrorLevel || !dwPlayers) { ErrorLevel := ERROR_READ_MEMORY return -1 } dwLocalPlayer := readDWORD(hGTA, dwPlayers + SAMP_LOCALPLAYER_OFFSET) if(ErrorLevel) { ErrorLevel := ERROR_READ_MEMORY return -1 }
-
-
stLocalPlayer ist eine Struktur in der SAMP.dll. Dazu gibt es in der UDF auch schon Funktionen, die diese Pointer nutzen. In den globalen Variablen wirst du auch die Offsets dazu finden, oder eben im s0beit Source:
C
Alles anzeigenstruct stPlayerPool { uint32_t ulMaxPlayerID; uint16_t sLocalPlayerID; void *pVTBL_txtHandler; std::string strLocalPlayerName; struct stLocalPlayer *pLocalPlayer; int iLocalPlayerPing; int iLocalPlayerScore; struct stRemotePlayer *pRemotePlayer[SAMP_MAX_PLAYERS]; int iIsListed[SAMP_MAX_PLAYERS]; DWORD dwPlayerIP[SAMP_MAX_PLAYERS]; // always 0 };
In der UDF wird es etwas umständlich so gemacht, funktioniert aber problemlos:
PHP
Alles anzeigendwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) if (ErrorLevel || !dwAddress) { ErrorLevel := ERROR_READ_MEMORY return -1 } dwAddress := readDWORD(hGTA, dwAddress + SAMP_PPOOLS_OFFSET) if (ErrorLevel || !dwAddress) { ErrorLevel := ERROR_READ_MEMORY return -1 } dwPlayers := readDWORD(hGTA, dwAddress + SAMP_PPOOL_PLAYER_OFFSET) if (ErrorLevel || !dwPlayers) { ErrorLevel := ERROR_READ_MEMORY return -1 } dwLocalPlayer := readDWORD(hGTA, dwPlayers + SAMP_LOCALPLAYER_OFFSET) if(ErrorLevel) { ErrorLevel := ERROR_READ_MEMORY return -1 }
dwLocalPlayer ist dann der localPlayerPointer?
-
Jap.
-
Ich weiss leider nicht was ich da falsch mache
Code
Alles anzeigenNumpad5:: { dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) if (ErrorLevel || !dwAddress) { ErrorLevel := ERROR_READ_MEMORY return } dwAddress := readDWORD(hGTA, dwAddress + SAMP_PPOOLS_OFFSET) if (ErrorLevel || !dwAddress) { ErrorLevel := ERROR_READ_MEMORY return } dwPlayers := readDWORD(hGTA, dwAddress + SAMP_PPOOL_PLAYER_OFFSET) if (ErrorLevel || !dwPlayers) { ErrorLevel := ERROR_READ_MEMORY return } dwLocalPlayer := readDWORD(hGTA, dwPlayers + SAMP_LOCALPLAYER_OFFSET) if(ErrorLevel) { ErrorLevel := ERROR_READ_MEMORY return } callWithParams_(hGTA, dwSAMP + 0x3EC0, [["i", dwLocalPlayer]], true, false) } return
-
Ist an sich schon richtig, aber RequestSpawn macht erstmal nix du musst dann 0x3AD0 ebenfalls noch aufrufen.
Edit: true, false ist aber falsch, der Stack muss nicht gecleant werden denn es ist ein Thiscall. Also false, true -
breadfish.de
Hat das Thema geschlossen.