Другое С/С++ Вопрос - Ответ

index

Известный
126
82
Хочу получить ники всех игроков на сервере.
C++:
int main() {
   DWORD pID;
   char moduleName[] = "samp.dll";

   HWND hGameWindow = FindWindow(NULL, L"GTA:SA:MP");
   GetWindowThreadProcessId(hGameWindow, &pID);
   HANDLE pGta = OpenProcess(PROCESS_VM_READ, FALSE, pID);
   DWORD pSamp = GetModuleBaseAddress(pID, L"samp.dll");
  
   cout << "samp.dll addr: " << hex << pSamp << endl;

   char nickname[24] = { " " };
   ReadProcessMemory(pGta, (LPCVOID)(pSamp + OFFSET_NICKNAME), &nickname, sizeof(nickname), NULL);

   DWORD dwAddress;
   ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x21A0F8), &dwAddress, 4, 0);
   cout << "dwAdress : " << dwAddress << endl;

   ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x3CD), &dwAddress, 4, 0);
   cout << "dwAdres : " << dwAddress << endl;

   DWORD dwPlayers;
   ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x18), &dwPlayers, 4, 0); //stPlayerPool
   cout << "dwPlayers : " << dwPlayers << endl;

   cout << endl << endl;

   uint32_t ulMaxPlayerID;
   ReadProcessMemory(pGta, (LPCVOID)(dwPlayers), &ulMaxPlayerID, sizeof(uint32_t), 0); //ulMaxPlayerID
   cout << "ulMaxPlayerID : " << ulMaxPlayerID << endl;

   uint16_t sLocalPlayerID;
   ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + sizeof(uint32_t)), &sLocalPlayerID, sizeof(uint16_t), 0); //sLocalPlayerID
   cout << "sLocalPlayerID : " << sLocalPlayerID << endl;

   //0x2a

   stRemotePlayer* pRemotePlayer[SAMP_MAX_PLAYERS];
   ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + 0x2a), &pRemotePlayer, 4, 0);
   cout << "pRemotePlayer : " << pRemotePlayer << endl;
   cout << "nick : " << pRemotePlayer[5]->strPlayerName << endl;
}

Но получаю либо кашу либо краш.
Как минимум - у Вас несоответствие кодировок. ANSI программа использующая ANSI версии функций winApi у Вас принимает в качестве аргументов const wchar_t * (строки L"..."), что является ошибкой.
А как более - хороший пример по external получению списка игроков написан в samp udf for ahk. Все оффсеты есть в верхней части файла в массивах, где 1, 2, 3 позиции соответствуют версиям 0.3.7r1, r2, 0.3dl с поправкой для global SAMP_REMOTEPLAYERDATA_PED := [0x2A4, 0x40, 0x40].
Также для определения причин вылета лучше применять отладчик, т.к. сообщение "у меня крашит" практически не несет в себе полезной нагрузки, а узнать причины краша Вы можете самостоятельно.

Вопрос:
Есть такая структура:
C++:
struct stSAMP
{
    void                    *pUnk0[2];
    uint8_t                    byteSpace[24];
    char                    szIP[257];
    char                    szHostname[259];
    uint8_t                    byteUnk1;
    uint32_t                ulPort;
    uint32_t                ulMapIcons[100];
    int                        iLanMode;
    int                        iGameState;
    uint32_t                ulConnectTick;
    struct stSAMPSettings    *pSettings;
    void                    *pRakClientInterface;
    struct stSAMPPools        *pPools;
};

VbXsKBq.png


Но в cheat engine она выглядит совсем не так, данные то в ней есть, вроде IP и Hostname, но они расположены на каких-то непонятных оффсетах, почему структура в C++ выглядит не так, как в CheatEngine, смотрел еще некоторые структуры - так там данные в CE расположены в том же порядке, что и в C++
Вероятно, дело в выравнивании структур компилятором. Статья 1, Статья 2
 
  • Нравится
Реакции: Ya Zaregalsya

Vadim.dll

