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

dekname

Участник
44
2
Хук как ставишь?

x86 jmp (detour) hook. По адресу: base + 0x64450 / base + 0x645A0

UPD: Крашит AddChatMessage. Код:


C++:
PLH::CapstoneDisassembler dis2(PLH::Mode::x86);
PLH::x86Detour detour2(sampapi::GetAddress(0x678A0), (uint64_t)&hk_AddChatMessage, &hookAddChatMessageTramp, dis2);
detour2.hook();

void CALLBACK hk_AddChatMessage(int nType, const char* szText, const char* szPrefix, unsigned long textColor, unsigned long prefixColor)
{
    f << szText << std::endl;
    PLH::FnCast(hookAddChatMessageTramp, &hk_AddChatMessage)(nType, szText, szPrefix, textColor, prefixColor);
}
 
Последнее редактирование:

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,808
x86 jmp (detour) hook. По адресу: base + 0x64450 / base + 0x645A0

UPD: Крашит AddChatMessage. Код:


C++:
PLH::CapstoneDisassembler dis2(PLH::Mode::x86);
PLH::x86Detour detour2(sampapi::GetAddress(0x678A0), (uint64_t)&hk_AddChatMessage, &hookAddChatMessageTramp, dis2);
detour2.hook();

void CALLBACK hk_AddChatMessage(int nType, const char* szText, const char* szPrefix, unsigned long textColor, unsigned long prefixColor)
{
    f << szText << std::endl;
    PLH::FnCast(hookAddChatMessageTramp, &hk_AddChatMessage)(nType, szText, szPrefix, textColor, prefixColor);
}
__thiscall функция потому что
 

dekname

Участник
44
2
__thiscall функция потому что
Я попытался захукать через __fastcall (как есть методы в инете). В лог даже вывело: Connecting to xxx.xx.x.x:7777...
Но после этого крашнуло с экшешином:

njMQQq3.png

Код:

C++:
PLH::CapstoneDisassembler dis2(PLH::Mode::x86);
PLH::x86Detour detour2(sampapi::GetAddress(0x64010), (uint64_t)&hk_AddChatMessage, &hookAddChatMessageTramp, dis2);
detour2.hook();
Код:
void __fastcall hk_AddChatMessage(void* pCChat, const char* szPrefix, unsigned long prefixColor, const char* szText)
{
    if (pCChat == nullptr)
    {
        return;
    }
    f << szText << std::endl;
    PLH::FnCast(hookAddChatMessageTramp, reinterpret_cast<tAddChatMessage>(hk_AddChatMessage))(pCChat, szPrefix, prefixColor, szText);
}

FnCast:
C++:
#define PH_UNUSED(a) (void)a
C++:
template<typename T>
T FnCast(uint64_t fnToCast, T pFnCastTo) {
    PH_UNUSED(pFnCastTo);
    return (T)fnToCast;
}
Как правильно захучить __thiscall?
 
Последнее редактирование:

Gunborg Johansson

Потрачен
32
21
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Я попытался захукать через __fastcall (как есть методы в инете). В лог даже вывело: Connecting to xxx.xx.x.x:7777...
Но после этого крашнуло с экшешином:

njMQQq3.png

Код:

C++:
PLH::CapstoneDisassembler dis2(PLH::Mode::x86);
PLH::x86Detour detour2(sampapi::GetAddress(0x64010), (uint64_t)&hk_AddChatMessage, &hookAddChatMessageTramp, dis2);
detour2.hook();
Код:
void __fastcall hk_AddChatMessage(void* pCChat, const char* text, DWORD textColor)
{
    if (pCChat == nullptr)
    {
        return;
    }
    f << text << std::endl;
    PLH::FnCast(hookAddChatMessageTramp, (tAddChatMessage)&hk_AddChatMessage)(pCChat, text, textColor);
}

FnCast:
C++:
#define PH_UNUSED(a) (void)a
C++:
template<typename T>
T FnCast(uint64_t fnToCast, T pFnCastTo) {
    PH_UNUSED(pFnCastTo);
    return (T)fnToCast;
}
Как правильно захучить __thiscall?
They add all sorts like PolyHook libraries to the project, and they can't figure them out themselves. At least learn the hook logic.
 

redcode

🤔
Друг
147
1,282
Как правильно захучить __thiscall?

Использовать __fastcall и не терять EDX.
C++:
// прототип функции
typedef void(__fastcall* hookedAddChatMessage_t)(void* _this, DWORD EDX, const char* text, DWORD color);

// указатель на оригинальную функцию / трамплин
hookedAddChatMessage_t orig_AddChatMessage;

void __fastcall hooked_AddChatMessage(void* _this, DWORD EDX, const char* text, DWORD color)
{
    // любые действия
    
    return orig_AddChatMessage(_this, EDX, text, color);
}
 
  • Нравится
Реакции: dekname и 4el0ve4ik

dekname

Участник
44
2
Использовать __fastcall и не терять EDX.
C++:
// прототип функции
typedef void(__fastcall* hookedAddChatMessage_t)(void* _this, DWORD EDX, const char* text, DWORD color);

// указатель на оригинальную функцию / трамплин
hookedAddChatMessage_t orig_AddChatMessage;

void __fastcall hooked_AddChatMessage(void* _this, DWORD EDX, const char* text, DWORD color)
{
    // любые действия

    return orig_AddChatMessage(_this, EDX, text, color);
}
С таким кодом просто крашит (в логе даже нет сообщения о коннекте):

C++:
using AddChatMessage_t = void(__thiscall*)(void* pCChat, DWORD EDX, const char* szPrefix, unsigned long prefixColor, const char* szText);
C++:
void __fastcall hk_AddChatMessage(void* pCChat, DWORD EDX, const char* szPrefix, unsigned long prefixColor, const char* szText)
{
    if (pCChat == nullptr)
    {
        return;
    }
    f << szText << std::endl;
    PLH::FnCast(hookAddChatMessageTramp, reinterpret_cast<AddChatMessage_t >(hk_AddChatMessage))(pCChat, EDX, szPrefix, prefixColor, szText);
}