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

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,757
4,895
Как исправить рендер текста кириллицы из текст_дравов. Шрифт имгуи точно поддерживает кириллицу. При дебаге текст так-же валидный, а на рисовке уже покрывается знаками вопроса.
Юзаю смейк проект, стандарт С++ 20, sampapi
Посмотреть вложение 256237

Посмотреть вложение 256238
imgui понимает текст только в utf8, самп - только в cp1251. Конвертируй кодировки
 
  • Нравится
Реакции: EclipsedFlow и ARMOR

EclipsedFlow

Известный
Проверенный
1,044
491
Как корректно получить киррилицу при хуке rpc 134(RPC_ScrShowTextDraw).

1731959236160.png
C++:
rakhook::on_receive_rpc += [](unsigned char& id, RakNet::BitStream* bs) -> bool {
    // Версия сампа R1/R3
    if (id == 134) // RPC_ScrShowTextDraw
    {
        WORD TID, TLen;
        char Text[1024];
        bs->Read(TID);
        bs->IgnoreBits(504);
        bs->Read(TLen);
        bs->Read(Text, TLen);
        bs->ResetReadPointer();
        Text[TLen] = '\0';

        SendChatMessage("[%d]: %s", TID, Text);
    }

    return true;
};
 

вайега52

cache miss
Модератор
3,060
3,293
Как корректно получить киррилицу при хуке rpc 134(RPC_ScrShowTextDraw).

C++:
rakhook::on_receive_rpc += [](unsigned char& id, RakNet::BitStream* bs) -> bool {
    // Версия сампа R1/R3
    if (id == 134) // RPC_ScrShowTextDraw
    {
        WORD TID, TLen;
        char Text[1024];
        bs->Read(TID);
        bs->IgnoreBits(504);
        bs->Read(TLen);
        bs->Read(Text, TLen);
        bs->ResetReadPointer();
        Text[TLen] = '\0';

        SendChatMessage("[%d]: %s", TID, Text);
    }

    return true;
};
 

EclipsedFlow

Известный
Проверенный
1,044
491
Возникли проблемы с хуком функции для SetGameKeyState(CPad_UpdateKeyStates, вроде так называется). Раньше работала нормально в проекте когда юзал(тогда юзал другой хукер к слову), а сейчас вылетает много исключений и краш. Вот мой хук который я использую. Правильно все с кодом?

C++:
kthook::kthook_simple<BYTE(__thiscall*)(CPad*, int)> hookKeys{};

auto CPad_UpdateKeyGame_HOOK = [](const decltype(hookKeys)& hook, CPad* pPad, int a2) -> BYTE
{
    if (isPluginInitialize)
    {
        // do work...
    }

    return hook.get_trampoline()(pPad, a2);
};

// install
hookKeys.set_cb(CPad_UpdateKeyGame_HOOK);
hookKeys.set_dest(0x541E17);
hookKeys.install();

// remove
hookKeys.remove();
 

EclipsedFlow

Известный
Проверенный
1,044
491
Возникли проблемы с хуком функции для SetGameKeyState(CPad_UpdateKeyStates, вроде так называется). Раньше работала нормально в проекте когда юзал(тогда юзал другой хукер к слову), а сейчас вылетает много исключений и краш. Вот мой хук который я использую. Правильно все с кодом?

C++:
kthook::kthook_simple<BYTE(__thiscall*)(CPad*, int)> hookKeys{};

auto CPad_UpdateKeyGame_HOOK = [](const decltype(hookKeys)& hook, CPad* pPad, int a2) -> BYTE
{
    if (isPluginInitialize)
    {
        // do work...
    }

    return hook.get_trampoline()(pPad, a2);
};

// install
hookKeys.set_cb(CPad_UpdateKeyGame_HOOK);
hookKeys.set_dest(0x541E17);
hookKeys.install();

// remove
hookKeys.remove();
Все ещё актуально, параллельно сам пробую, но если кто-то раньше подскажет - буду благодарен
 

ARMOR

God has forsaken us
Модератор
5,059
7,462
Все ещё актуально, параллельно сам пробую, но если кто-то раньше подскажет - буду благодарен
Это из-за того что SF тоже хукает CPad::Update(). Пролог метода изменяется на прыжок в функцию SF

Как выглядит стандартный пролог CPad::Update()
Знімок екрана 2024-12-08 004842.png


Пролог CPad::Update() с накатаным SF:
Знімок екрана 2024-12-08 004944.png
 

EclipsedFlow

Известный
Проверенный
1,044
491
Это из-за того что SF тоже хукает CPad::Update(). Пролог метода изменяется на прыжок в функцию SF

Как выглядит стандартный пролог CPad::Update()
Посмотреть вложение 258971

Пролог CPad::Update() с накатаным SF:
Посмотреть вложение 258972
Спасибо за ответ. И каким образом можно перехукать например?
 

sc6ut

неизвестный
Модератор
385
1,111
Почему бы не поставить хук на хук
не всегда сработает, к примеру бандикам поллит адрес своего хука и если ставишь свой он ставит свой поверх и хуячит твой.

можно поставить хук после пролога - на 5 байт дальше начала функции условно. по крайней мере, так я пофиксил работу с бандикамом в ультравх.
 
  • Нравится
