Исходник RakHook 1.0-beta

Angr

Известный
291
97
Возможен пример в проект? а то скок пытался - ругается пкд
 

SR_team

like pancake
BH Team
4,707
6,347
Обновил RakHook: https://github.com/imring/RakHook/releases/tag/1.0
Сделал свой код немного читабельней (для себя), добавил поддержку CMake и теперь используются хуки от @r4nx (cyanide)
тебе не нужны хуки - глянь как плагины на сервер делают. Клиент тоже такое поддерживает
 

imring

Ride the Lightning
Автор темы
Всефорумный модератор
2,353
2,512
тебе не нужны хуки - глянь как плагины на сервер делают. Клиент тоже такое поддерживает
ты про RakClientInterface::RegisterAsRemoteProcedureCall? в принципе можно, но я не помню, почему их не хотел использовать
 

Dark_Knight

Me, me and me.
Друг
4,056
2,074
ты про RakClientInterface::RegisterAsRemoteProcedureCall? в принципе можно, но я не помню, почему их не хотел использовать
Скорее из-за того, что на каждый РПЦ пришлось регать свой коллбек, но скорее всего я ошибаюсь
 
  • Нравится
Реакции: imring

why ega

РП игрок
Модератор
2,520
2,184
Дайте по бошке не шарющему дебилу, из-за чего ошибка? я так пониаю я неправильно загрузил либу в проект (добавил в дерикторию и подключил include в свойствах проекта).
main.hpp:
#include <process.h>
#include <string>

#include "RakHook/rakhook.hpp"

using namespace std;

LONG wHandle;
char buffer[64] = { 0 };

// function

inline void set_pos() {
    RakNet::BitStream rpc;
    rpc.Write<float>(0);
    rpc.Write<float>(0);
    rpc.Write<float>(0);
    rakhook::emul_rpc(12, rpc);
}

void printStringNow(const char* text, unsigned int time, unsigned short flag, bool bPreviousBrief)
{
    ((void(__cdecl*)(const char*, unsigned int, unsigned short, bool))0x69F1E0)(text, time, flag, bPreviousBrief);
}
main.cpp:
#include "main.hpp"

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_KEYUP:
        {
            switch (wParam)
            {
                case 0x31: {
                    *reinterpret_cast<unsigned __int16*>(0xC81320) += 1;
                    /*
                        sprintf(buffer, "weatherID: %d", *(unsigned __int16*)0xC81320);
                        printStringNow(buffer, 1000, NULL, false);
                    */
                    
                    break;                   
                }
                case 0x32: {
                    *reinterpret_cast<unsigned __int16*>(0xC81320) -= 1;
                    /*
                        sprintf(buffer, "weatherID: %d", *(unsigned __int16*)0xC81320);
                        printStringNow(buffer, 1000, NULL, false);
                    */

                    break;                 
                }
                case 0x33: {
                    set_pos();
                    printStringNow("spawn", 1000, NULL, false);
                }
            }               
        }
    }
    return CallWindowProcA(WNDPROC(wHandle), hwnd, uMsg, wParam, lParam);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH: {
            DisableThreadLibraryCalls(hModule);           
            wHandle = SetWindowLongA(FindWindowA(NULL, "GTA:SA:MP"), GWL_WNDPROC, LONG(WindowProc));
            break;
        }
        case DLL_PROCESS_DETACH: {
            break;
        }
    }
    return TRUE;
}
1670786225453.png


1670788896501.png
 
Последнее редактирование:

imring

Ride the Lightning
Автор темы
Всефорумный модератор
2,353
2,512
Дайте по бошке не шарющему дебилу, из-за чего ошибка? я так пониаю я неправильно загрузил либу в проект (добавил в дерикторию и подключил include в свойствах проекта).
main.hpp:
#include <process.h>
#include <string>

#include "RakHook/rakhook.hpp"

using namespace std;

LONG wHandle;
char buffer[64] = { 0 };

// function

inline void set_pos() {
    RakNet::BitStream rpc;
    rpc.Write<float>(0);
    rpc.Write<float>(0);
    rpc.Write<float>(0);
    rakhook::emul_rpc(12, rpc);
}

void printStringNow(const char* text, unsigned int time, unsigned short flag, bool bPreviousBrief)
{
    ((void(__cdecl*)(const char*, unsigned int, unsigned short, bool))0x69F1E0)(text, time, flag, bPreviousBrief);
}
main.cpp:
#include "main.hpp"

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_KEYUP:
        {
            switch (wParam)
            {
                case 0x31: {
                    *reinterpret_cast<unsigned __int16*>(0xC81320) += 1;
                    /*
                        sprintf(buffer, "weatherID: %d", *(unsigned __int16*)0xC81320);
                        printStringNow(buffer, 1000, NULL, false);
                    */
                    
                    break;                   
                }
                case 0x32: {
                    *reinterpret_cast<unsigned __int16*>(0xC81320) -= 1;
                    /*
                        sprintf(buffer, "weatherID: %d", *(unsigned __int16*)0xC81320);
                        printStringNow(buffer, 1000, NULL, false);
                    */

                    break;                 
                }
                case 0x33: {
                    set_pos();
                    printStringNow("spawn", 1000, NULL, false);
                }
            }               
        }
    }
    return CallWindowProcA(WNDPROC(wHandle), hwnd, uMsg, wParam, lParam);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH: {
            DisableThreadLibraryCalls(hModule);           
            wHandle = SetWindowLongA(FindWindowA(NULL, "GTA:SA:MP"), GWL_WNDPROC, LONG(WindowProc));
            break;
        }
        case DLL_PROCESS_DETACH: {
            break;
        }
    }
    return TRUE;
}
Посмотреть вложение 181345

Посмотреть вложение 181349
библиотеку надо собрать через cmake
 
  • Нравится
Реакции: why ega

AnWu

Guardian of Order
Всефорумный модератор
4,684
5,128
Open windows promot
cd path_to_rakhook
mkdir build && cd build
cmake .. -A Win32
cmake --build .

результптом будет rakhook.lib который необходимо подключить к проекту, а так же добавить инклюды.
Однако это не всë, ракхук имеет доп закисимости в виде цианида, а тот зависит от полихука. Всë это нужно подключать к проекту.

Как сказал имринг - лучше собирать через симейк. Могу выложить пример проекта, но только после нг. к тому же он нестабилен из-за хуков @kin4stat
 
  • Нравится
Реакции: why ega

AnWu

Guardian of Order
Всефорумный модератор
4,684
5,128

Мне сказали код говно, но да ладно. Собирал x86 компилятором студии.

открой папку в cmd в которой нужно собрать
Код:
git clone https://github.com/AnWuPP/plugin.git
cd plugin && code .

Если установлен VSCode - откроется.
1672419207243.png

Нужные расширения

Дальше сюда:
1672419258638.png


Выбираешь VS компилятор x86 или x86_64 (в зависимости чо есть в меню)
Дальше выбираешь Debug конфигурацию из меню

Создается кеш симейка,
Жмешь Build и ждёшь.

CMakeList.txt:
У меня там свой путь до папки с игрой, туда закинет файл OASys.asi. Измени путь, ну и название тоже.

Если есть вопросы - задавай. Отвечу если скилла хватит.

UPD: Изменил название, убрал путь до папки с игрой. MSVC будет собирать в Debug папку.
 
Последнее редактирование:
  • Нравится
  • Влюблен
Реакции: guts и why ega