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

Stiopko

Известный
Проверенный
307
218
Как записать что-то в битстрим на определенное место. Так вылетает с сервера.
Код:
params->bitStream->ResetWritePointer();
params->bitStream->SetWriteOffset(24);
params->bitStream->Write(sLeftRightKeys);
 

Stiopko

Известный
Проверенный
307
218
C++:
bool CALLBACK OutcomingPacket(stRakNetHookParams *params) {
    if (state && params->packetId == PacketEnumeration::ID_VEHICLE_SYNC) {
        static uint16_t sLeftRightKeys;
        params->bitStream->ResetReadPointer();
        params->bitStream->SetReadOffset(24);
        params->bitStream->Read(sLeftRightKeys);
        if (sLeftRightKeys == 0) {
            params->bitStream->ResetWritePointer();
            params->bitStream->SetWriteOffset(24);
            params->bitStream->Write(uint16_t(bool(rand() % 2) ? 128 : 65408));
        }
    }
    return true;
}
 

Soreso

Новичок
4
0
Перебираю в цикле ID каров, но как получить кар в зоне стрима?(Функция)
 

Вложения

  • sa-mp-006.png
    sa-mp-006.png
    298.3 KB · Просмотры: 231

Karbun

Участник
112
3
В чём ошибка? Хочу вывести координаты игрока в консоле:
Нашел адреса координат через СЕ:
AE9005S.png
Потом написал код вывода:
C++:
#include <windows.h>
#include <string>
#include <iostream>

using namespace std;

DWORD pid;
DWORD Xcoord = 0x1A32C794;
DWORD Ycoord = 0x1A32C798;
DWORD Zcoord = 0x1A32C79C;
float MyCoordX;
float MyCoordY;
float MyCoordZ;

int main()
{
    while (true)
    {
        HWND hWnd = FindWindowA(0, ("GTA:SA:MP"));
        if (hWnd != 0)
        {     
            GetWindowThreadProcessId(hWnd, &pid);
            HANDLE pHandle = OpenProcess(PROCESS_VM_READ, FALSE, pid);
            ReadProcessMemory(pHandle, (LPVOID)Xcoord, &MyCoordX, sizeof(MyCoordX), 0);
            ReadProcessMemory(pHandle, (LPVOID)Ycoord, &MyCoordY, sizeof(MyCoordY), 0);
            ReadProcessMemory(pHandle, (LPVOID)Zcoord, &MyCoordZ, sizeof(MyCoordZ), 0);
            setlocale(LC_ALL, "Russian");
            cout << "Координаты игрока: " << endl;
            cout << "X координата: " << Xcoord << endl;
            cout << "Y координата: " << Ycoord << endl;
            cout << "Z координата: " << Zcoord << endl;
            Sleep(100);
            system("CLS");
        }

        if (hWnd == 0)
        {
            setlocale(LC_ALL, "Russian");
            cout << "Процесс не найден." << endl;
            Sleep(100);
            system("CLS");
        }
    }
}

И вот результат:
vyFhQGH.png
 

SiTrak

Известный
193
251
В чём ошибка? Хочу вывести координаты игрока в консоле:
Нашел адреса координат через СЕ:
AE9005S.png
Потом написал код вывода:
C++:
#include <windows.h>
#include <string>
#include <iostream>

using namespace std;

DWORD pid;
DWORD Xcoord = 0x1A32C794;
DWORD Ycoord = 0x1A32C798;
DWORD Zcoord = 0x1A32C79C;
float MyCoordX;
float MyCoordY;
float MyCoordZ;