Известный
168
80
Как минимум - у Вас несоответствие кодировок. ANSI программа использующая ANSI версии функций winApi у Вас принимает в качестве аргументов const wchar_t * (строки L"..."), что является ошибкой.
А как более - хороший пример по external получению списка игроков написан в samp udf for ahk. Все оффсеты есть в верхней части файла в массивах, где 1, 2, 3 позиции соответствуют версиям 0.3.7r1, r2, 0.3dl с поправкой для global SAMP_REMOTEPLAYERDATA_PED := [0x2A4, 0x40, 0x40].
Также для определения причин вылета лучше применять отладчик, т.к. сообщение "у меня крашит" практически не несет в себе полезной нагрузки, а узнать причины краша Вы можете самостоятельно.


Вероятно, дело в выравнивании структур компилятором. Статья 1, Статья 2
Спасибо! Надеюсь это мне поможет!
 

#kweeZ

Известный
577
122
Как узнать текст диалога? При таком коде выводится только текст "Авторизация/Принять", то есть титла/кнопки, а дальше какие-то иероглифы, а мне надо прочитать текст, который находится в самом диалоге
Код:
bool CALLBACK incomingRPC(stRakNetHookParams* params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
    {
        short int DialogID;
        char pText[64];

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(DialogID);
        params->bitStream->Read(pText);
        params->bitStream->ResetReadPointer();

        SF->getSAMP()->getChat()->AddChatMessage(-1, "DIALOG ID [%d]]",    DialogID);
        SF->getSAMP()->getChat()->AddChatMessage(-1, "Text: [%s]", pText);
    };

    return true;
};
 

Вложения

  • sa-mp-077.png
    sa-mp-077.png
    8.2 KB · Просмотры: 178

Cake_

Известный
Проверенный
263
313
Как узнать текст диалога? При таком коде выводится только текст "Авторизация/Принять", то есть титла/кнопки, а дальше какие-то иероглифы, а мне надо прочитать текст, который находится в самом диалоге
Код:
bool CALLBACK incomingRPC(stRakNetHookParams* params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
    {
        short int DialogID;
        char pText[64];

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(DialogID);
        params->bitStream->Read(pText);
        params->bitStream->ResetReadPointer();

        SF->getSAMP()->getChat()->AddChatMessage(-1, "DIALOG ID [%d]]",    DialogID);
        SF->getSAMP()->getChat()->AddChatMessage(-1, "Text: [%s]", pText);
    };

    return true;
};
Читаешь длину текста, читаешь сам текст, декодишь, убираешь мусор.

Читаешь длину текста, читаешь сам текст, декодишь, убираешь мусор.
  • ShowDialog - ID: 61
Parameters: UINT16 wDialogID, UINT8 bDialogStyle, UINT8 bTitleLength, char[] szTitle, UINT8 bButton1Len, char[] szButton1, UINT8 bButton2Len, char[] szButton2, CSTRING szInfo
 

Vadim.dll

Известный
168
80
Хочу получить ники всех игроков на сервере.
C++:
int main() {
   DWORD pID;
   char moduleName[] = "samp.dll";

   HWND hGameWindow = FindWindow(NULL, L"GTA:SA:MP");
   GetWindowThreadProcessId(hGameWindow, &pID);
   HANDLE pGta = OpenProcess(PROCESS_VM_READ, FALSE, pID);
   DWORD pSamp = GetModuleBaseAddress(pID, L"samp.dll");
  
   cout << "samp.dll addr: " << hex << pSamp << endl;

   char nickname[24] = { " " };
   ReadProcessMemory(pGta, (LPCVOID)(pSamp + OFFSET_NICKNAME), &nickname, sizeof(nickname), NULL);

   DWORD dwAddress;
   ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x21A0F8), &dwAddress, 4, 0);
   cout << "dwAdress : " << dwAddress << endl;

   ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x3CD), &dwAddress, 4, 0);
   cout << "dwAdres : " << dwAddress << endl;

   DWORD dwPlayers;
   ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x18), &dwPlayers, 4, 0); //stPlayerPool
   cout << "dwPlayers : " << dwPlayers << endl;

   cout << endl << endl;

   uint32_t ulMaxPlayerID;
   ReadProcessMemory(pGta, (LPCVOID)(dwPlayers), &ulMaxPlayerID, sizeof(uint32_t), 0); //ulMaxPlayerID
   cout << "ulMaxPlayerID : " << ulMaxPlayerID << endl;

   uint16_t sLocalPlayerID;
   ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + sizeof(uint32_t)), &sLocalPlayerID, sizeof(uint16_t), 0); //sLocalPlayerID
   cout << "sLocalPlayerID : " << sLocalPlayerID << endl;

   //0x2a

   stRemotePlayer* pRemotePlayer[SAMP_MAX_PLAYERS];
   ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + 0x2a), &pRemotePlayer, 4, 0);
   cout << "pRemotePlayer : " << pRemotePlayer << endl;
   cout << "nick : " << pRemotePlayer[5]->strPlayerName << endl;
}

Но получаю либо кашу либо краш.


C++:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <tchar.h>
#include <psapi.h>


using namespace std;

DWORD GetProcId(const wchar_t* procname)
{
    PROCESSENTRY32 pe;
    HANDLE hSnap;

    pe.dwSize = sizeof(PROCESSENTRY32);
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (Process32First(hSnap, &pe)) {
        do {
            if (wcscmp(pe.szExeFile, procname) == 0)
                break;
        } while (Process32Next(hSnap, &pe));
    }
    return pe.th32ProcessID;
}

DWORD get_module(DWORD processID, const wchar_t* name)
{
    HMODULE hMods[1024];
    HANDLE hProcess;
    DWORD cbNeeded;
    unsigned int i;

    // Print the process identifier.

    printf("\nProcess ID: %u\n", processID);

    // Get a handle to the process.

    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
        PROCESS_VM_READ,
        FALSE, processID);
    if (NULL == hProcess)
        return 1;

    // Get a list of all the modules in this process.

    if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
    {
        for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
        {
            TCHAR szModName[MAX_PATH];

            // Get the full path to the module's file.
            //GetModuleBaseName(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR))
            if (GetModuleBaseName(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
            {
                if (wcscmp(szModName, name) == 0) return (DWORD)hMods[i];
               

            }
        }
    }

    // Release the handle to the process.

    CloseHandle(hProcess);

    return 0;
}

int main() {
    DWORD pID = GetProcId(L"gta_sa.exe");

    std::cout << "pid:" << pID << endl;

    HANDLE pGta = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
    DWORD pSamp = (DWORD)get_module(pID, L"samp.dll");


    std::cout << "samp.dll addr: " << hex << pSamp << endl;

    char nickname[24];
    ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x219A6F), &nickname, 24, 0);
    std::cout << nickname << endl;

    DWORD dwAddress;
    ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x21A0F8), &dwAddress, 4, 0);
    std::cout << "dwAdress : " << hex << dwAddress << endl;

    ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x3CD), &dwAddress, 4, 0);
    std::cout << "dwAdres : " << hex << dwAddress << endl;

    DWORD dwPlayers;
    ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x18), &dwPlayers, 4, 0); //stPlayerPool
    std::cout << "dwPlayers : " << dwPlayers << endl;

    std::cout << endl << endl;

    uint32_t ulMaxPlayerID;
    ReadProcessMemory(pGta, (LPCVOID)(dwPlayers), &ulMaxPlayerID, sizeof(uint32_t), 0); //ulMaxPlayerID
    std::cout << "ulMaxPlayerID : " << ulMaxPlayerID << endl;

    uint16_t sLocalPlayerID;
    ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + sizeof(uint32_t)), &sLocalPlayerID, sizeof(uint16_t), 0); //sLocalPlayerID
    std::cout << "sLocalPlayerID : " << sLocalPlayerID << endl;

    //0x2a

    //stRemotePlayer * pRemotePlayer[SAMP_MAX_PLAYERS];
    //ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + 0x2a), &pRemotePlayer, 4, 0);
    //cout << "pRemotePlayer : " << pRemotePlayer << endl;
    //cout << "nick : " << pRemotePlayer[5]->strPlayerName << endl;
}

Попробуй это.
 

SAMP.ASI

Известный
223
53
C++:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <tchar.h>
#include <psapi.h>


using namespace std;

DWORD GetProcId(const wchar_t* procname)
{
    PROCESSENTRY32 pe;
    HANDLE hSnap;

    pe.dwSize = sizeof(PROCESSENTRY32);
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (Process32First(hSnap, &pe)) {
        do {
            if (wcscmp(pe.szExeFile, procname) == 0)
                break;
        } while (Process32Next(hSnap, &pe));
    }
    return pe.th32ProcessID;
}

