Неактуально беда с аси

nonelike

Известный
Автор темы
40
2
код че:
using CChat__AddEntry = void(__thiscall*)(void*, void*, int, const char*, const char*, unsigned long, unsigned long);
CChat__AddEntry pOriginalFunction = nullptr;

void* SetCallHook(uintptr_t HookAddress, void* DetourFunction) {
    uintptr_t OriginalFunction = *reinterpret_cast<uintptr_t*>(HookAddress + 1) + HookAddress + 5;
    DWORD oldProt;
    VirtualProtect(reinterpret_cast<void*>(HookAddress + 1), sizeof(uintptr_t), PAGE_READWRITE, &oldProt);
    *reinterpret_cast<uintptr_t*>(HookAddress + 1) = reinterpret_cast<uintptr_t>(DetourFunction) - HookAddress - 5;
    VirtualProtect(reinterpret_cast<void*>(HookAddress + 1), sizeof(uintptr_t), oldProt, &oldProt);
    return reinterpret_cast<void*>(OriginalFunction);
}

void __fastcall HOOK_AddEntry(void* pChat, void* EDX, int nType, const char* szText, const char* szPrefix, unsigned long textColor, unsigned long prefixColor) {
    pOriginalFunction(pChat, EDX, nType, szText, szPrefix, textColor, prefixColor);
}

if (uintptr_t dwSAMP = reinterpret_cast<uintptr_t>(GetModuleHandleA("samp.dll")); dwSAMP != 0) {
    pOriginalFunction = reinterpret_cast<CChat__AddEntry>(SetCallHook(dwSAMP + 0x67460, &HOOK_AddEntry));
}

пытаюсь хукнуть CChat__AddEntry, чтоб сменить текст samp started бла бла бла, но игра после запуска просто крашится
 

g305noobo

Известный
Модератор
307
477
ща попробовал с твоим кодом, ваще нет сообщений в консоли (я про враппер в проекте забыл ваще, говно вытворял лютое)
C++:
#include "plugin.h"

#include <samp.h>

void __fastcall add_chat_entry(void* pChat, void* edx, int nType,
    const char* szText, const char* szPrefix,
    unsigned long textColor,
    unsigned long prefixColor);

inline c_hook<decltype(&add_chat_entry)> add_chat_entry_hook{};

void __fastcall add_chat_entry(void* pChat, void* edx, int nType,
    const char* szText, const char* szPrefix,
    unsigned long textColor,
    unsigned long prefixColor) {
    //вывод текста в чате
    std::printf("add_chat_entry: %s\n", szText);
    // вызов оригинала
    return add_chat_entry_hook.call_original(pChat, edx, nType, szText, szPrefix,
        textColor, prefixColor);
}

void c_plugin::game_loop() {
    static bool initialized = false;

    if (initialized || !rakhook::initialize() || c_chat::get()->ref() == nullptr)
        return game_loop_hook.call_original();

    initialized = true;

    return game_loop_hook.call_original();
}

void c_plugin::attach_console() {
    if (!AllocConsole())
        return;

    FILE* f;
    freopen_s(&f, "CONOUT$", "w", stdout);
    freopen_s(&f, "CONOUT$", "w", stderr);
    freopen_s(&f, "CONIN$", "r", stdin);
}

c_plugin::c_plugin(HMODULE hmodule) : hmodule(hmodule)
{
    attach_console();

    std::uintptr_t address_func_to_hook =
        (std::uintptr_t)GetModuleHandleA("samp.dll") + 0x67460;

    add_chat_entry_hook.set_adr(address_func_to_hook);
    add_chat_entry_hook.add(&add_chat_entry);

    game_loop_hook.add(&c_plugin::game_loop);
}

c_plugin::~c_plugin()
{
    rakhook::destroy();
}
точно ли ты юзаешь верную версию сампа, ведь у тебя адрес для р3.
 

nonelike

Известный
Автор темы
40
2
1728496565386.png
я чекал в иде по samp.dll, адрес сходится
 

Red Fox

Новичок
22
2
c MinHook работает нормально


C++:
typedef void(__thiscall* tChatAddEntry)(void*, int nType, char* szText, char* szPrefix, DWORD textColor, DWORD prefixColor);
tChatAddEntry origChatAddEntry = nullptr;

void __fastcall HOOKED_ChatAddEntry(void* _this, void* pUnk, int nType, char* szText, char* szPrefix, DWORD textColor, DWORD prefixColor) {

    if (nType == 8 && strstr(szText, "{FFFFFF}SA-MP {B9C9BF}0.3.7-R3 {FFFFFF}Started"))
        sprintf(szText, "{FFFFFF}Custom Text");

    return origChatAddEntry(_this, nType, szText, szPrefix, textColor, prefixColor);
}

DWORD base = (DWORD)GetModuleHandleA("samp.dll");
MH_Initialize();
MH_CreateHook((void*)(base + 0x0067460), &HOOKED_ChatAddEntry, (void**)&origChatAddEntry);
MH_EnableHook((void*)(base + 0x0067460));

