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

Deprecation

Потрачен
7
25
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как можно сделать активацию на команду в asi?
C++:
#define SAMP_INPUT_INFO                0x21A0E8
#define SAMP_FUNC_REGISTERCMD          0x65AD0

BOOL RegisterChatCommand(LPCSTR sName, LPVOID lpvFunction)
{
  
    DWORD dwSAMPAddress = reinterpret_cast<DWORD>(GetModuleHandleA("SAMP.DLL"));
  
    if (dwSAMPAddress)
    {

        LPVOID lpvInputInfo = *reinterpret_cast<LPVOID *>(dwSAMPAddress + SAMP_INPUT_INFO);

        if (lpvInputInfo)
        {
          
            reinterpret_cast<VOID(__thiscall *)(LPVOID, LPCSTR, LPVOID)>(dwSAMPAddress + SAMP_FUNC_REGISTERCMD)
                (lpvInputInfo, sName, lpvFunction);

            return TRUE;

        }

    }

    return FALSE;

}

/*

    Example:

        LPVOID CommandHandler(LPCSTR sParams)
        {
            // sParams - command parameters.
        }

        RegisterChatCommand("CommandName", CommandHandler);

*/
 
  • Нравится
Реакции: why ega и loganhackerdff

ucciModd

Новичок
18
2
Сообщением ранее искал адрес памяти для клавиш гта и получил ответ. Выполнил следующий код:
C++:
while (bThread)
{
    *(int*)(0xB73458 + 0x3) = 255;
}
Все работает, но довольно часто останавливается, будто на микросекунду отжал клавишу
 

Deprecation

Потрачен
7
25
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Сообщением ранее искал адрес памяти для клавиш гта и получил ответ. Выполнил следующий код:
C++:
while (bThread)
{
    *(int*)(0xB73458 + 0x3) = 255;
}
Все работает, но довольно часто останавливается, будто на микросекунду отжал клавишу
Все из за цикла while, возникают несостыковки с основным циклом игры. Как я понял, ты для этих дел создаешь поток, но в твоем случае нужно хукнуть основной цикл игры, и там уже ставить статус клавише. Пример хука можно поглядеть вот тут:
 
  • Нравится
Реакции: ucciModd

ucciModd

Новичок
18
2
Все из за цикла while, возникают несостыковки с основным циклом игры. Как я понял, ты для этих дел создаешь поток, но в твоем случае нужно хукнуть основной цикл игры, и там уже ставить статус клавише. Пример хука можно поглядеть вот тут:
Теперь перестал воспроизводить нажатие, хотя любой другой код исполняется

C++:
SA->getSignals()->onLoop += [&]() {
    if (bTest)
        *(int*)(0xB73458 + 0x3) = 255;
};
 

ucciModd

Новичок
18
2
Смотри, когда ты присваиваешь 128 - ты зажимаешь клавишу, когда 0 - отжимаешь.
Можешь просто присвоить 128 и он у тебя вечно бежать будет.
Ну я понимаю, что 128 - воспроизведение клавиши, а 0 - отжатие. Если просто поставить 128, то он все равно на микросекунду остановится. А если делать 0/128, то он просто это делает по заданному времени
 

SR_team

like pancake
BH Team
4,720
6,368
Ну я понимаю, что 128 - воспроизведение клавиши, а 0 - отжатие. Если просто поставить 128, то он все равно на микросекунду остановится. А если делать 0/128, то он просто это делает по заданному времени
Попробуй писать еще и по этому адресу: 0x00B7358C
 

Vesca

Новичок
20
0
1586440635130.png
 

MrCold

Активный
364
118
1. Ваш вопрос. Решил на самоизоляции попробовать написать на C++ простой код. Раньше этого не делал, поэтому возможны костыли и небрежность. Суть в чем - выводится не то, что нужно, а именно:
1586456557337.png


Может кто показать ошибку?
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(HANDLE hProcess, const wchar_t* name)
{
    HMODULE hMods[1024];
    DWORD cbNeeded;
    unsigned int i;


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

            if (GetModuleBaseName(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
            {
                if (wcscmp(szModName, name) == 0) return (DWORD)hMods[i];
            }
        }
    }

    CloseHandle(hProcess);

    return 0;
}

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

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

    float X = 0, Y = 0, Z = 0;

    while (true)
    {
        ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x76F3B8 + 0x14 + 0x30), &X, 8, 0);
        ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x76F3B8 + 0x14 + 0x34), &Y, 8, 0);
        ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x76F3B8 + 0x14 + 0x38), &Z, 8, 0);
        cout << "My Coord: " << X << " | " << Y << " | " << Z << endl;
    }
}
 
У

Удалённый пользователь 123482

Гость
1. Ваш вопрос. Решил на самоизоляции попробовать написать на C++ простой код. Раньше этого не делал, поэтому возможны костыли и небрежность. Суть в чем - выводится не то, что нужно, а именно:
Посмотреть вложение 53043

Может кто показать ошибку?
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(HANDLE hProcess, const wchar_t* name)
{
    HMODULE hMods[1024];
    DWORD cbNeeded;
    unsigned int i;


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

            if (GetModuleBaseName(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
            {
                if (wcscmp(szModName, name) == 0) return (DWORD)hMods[i];
            }
        }
    }

    CloseHandle(hProcess);

    return 0;
}

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

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

    float X = 0, Y = 0, Z = 0;

    while (true)
    {
        ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x76F3B8 + 0x14 + 0x30), &X, 8, 0);
        ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x76F3B8 + 0x14 + 0x34), &Y, 8, 0);
        ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x76F3B8 + 0x14 + 0x38), &Z, 8, 0);
        cout << "My Coord: " << X << " | " << Y << " | " << Z << endl;
    }
}
Зачем тебе тут самп, если получить можно с помощью указателя локального CPed'a