DWORD get_module(DWORD processID, const wchar_t* name)
{
    HMODULE hMods[1024];
    HANDLE hProcess;
    DWORD cbNeeded;
    unsigned int i;

    // Print the process identifier.

    printf("\nProcess ID: %u\n", processID);

    // Get a handle to the process.

    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
        PROCESS_VM_READ,
        FALSE, processID);
    if (NULL == hProcess)
        return 1;

    // Get a list of all the modules in this process.

    if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
    {
        for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
        {
            TCHAR szModName[MAX_PATH];

            // Get the full path to the module's file.
            //GetModuleBaseName(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR))
            if (GetModuleBaseName(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
            {
                if (wcscmp(szModName, name) == 0) return (DWORD)hMods[i];
              

            }
        }
    }

    // Release the handle to the process.

    CloseHandle(hProcess);

    return 0;
}

int main() {
    DWORD pID = GetProcId(L"gta_sa.exe");

    std::cout << "pid:" << pID << endl;

    HANDLE pGta = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
    DWORD pSamp = (DWORD)get_module(pID, L"samp.dll");


    std::cout << "samp.dll addr: " << hex << pSamp << endl;

    char nickname[24];
    ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x219A6F), &nickname, 24, 0);
    std::cout << nickname << endl;

    DWORD dwAddress;
    ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x21A0F8), &dwAddress, 4, 0);
    std::cout << "dwAdress : " << hex << dwAddress << endl;

    ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x3CD), &dwAddress, 4, 0);
    std::cout << "dwAdres : " << hex << dwAddress << endl;

    DWORD dwPlayers;
    ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x18), &dwPlayers, 4, 0); //stPlayerPool
    std::cout << "dwPlayers : " << dwPlayers << endl;

    std::cout << endl << endl;

    uint32_t ulMaxPlayerID;
    ReadProcessMemory(pGta, (LPCVOID)(dwPlayers), &ulMaxPlayerID, sizeof(uint32_t), 0); //ulMaxPlayerID
    std::cout << "ulMaxPlayerID : " << ulMaxPlayerID << endl;

    uint16_t sLocalPlayerID;
    ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + sizeof(uint32_t)), &sLocalPlayerID, sizeof(uint16_t), 0); //sLocalPlayerID
    std::cout << "sLocalPlayerID : " << sLocalPlayerID << endl;

    //0x2a

    //stRemotePlayer * pRemotePlayer[SAMP_MAX_PLAYERS];
    //ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + 0x2a), &pRemotePlayer, 4, 0);
    //cout << "pRemotePlayer : " << pRemotePlayer << endl;
    //cout << "nick : " << pRemotePlayer[5]->strPlayerName << endl;
}

Попробуй это.
Мне нужно получить структуру pRemotePlayer[1004], чтоб получить из нее значения ника, счета. pRemotePlayer находится в stPlayerPool
 

astap_

Известный
Всефорумный модератор
626
596
Как узнать текст диалога? При таком коде выводится только текст "Авторизация/Принять", то есть титла/кнопки, а дальше какие-то иероглифы, а мне надо прочитать текст, который находится в самом диалоге
Код:
bool CALLBACK incomingRPC(stRakNetHookParams* params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
    {
        short int DialogID;
        char pText[64];

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(DialogID);
        params->bitStream->Read(pText);
        params->bitStream->ResetReadPointer();

        SF->getSAMP()->getChat()->AddChatMessage(-1, "DIALOG ID [%d]]",    DialogID);
        SF->getSAMP()->getChat()->AddChatMessage(-1, "Text: [%s]", pText);
    };

    return true;
};
странно что у тебя вообще что-то выводится с таким кодом.
компоненты RPC/пакета нужно получать строго по порядку.
Код:
struct stSAMPDialog
{
    int iIsActive;
    BYTE bDialogStyle;
    WORD wDialogID;
    BYTE bTitleLength;
    char szTitle[257];
    BYTE bButton1Len;
    char szButton1[257];
    BYTE bButton2Len;
    char szButton2[257];
    char szInfo[1000];
};