//================= [unload .asi] =================

MH_DisableHook((void*)(base + 0x0067460));
 
  • Нравится
Реакции: nonelike

nonelike

Известный
Автор темы
40
2
у тебя ж мой враппер MinHook в проекте o_O, используй его или напрямую саму библиотеку, зачем тебе это говно которое ты юзаешь с калхуками или даже тем, что скинули с сырым джамп хуком?

также учти, точно ли ты юзаешь верную версию сампа, ведь у тебя адрес для р3.
с моим проектом это должно выглядеть так(должно работать, не тестил):
C++:
// объявляю функцию
// объявление функции нужно, чтобы можно было использовать decltype для создания
// объекта хука, не указывая тип явно через using. это упрощает код, так как
// вывод типа происходит автоматически, однако, можно было бы и явно определить
// тип с помощью using
void __fastcall add_chat_entry(void* pChat, void* edx, int nType,
                               const char* szText, const char* szPrefix,
                               unsigned long textColor,
                               unsigned long prefixColor);

// создаю объект хука, в котором указываю тип функции, с помощью decltype
inline c_hook<decltype(&add_chat_entry)> add_chat_entry_hook{};

void __fastcall add_chat_entry(void* pChat, void* edx, int nType,
                               const char* szText, const char* szPrefix,
                               unsigned long textColor,
                               unsigned long prefixColor) {
  //вывод текста в чате
  std::printf("add_chat_entry: %s\n", szText);
  // вызов оригинала
  return add_chat_entry_hook.call_original(pChat, edx, nType, szText, szPrefix,
                                           textColor, prefixColor);
}

// edx - неиспользуемый параметр, так как функция использует __fastcall.
// этот регистр добавлен для совместимости с thiscall-функцией,
// поскольку __fastcall требует двух регистров (ecx и edx),
// что позволяет перехватывать вызовы thiscall функций
c_plugin::c_plugin(HMODULE hmodule) : _hmodule(hmodule) {
  attach_console();

  std::uintptr_t address_func_to_hook =
      (std::uintptr_t)GetModuleHandleA("samp.dll") + 0x67460;

  add_chat_entry_hook.set_adr(address_func_to_hook);
  add_chat_entry_hook.add(&add_chat_entry);
}

p.s лучше почитай про хуки, какие типы бывают и как работают, а также используй готовые решения, как например писал раньше - MinHook, это намного удобнее и круче
твой код работает, но если
Код:
  std::uintptr_t address_func_to_hook =

      (std::uintptr_t)GetModuleHandleA("samp.dll") + 0x67460;

  add_chat_entry_hook.set_adr(address_func_to_hook);

  add_chat_entry_hook.add(&add_chat_entry);
засунуть в game_loop, разве это так должно работать? не в c_plugin::c_plugin?
 

nonelike

Известный
Автор темы
40
2
твой код работает, но если
Код:
  std::uintptr_t address_func_to_hook =

      (std::uintptr_t)GetModuleHandleA("samp.dll") + 0x67460;

  add_chat_entry_hook.set_adr(address_func_to_hook);

  add_chat_entry_hook.add(&add_chat_entry);
засунуть в game_loop, разве это так должно работать? не в c_plugin::c_plugin?
@g305noobo
 

g305noobo

Известный
Модератор
307
477
твой код работает, но если
Код:
  std::uintptr_t address_func_to_hook =

      (std::uintptr_t)GetModuleHandleA("samp.dll") + 0x67460;

  add_chat_entry_hook.set_adr(address_func_to_hook);

  add_chat_entry_hook.add(&add_chat_entry);
засунуть в game_loop, разве это так должно работать? не в c_plugin::c_plugin?
не понял, что ты хочешь
тебе надо это в геймлуп засунуть что-ли? c_plugin - это конструктор, который выступает в роли аля dllmain, он вызывается 1 раз, геймлуп вызывается постоянно, можешь и там хук ставить просто проверяя на иниацилизацию и все, как хочешь
 

nonelike

Известный
Автор темы
40
2
не понял, что ты хочешь
тебе надо это в геймлуп засунуть что-ли? c_plugin - это конструктор, который выступает в роли аля dllmain, он вызывается 1 раз, геймлуп вызывается постоянно, можешь и там хук ставить просто проверяя на иниацилизацию и все, как хочешь
у меня в конструкторе хук не канает на чат, из-за того что самп не успевает инициализироваться? на геймлуп хук робит, а в геймлупе работает, но постоянно делает хук
 
Последнее редактирование:

g305noobo

Известный
Модератор
307
477
у меня в конструкторе хук не канает на чат, из-за того что самп не успевает инициализироваться? на геймлуп хук робит, а в геймлупе работает, но постоянно делает хук
у тебя в геймлупе есть if !initialized что то такое, туда суй
 
  • Нравится
Реакции: nonelike