Реакции: ARMOR

etereon

MQ-Team
Проверенный
332
865
не всегда сработает, к примеру бандикам поллит адрес своего хука и если ставишь свой он ставит свой поверх и хуячит твой.

можно поставить хук после пролога - на 5 байт дальше начала функции условно. по крайней мере, так я пофиксил работу с бандикамом в ультравх.
Я имел ввиду поставить хук на чужой детур
 
  • Нравится
Реакции: sc6ut

0xff65

Участник
37
3
Приветствую, решил подогнать лоадер с метод инъекции SetWindowsHookEx, изменял только FindWindowA, но лоадер стопается на моменте [ERROR]: please, start game, что не так?

C++:
#include "loaderFree.hpp"

void downloadFile(const char *dllLink, const char *dllPath)
{
    URLDownloadToFileA(0, dllLink, dllPath, 0, 0);
    DeleteUrlCacheEntryA(dllLink);

    std::cout << "[INFO]: software downloaded!" << std::endl;
}

bool injectDll(const char *dllPath) // by ICoded
{
    HWND hWnd = FindWindowA("NULL", "GTA:SA:MP");
    if (!hWnd) {
        std::cout << "[ERROR]: please, start game" << std::endl;
        return false;
    }
    
    DWORD pid;
    DWORD tid = GetWindowThreadProcessId(hWnd, &pid);
    if (!tid)
    {
        std::cout << "[ERROR]: cannot get process id" << std::endl;
        return false;
    }

    HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, tid);
    if (!hThread || hThread == INVALID_HANDLE_VALUE)
    {
        std::cout << "[ERROR]: cannot open process" << std::endl;
        return false;
    }

    HMODULE hMod = LoadLibraryExA(dllPath, NULL, DONT_RESOLVE_DLL_REFERENCES);
    if (!hMod)
    {
        std::cout << "[ERROR]: cannot load software" << std::endl;
        return false;
    }

    if (!SetWindowsHookExW(3, (HOOKPROC)GetProcAddress, hMod, tid))
    {
        std::cout << "[ERROR]: cannot set hook" << std::endl;
        return false;
    }

    std::cout << "[INFO]: injected!" << std::endl;

    Sleep(5000);

    if (PostThreadMessageW(tid, 0, 0, 0))
    {
        ShowWindow(GetConsoleWindow(), SW_HIDE);
        WaitForSingleObject(hThread, INFINITE);
        CloseHandle(hThread);
    }
    
    return true;
}

int main()
{
    std::cout << "[INFO]: starting download..." << std::endl;
    downloadFile(DLL_LINK, DLL_PATH);

    std::cout << "[INFO]: injecting..." << std::endl;
    injectDll(DLL_PATH);

    system("pause");
    return true;
}
 

Smeruxa

smeruxa.ru
Проверенный
1,434
800
Приветствую, решил подогнать лоадер с метод инъекции SetWindowsHookEx, изменял только FindWindowA, но лоадер стопается на моменте [ERROR]: please, start game, что не так?

C++:
#include "loaderFree.hpp"

void downloadFile(const char *dllLink, const char *dllPath)
{
    URLDownloadToFileA(0, dllLink, dllPath, 0, 0);
    DeleteUrlCacheEntryA(dllLink);

    std::cout << "[INFO]: software downloaded!" << std::endl;
}

bool injectDll(const char *dllPath) // by ICoded
{
    HWND hWnd = FindWindowA("NULL", "GTA:SA:MP");
    if (!hWnd) {
        std::cout << "[ERROR]: please, start game" << std::endl;
        return false;
    }
  
    DWORD pid;
    DWORD tid = GetWindowThreadProcessId(hWnd, &pid);
    if (!tid)
    {
        std::cout << "[ERROR]: cannot get process id" << std::endl;
        return false;
    }

    HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, tid);
    if (!hThread || hThread == INVALID_HANDLE_VALUE)
    {
        std::cout << "[ERROR]: cannot open process" << std::endl;
        return false;
    }

    HMODULE hMod = LoadLibraryExA(dllPath, NULL, DONT_RESOLVE_DLL_REFERENCES);
    if (!hMod)
    {
        std::cout << "[ERROR]: cannot load software" << std::endl;
        return false;
    }

    if (!SetWindowsHookExW(3, (HOOKPROC)GetProcAddress, hMod, tid))
    {
        std::cout << "[ERROR]: cannot set hook" << std::endl;
        return false;
    }

    std::cout << "[INFO]: injected!" << std::endl;

    Sleep(5000);

    if (PostThreadMessageW(tid, 0, 0, 0))
    {
        ShowWindow(GetConsoleWindow(), SW_HIDE);
        WaitForSingleObject(hThread, INFINITE);
        CloseHandle(hThread);
    }
  
    return true;
}

int main()
{
    std::cout << "[INFO]: starting download..." << std::endl;
    downloadFile(DLL_LINK, DLL_PATH);

    std::cout << "[INFO]: injecting..." << std::endl;
    injectDll(DLL_PATH);

    system("pause");
    return true;
}
Попробуй так
HWND hWnd = FindWindowA(NULL, "GTA:SA:MP");
+ старт программы от имени админа
 
  • Нравится
Реакции: 0xff65