bool CALLBACK incomingRPC(stRakNetHookParams *params)
{
    if (hook->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
    {
        stSAMPDialog sampDialog;

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(sampDialog.wDialogID);
        params->bitStream->Read(sampDialog.bDialogStyle);
        params->bitStream->Read(sampDialog.bTitleLength);
        params->bitStream->Read(sampDialog.szTitle, sampDialog.bTitleLength);
        sampDialog.szTitle[sampDialog.bTitleLength] = 0;
        params->bitStream->Read(sampDialog.bButton1Len);
        params->bitStream->Read(sampDialog.szButton1, sampDialog.bButton1Len);
        sampDialog.szButton1[sampDialog.bButton1Len] = 0;
        params->bitStream->Read(sampDialog.bButton2Len);
        params->bitStream->Read(sampDialog.szButton2, sampDialog.bButton2Len);
        sampDialog.szButton2[sampDialog.bButton2Len] = 0;
        SF->getRakNet()->DecodeString(sampDialog.szInfo, 900, params->bitStream);
 
        SF->getSAMP()->getChat()->AddChatMessage(-1, sampDialog.szInfo);
    };
    return true;
};
 
Последнее редактирование:
  • Нравится
Реакции: #kweeZ

Vadim.dll

Известный
168
80
Мне нужно получить структуру pRemotePlayer[1004], чтоб получить из нее значения ника, счета. pRemotePlayer находится в stPlayerPool
А где у тебя эта структура определена?

Вопрос, как в Cheat Engine или где-нибудь еще получить адрес на структуру, в которой лежит текст диалога? Пробовал искать, нашел один указатель, так на него ничего не ссылается и в дизассембле пишется прямо в него, нету сдвига, может подскажет кто.
 

SAMP.ASI

Известный
223
53
А где у тебя эта структура определена?

Вопрос, как в Cheat Engine или где-нибудь еще получить адрес на структуру, в которой лежит текст диалога? Пробовал искать, нашел один указатель, так на него ничего не ссылается и в дизассембле пишется прямо в него, нету сдвига, может подскажет кто.
В начале кода подключена structures.h, вот она https://pastebin.com/7iBpCA9L
 

Vadim.dll

Известный
168
80
В начале кода подключена structures.h, вот она https://pastebin.com/7iBpCA9L
C++:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <tchar.h>
#include <psapi.h>

using namespace std;

DWORD GetProcId(const wchar_t* procname)
{
    PROCESSENTRY32 pe;
    HANDLE hSnap;

    pe.dwSize = sizeof(PROCESSENTRY32);
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (Process32First(hSnap, &pe)) {
        do {
            if (wcscmp(pe.szExeFile, procname) == 0)
                break;
        } while (Process32Next(hSnap, &pe));
    }
    return pe.th32ProcessID;
}

DWORD get_module(DWORD processID, const wchar_t* name)
{
    HMODULE hMods[1024];
    HANDLE hProcess;
    DWORD cbNeeded;
    unsigned int i;

    // Print the process identifier.

    printf("\nProcess ID: %u\n", processID);

    // Get a handle to the process.

    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
        PROCESS_VM_READ,
        FALSE, processID);
    if (NULL == hProcess)
        return 1;

    // Get a list of all the modules in this process.

    if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
    {
        for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
        {
            TCHAR szModName[MAX_PATH];

            // Get the full path to the module's file.
            //GetModuleBaseName(hProcess, hMods[I], szModName, sizeof(szModName) / sizeof(TCHAR))
            if (GetModuleBaseName(hProcess, hMods[I], szModName, sizeof(szModName) / sizeof(TCHAR)))
            {
                if (wcscmp(szModName, name) == 0) return (DWORD)hMods[I];
              

            }
        }
    }

    // Release the handle to the process.

    CloseHandle(hProcess);

    return 0;
}


