Подведи собственные итоги года совместно с YOUGAME и забери ценные призы! Перейти

Вызываем удаленно игровую функцию и WinAPI

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
7 Мар 2019
Сообщения
16
Реакции
14
Привет, сегодня мы будем вызывать игровую функцию из exe
Пример вызова в dll:
C++:
Expand Collapse Copy
#define FUNC_CMessages__AddMessageJumpQ 0x69F1E0
void AddMessageJumpQ(char *text, unsigned int time, unsigned short flag, bool bPreviousBrief)
{
    ((void(__cdecl *)(char *, unsigned int, unsigned short, bool))FUNC_CMessages__AddMessageJumpQ)(text, time, flag, bPreviousBrief);
}

AddMessageJumpQ("hello", 500, NULL,false); // вызываем

Для вызова из exe мы будем использовать:
-OpenProcess
-VirtualAllocEx
-WriteProcessMemory
-CreateRemoteThread

Создаем структуру для передачи аргументов в удаленный поток(CreateRemoteThread):
C++:
Expand Collapse Copy
struct Struct
{
    char text[256];
    unsigned int time;
    unsigned short flag;
    bool bPreviousBrief;
    DWORD pAdr;
}FuncArgs;
Создаем прототип:
C++:
Expand Collapse Copy
typedef void(__cdecl *_SendMSG)(char*, unsigned int, unsigned short, bool);
Создаем нашу функцию, которую будем вызывать. Под ней создаем еще одну, для получения размера
C++:
Expand Collapse Copy
DWORD __stdcall RemoteThread(Struct *sArg)
{
    _SendMSG msg = (_SendMSG)sArg->pAdr; // передаем адрес
    msg(sArg->text, sArg->time, sArg->flag, sArg->bPreviousBrief); // вызываем
    return 0;
}
void __stdcall RemoteThread_end() {}
Заполняем структуру:
C++:
Expand Collapse Copy
strcpy(FuncArgs.text, "Hello world!");
FuncArgs.time = 500;
FuncArgs.flag = NULL;
FuncArgs.bPreviousBrief = false;
FuncArgs.pAdr = 0x69F1E0;
Функция для получения id процесса:
C++:
Expand Collapse Copy
DWORD GetProcId(const char* procname)
{
    PROCESSENTRY32 pe;
    HANDLE hSnap;

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

C++:
Expand Collapse Copy
// получаем хэндл процесса
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetProcId("gta_sa.exe"));
    // Выделяем память под наш поток в gta_sa
    LPVOID pRemoteThread = VirtualAllocEx(hProcess, NULL, (DWORD_PTR)RemoteThread_end - (DWORD_PTR)RemoteThread, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    // Записываем его
    WriteProcessMemory(hProcess, pRemoteThread, (LPVOID)RemoteThread, ((DWORD_PTR)RemoteThread_end - (DWORD_PTR)RemoteThread), 0);
    // Выделяем память для нашего объекта в gta_sa
    Struct *myArg = (Struct*)VirtualAllocEx(hProcess, NULL, sizeof(Struct), MEM_COMMIT, PAGE_READWRITE);
    // Записываем его
    WriteProcessMemory(hProcess, myArg, &FuncArgs, sizeof(Struct), NULL);
    // Запускаем наш поток pRemoteThread с аргументами myArg
    HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)pRemoteThread, myArg, 0, 0);
    // Закрываем дескриптор потока
    CloseHandle(hThread);
    // Освобождаем выделенную память
    VirtualFreeEx(hProcess, myArg, sizeof(Struct), MEM_RELEASE);
    // Закрываем дескриптор процесса
    CloseHandle(hProcess);

Получаем:
b4aX9ze.png

Пример с WinAPI(Beep):

Создаем структуру и прототип:
C++:
Expand Collapse Copy
typedef BOOL(__stdcall *__Beep)(DWORD, DWORD);
struct sBeep
{
    DWORD Freq;
    DWORD Duration;
    DWORD pAdr;

} myBeep;

Заполняем структуру:
C++:
Expand Collapse Copy
myBeep.Freq = 500;
myBeep.Duration = 50;
HMODULE kernel = LoadLibrary("Kernel32.dll"); // Получаем адрес kernel32
myBeep.pAdr = (DWORD)GetProcAddress(kernel,"Beep"); // получаем адрес функции Beep
FreeLibrary(kernel);

C++:
Expand Collapse Copy
DWORD __stdcall RemoteThread(sBeep *sArg)
{
    __Beep msg = (__Beep)sArg->pAdr;
    msg(sArg->Freq, sArg->Duration);
    return 0;
}
void __stdcall RemoteThread_end() {}

C++:
Expand Collapse Copy
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetProcId("gta_sa.exe"));
    // Выделяем память под наш поток в gta_sa
    LPVOID pRemoteThread = VirtualAllocEx(hProcess, NULL, (DWORD_PTR)RemoteThread_end - (DWORD_PTR)RemoteThread, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    // Записываем его
    WriteProcessMemory(hProcess, pRemoteThread, (LPVOID)RemoteThread, ((DWORD_PTR)RemoteThread_end - (DWORD_PTR)RemoteThread), 0);
    // Выделяем память для нашего объекта в gta_sa
    sBeep *myArg = (sBeep*)VirtualAllocEx(hProcess, NULL, sizeof(sBeep), MEM_COMMIT, PAGE_READWRITE);
    // Записываем его
    WriteProcessMemory(hProcess, myArg, &myBeep, sizeof(sBeep), NULL);
    // Запускаем наш поток pRemoteThread с аргументами myArg
    HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)pRemoteThread, myArg, 0, 0);
    // Закрываем дескриптор потока
    CloseHandle(hThread);
    // Освобождаем выделенную память
    VirtualFreeEx(hProcess, myArg, sizeof(sBeep), MEM_RELEASE);
    // Закрываем дескриптор процесса
    CloseHandle(hProcess);

Гайд писался на примере игры: gta_sa (SA:MP)
 
Не ну самп как пример = вечное увожение
 
Назад
Сверху Снизу