int main()
{
    while (true)
    {
        HWND hWnd = FindWindowA(0, ("GTA:SA:MP"));
        if (hWnd != 0)
        {    
            GetWindowThreadProcessId(hWnd, &pid);
            HANDLE pHandle = OpenProcess(PROCESS_VM_READ, FALSE, pid);
            ReadProcessMemory(pHandle, (LPVOID)Xcoord, &MyCoordX, sizeof(MyCoordX), 0);
            ReadProcessMemory(pHandle, (LPVOID)Ycoord, &MyCoordY, sizeof(MyCoordY), 0);
            ReadProcessMemory(pHandle, (LPVOID)Zcoord, &MyCoordZ, sizeof(MyCoordZ), 0);
            setlocale(LC_ALL, "Russian");
            cout << "Координаты игрока: " << endl;
            cout << "X координата: " << Xcoord << endl;
            cout << "Y координата: " << Ycoord << endl;
            cout << "Z координата: " << Zcoord << endl;
            Sleep(100);
            system("CLS");
        }

        if (hWnd == 0)
        {
            setlocale(LC_ALL, "Russian");
            cout << "Процесс не найден." << endl;
            Sleep(100);
            system("CLS");
        }
    }
}

И вот результат:
vyFhQGH.png

position = (*(DWORD *)0xB6F5F0) ? (float *)(*(DWORD *)(*(DWORD *)0xB6F5F0 + 0x14) + 0x30) : NULL;
 

_Vine_

Активный
154
57
Как самп отправляет данные на сервер?
Думал сокеты, проверял какие данные проходят через функции send, sendto - не увидел данных которые могли бы отправляться.
Отправлялись данные в основном размером 4, 6, иногда 10 байт, при этом RakLogger показывал что отправляются пакеты/RPC намного большего размера.
В исходниках сампа 0.2.5 найти этого не смог.
 
Последнее редактирование:

Roger571

Известный
58
31
Как самп отправляет данные на сервер?
Думал сокеты, проверял какие данные проходят через функции send, sendto - не увидел данных которые могли бы отправляться.
Отправлялись данные в основном размером 4, 6, иногда 10 байт, при этом RakLogger показывал что отправляются пакеты/RPC намного большего размера.
В исходниках сампа 0.2.5 найти этого не смог.
C++:
void ReliabilityLayer::Update( SOCKET s, PlayerID playerId, int MTUSize, RakNetTimeNS time, DataStructures::List<PluginInterface*> &messageHandlerList )
void ReliabilityLayer::SendBitStream( SOCKET s, PlayerID playerId, RakNet::BitStream *bitStream )
int SocketLayer::SendTo( SOCKET s, const char *data, int length, unsigned int binaryAddress, unsigned short port )
int sendto(  SOCKET s,  const char *buf, int len, int flags,  const sockaddr *to,  int tolen);

Функции указаны в порядке их вызова
 
  • Нравится
Реакции: _Vine_

lorgon

Известный
657
266
Почему-то работает везде кроме игры, в чём проблема?
C++:
#include "stdafx.h"
#include "Windows.h"
#include <iostream>

int main()
{
    while (true) {
        if (GetAsyncKeyState(VK_INSERT))
        {   
            keybd_event(VK_SPACE, 0, 0, 0);
            Sleep(50);
        }
    }
    return 0;
}
 

Rjx13

Известный
Проверенный
224
160
Почему-то работает везде кроме игры, в чём проблема?
C++:
#include "stdafx.h"
#include "Windows.h"
#include <iostream>

int main()
{
    while (true) {
        if (GetAsyncKeyState(VK_INSERT))
        {  
            keybd_event(VK_SPACE, 0, 0, 0);
            Sleep(50);
        }
    }
    return 0;
}
Пример нажатия клавиши H на 300 милисекунд:
Код:
int keyState = 0;

DWORD WINAPI tsendmsg(LPVOID Param) {

    HWND wndHndl = FindWindowA(NULL, "GTA:SA:MP");

    while (keyState == 1) {
        SendMessage(wndHndl, WM_KEYDOWN, 0x48, 0);
        Sleep(300);
        keyState = 0;
        SendMessage(wndHndl, WM_KEYUP, 0x48, 0);
    }

    return 0;
}


void CALLBACK cmd_paya(std::string param) {
    keyState = 1;
    CreateThread(NULL, 0, tsendmsg, 0, 0, NULL);
}