int main() {
    DWORD pID = GetProcId(L"gta_sa.exe");

    std::cout << "pid:" << pID << endl;

    HANDLE pGta = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
    DWORD pSamp = (DWORD)get_module(pID, L"samp.dll");


    DWORD cPed;
    ReadProcessMemory(pGta, (LPCVOID)(0x0 + 0xB6F5F0), &cPed, 4, 0);

    short skinID;
    ReadProcessMemory(pGta, (LPCVOID)(cPed + 0x22), &skinID, 2, 0);
    cout << skinID << endl;


    std::cout << "samp.dll addr: " << hex << pSamp << endl;

    //char nickname[24];
    //ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x26E03F), &nickname, 24, 0);
    //MessageBoxA(NULL, nickname, "debug", MB_OK);
    //std::cout << nickname << endl;

    DWORD dwAddress;
    ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x21A0F8), &dwAddress, 4, 0);
    std::cout << "dwAdress : " << hex << dwAddress << endl;

    ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x3CD), &dwAddress, 4, 0);
    std::cout << "dwAdres : " << hex << dwAddress << endl;

    DWORD dwPlayers;
    ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x18), &dwPlayers, 4, 0); //stPlayerPool
    std::cout << "dwPlayers : " << dwPlayers << endl;

    std::cout << endl << endl;

    uint32_t ulMaxPlayerID;
    ReadProcessMemory(pGta, (LPCVOID)(dwPlayers), &ulMaxPlayerID, sizeof(uint32_t), 0); //ulMaxPlayerID
    std::cout << "ulMaxPlayerID : " << dec << ulMaxPlayerID << endl;

    uint16_t sLocalPlayerID;
    ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + sizeof(uint32_t)), &sLocalPlayerID, sizeof(uint16_t), 0); //sLocalPlayerID
    std::cout << "sLocalPlayerID : " << dec << sLocalPlayerID << endl;

    //0x2E

    for (int i = 0; i < ulMaxPlayerID; i++)
    {

        DWORD pRemotePlayer;
        ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + 0x2E + i*4), &pRemotePlayer, 4, 0);
        if (pRemotePlayer == 0) continue;

        //cout << "pRemotePlayer : " << pRemotePlayer << endl;
        uint32_t score;
        uint32_t ping;
        ReadProcessMemory(pGta, (LPCVOID)(pRemotePlayer + 0x24), &score, 4, 0);
        ReadProcessMemory(pGta, (LPCVOID)(pRemotePlayer + 0x28), &ping, 4, 0);

        uint32_t name_len;
        char name[26] = { "" };



        ReadProcessMemory(pGta, (LPCVOID)(pRemotePlayer + 0x1C), &name_len, 4, 0);

        if (name_len <= 0xf)
        {
            ReadProcessMemory(pGta, (LPCVOID)(pRemotePlayer + 0xC), &name, 16, 0);
        }
        else
        {

            DWORD pName;

            ReadProcessMemory(pGta, (LPCVOID)(pRemotePlayer + 0xC), &pName, 4, 0);
            ReadProcessMemory(pGta, (LPCVOID)pName, &name, 25, 0);
        }

        cout << "name : " << name << endl;
        cout << "score : " << dec << score << endl;
        cout << "ping : " << dec << ping << endl << endl;
    }
}

У тебя адрес был неправильный, нужно не 0x2A, а 0x2E. Завести это дело со структурой не получилось у меня. Чтобы данные вывелись, тебе нужно в игре нажать на tab, чтобы таблица загрузилась и проге было откуда брать данные.
 
Последнее редактирование:
  • Нравится
Реакции: g305noobo и SAMP.ASI

#kweeZ

Известный
577
122
странно что у тебя вообще что-то выводится с таким кодом.
компоненты RPC/пакета нужно получать строго по порядку.
Код:
struct stSAMPDialog
{
    int iIsActive;
    BYTE bDialogStyle;
    WORD wDialogID;
    BYTE bTitleLength;
    char szTitle[257];
    BYTE bButton1Len;
    char szButton1[257];
    BYTE bButton2Len;
    char szButton2[257];
    char szInfo[1000];
};

bool CALLBACK incomingRPC(stRakNetHookParams *params)
{
    if (hook->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
    {
        stSAMPDialog sampDialog;

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(sampDialog.wDialogID);
        params->bitStream->Read(sampDialog.bDialogStyle);
        params->bitStream->Read(sampDialog.bTitleLength);
        params->bitStream->Read(sampDialog.szTitle, sampDialog.bTitleLength);
        sampDialog.szTitle[sampDialog.bTitleLength] = 0;
        params->bitStream->Read(sampDialog.bButton1Len);
        params->bitStream->Read(sampDialog.szButton1, sampDialog.bButton1Len);
        sampDialog.szButton1[sampDialog.bButton1Len] = 0;
        params->bitStream->Read(sampDialog.bButton2Len);
        params->bitStream->Read(sampDialog.szButton2, sampDialog.bButton2Len);
        sampDialog.szButton2[sampDialog.bButton2Len] = 0;
        SF->getRakNet()->DecodeString(sampDialog.szInfo, 900, params->bitStream);
 
        SF->getSAMP()->getChat()->AddChatMessage(-1, sampDialog.szInfo);
    };
    return true;
};

Откуда тут "hook"?
Код:
hook->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog