Замена текста в диалоге CHelpDialog::Show

vmprotect

Известный
Автор темы
352
193
Всем привет пытаюсь изменить текст диалога который открывается через F1, но в игре возникает ошибка. Возможно, я что-то упускаю или делаю неправильно. Буду благодарен за любую помощь и советы.

hook:
using CDialog__Show = void(__thiscall *)(void*, void*, int, int, int, const char*, const char*, const char*, const char*, bool);
kthook::kthook_simple<CDialog__Show>CDialog__Show_Hook;

void customhook() {
    SampDLL = reinterpret_cast<uintptr_t>(GetModuleHandle("samp.dll"));
    CDialog__Show_Hook.set_dest(SampDLL + 0x6B3E7);

    CDialog__Show_Hook.set_cb([](const decltype(CDialog__Show_Hook)& hook, void* pDialog, void* EDX, int a2, int nId, int nType, const char* Source, const char* szText, const char* szLeftButton, const char* szRightButton, bool bServerside) {
        Source = "custom text";

        return hook.get_trampoline()(pDialog, EDX, a2, nId, nType, Source, szText, szLeftButton, szRightButton, bServerside);
    });

    CDialog__Show_Hook.install();
 }

1731431717497.png


ставлю хук на call ShowDialog внутри функции CHelpDialog::Show
1731432026035.png
 
Решение
Ну сделай без лямбды. Вообще никогда лямбды не использовал для хуков
C++:
using CDialogShow_t = void(__thiscall *)(void*, int, int, const char*, const char*, const char*, const char*, BOOL);
kthook::kthook_simple<CDialogShow_t>CDialogShowHook;

void CDialogShow_HOOKED(const decltype(CDialogShowHook)& hook, void* pDialog, void* edx86, int nId, int nType, const char* szCaption, const char* szText, const char* szLeftButton, const char* szRightButton, BOOL bServerside)
{
    std::string NewMessage{ "test message" };
    return hook.get_trampoline()(pDialog, nId, nType, NewMessage.c_str(), szText, szLeftButton, szRightButton, bServerside);
}

void customhook() {
    std::uintptr_t SampBase =...

AdCKuY_DpO4uLa

Адский дрочер
Друг
317
676
C++:
using CDialogShow_t = void(__thiscall *)(void*, int, int, const char*, const char*, const char*, const char*, BOOL);
kthook::kthook_simple<CDialogShow_t>CDialogShowHook;

void customhook() {
    std::uintptr_t SampBase = reinterpret_cast<std::uintptr_t>(GetModuleHandle("samp.dll"));
    CDialogShowHook.set_dest(SampBase + 0x6B3E7);

    CDialogShowHook.set_cb([](const decltype(CDialogShowHook)& hook, void* pDialog, void* edx86, int nId, int nType, const char* szCaption, const char* szText, const char* szLeftButton, const char* szRightButton, BOOL bServerside) {
        
    std::string NewMessage{ "test message" };

        return hook.get_trampoline()(pDialog, nId, nType, NewMessage.c_str(), szText, szLeftButton, szRightButton, bServerside);
    });

    CDialogShowHook.install();
 }
 

vmprotect

Известный
Автор темы
352
193
C++:
using CDialogShow_t = void(__thiscall *)(void*, int, int, const char*, const char*, const char*, const char*, BOOL);
kthook::kthook_simple<CDialogShow_t>CDialogShowHook;

void customhook() {
    std::uintptr_t SampBase = reinterpret_cast<std::uintptr_t>(GetModuleHandle("samp.dll"));
    CDialogShowHook.set_dest(SampBase + 0x6B3E7);

    CDialogShowHook.set_cb([](const decltype(CDialogShowHook)& hook, void* pDialog, void* edx86, int nId, int nType, const char* szCaption, const char* szText, const char* szLeftButton, const char* szRightButton, BOOL bServerside) {
       
    std::string NewMessage{ "test message" };

        return hook.get_trampoline()(pDialog, nId, nType, NewMessage.c_str(), szText, szLeftButton, szRightButton, bServerside);
    });

    CDialogShowHook.install();
 }
1731432605911.png


я изначально пытался таким методом делать, но у меня бьет эрроры на лямбду

ERROR:
no suitable user-defined conversion from "lambda [](const kthook::kthook_simple<CDialogShow_t, kthook::kNone> &hook, void *pDialog, void *edx86, int nId, int nType, const char *szCaption, const char *szText, const char *szLeftButton, const char *szRightButton, BOOL bServerside)->void" to "kthook::kthook_simple<CDialogShow_t, kthook::kNone>::cb_type" (aka "std::function<void (const kthook::kthook_simple<void (__thiscall *)(void *, int, int, const char *, const char *, const char *, const char *, BOOL), kthook::kNone> &, std::add_lvalue_reference_t<void *>, std::add_lvalue_reference_t<int>, std::add_lvalue_reference_t<int>, std::add_lvalue_reference_t<const char *>, std::add_lvalue_reference_t<const char *>, std::add_lvalue_reference_t<const char *>, std::add_lvalue_reference_t<const char *>, std::add_lvalue_reference_t<int>)>") existsC/C++(312)
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
317
676
Ну сделай без лямбды. Вообще никогда лямбды не использовал для хуков
C++:
using CDialogShow_t = void(__thiscall *)(void*, int, int, const char*, const char*, const char*, const char*, BOOL);
kthook::kthook_simple<CDialogShow_t>CDialogShowHook;

void CDialogShow_HOOKED(const decltype(CDialogShowHook)& hook, void* pDialog, void* edx86, int nId, int nType, const char* szCaption, const char* szText, const char* szLeftButton, const char* szRightButton, BOOL bServerside)
{
    std::string NewMessage{ "test message" };
    return hook.get_trampoline()(pDialog, nId, nType, NewMessage.c_str(), szText, szLeftButton, szRightButton, bServerside);
}

void customhook() {
    std::uintptr_t SampBase = reinterpret_cast<std::uintptr_t>(GetModuleHandle("samp.dll"));

    CDialogShowHook.set_dest(SampBase + 0x6B3E7);
    CDialogShowHook.set_cb(&CDialogShow_HOOKED);
    CDialogShowHook.install();
 }
 
  • Нравится
Реакции: vmprotect

Musaigen

abobusnik
Проверенный
1,614
1,372
Посмотреть вложение 256992

я изначально пытался таким методом делать, но у меня бьет эрроры на лямбду

ERROR:
no suitable user-defined conversion from "lambda [](const kthook::kthook_simple<CDialogShow_t, kthook::kNone> &hook, void *pDialog, void *edx86, int nId, int nType, const char *szCaption, const char *szText, const char *szLeftButton, const char *szRightButton, BOOL bServerside)->void" to "kthook::kthook_simple<CDialogShow_t, kthook::kNone>::cb_type" (aka "std::function<void (const kthook::kthook_simple<void (__thiscall *)(void *, int, int, const char *, const char *, const char *, const char *, BOOL), kthook::kNone> &, std::add_lvalue_reference_t<void *>, std::add_lvalue_reference_t<int>, std::add_lvalue_reference_t<int>, std::add_lvalue_reference_t<const char *>, std::add_lvalue_reference_t<const char *>, std::add_lvalue_reference_t<const char *>, std::add_lvalue_reference_t<const char *>, std::add_lvalue_reference_t<int>)>") existsC/C++(312)
Ну понятное дело бьет ошибку, в ктхуках добавлять параметр edx86 не нужно + нужно добавить всем параметрам lval reference
 
Последнее редактирование: