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

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,734
4,737
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

🤔
Друг
144
1,265
Как правильно захучить __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);
}
 

redcode

🤔
Друг
144
1,265
С таким кодом просто крашит (в логе даже нет сообщения о коннекте):
Во первых: стоит использовать нормальную библиотеку для хуков, например: MinHook, Microsoft Detours.
Во вторых: правильный прототип функции должен выглядеть так:
C++:
using AddEntry_t = void(__fastcall*)(void* _this, DWORD edx, int nType, const char* szText, const char* szPrefix, D3DCOLOR textColor, D3DCOLOR prefixColor);
 
  • Нравится
Реакции: dekname

dekname

Участник
44
2
Во первых: стоит использовать нормальную библиотеку для хуков, например: MinHook, Microsoft Detours.

Если вы не слышали, что-то о какой либо библиотеке, например в данном случаи PolyHook, то это не значит, что библиотека говно или наоборот. 600 звезд на GitHub и на unknowncheats.me не считают, что она говно.




Во вторых: правильный прототип функции должен выглядеть так:
C++:
using AddEntry_t = void(__fastcall*)(void* _this, DWORD edx, int nType, const char* szText, const char* szPrefix, D3DCOLOR textColor, D3DCOLOR prefixColor);


Хотелось бы узнать: Почему надо хукать AddEntry, а не AddChatMessage?

А, так спасибо, работает)
 

redcode

🤔
Друг
144
1,265
Если вы не слышали, что-то о какой либо библиотеке, например в данном случаи PolyHook, то это не значит, что библиотека говно или наоборот. 600 звезд на GitHub и на unknowncheats.me не считают, что она говно.
Дело не в том, что она плохая, а в том, что она слишком жирная для сампа.
Хотелось бы узнать: Почему надо хукать AddEntry, а не AddChatMessage?
Функция AddEntry добавляет сообщение в чат.
Функции AddChatMessage и AddMessage выполняют дополнительные операции и вызывают AddEntry.
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,521
Во первых: стоит использовать нормальную библиотеку для хуков, например: MinHook, Microsoft Detours.
есть ОТЕЧЕСТВЕННЫЕ реализации хуков:
- https://github.com/allwanttokissme/Yet-another-hook-library/ by @BlackKnigga
- https://github.com/iammemir/microhooks by @memir (недоделаны)
- https://github.com/katursis/urmem by @urShadow
 
  • Нравится
Реакции: Dark_Knight и sc6ut

Dark_Knight

Me, me and me.
Друг
4,068
2,083
Попробуй на юрмеме так сделать, Код писал по памяти в блокноте++
C++:
#include <iostream>
#include <urmem.hpp>
#include <fstream>

using namespace urmem;
hook hookChat;

void CALLBACK hookFuncMessage(void *t, D3DCOLOR color, const char *text){
    fstream file("test hook.log", ios::binary | ios::app/* or ios::ate // Не помню по памяти какой-то второй должен быть флаг, чтобы писало в конец файла*/);
    file << text << endl;
    file.close();
    hookChat.call<calling_convention::thiscall, void>(t, color, text);
}


void initFunction(){
    hookChat.install(GetAddress(0x645A0)), get_func_addr(&hookFuncMessage));
}

void DeinitFunction(){
    hookChat.disable();
}
.
 
Последнее редактирование:
  • Нравится
Реакции: dekname