Перехват сообщений SAMP

F1reGG

Новичок
Автор темы
8
0
всем привет, хочу сделать asi, чтобы он хукал стандартные сообщения типа "sa-mp 0.3.7 started, сделан скрин экрана" и т.д., но не умею делать хук, можете показать пример хука стандартных сообщений на c++ ? вот оффсет 0xD396C SAMP 0.3.7 started
 
Решение
C++:
#include <Windows.h>
#include <iostream>

#include "MinHook.h"
#pragma comment(lib, "libMinHook-x86-v141-mt.lib")

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) {

    printf("type: %d, msg: %s\n", nType, szText);
    
    return origChatAddEntry(_this, nType, szText, szPrefix, textColor, prefixColor);
}

class CPluginInit {
public:
    CPluginInit() {
        base = (DWORD)GetModuleHandleA("samp.dll");
        MH_Initialize();
        MH_CreateHook((void*)(base + 0x0064010)...

AdCKuY_DpO4uLa

Известный
286
474
C++:
#include <Windows.h>
#include <iostream>

#include "MinHook.h"
#pragma comment(lib, "libMinHook-x86-v141-mt.lib")

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) {

    printf("type: %d, msg: %s\n", nType, szText);
    
    return origChatAddEntry(_this, nType, szText, szPrefix, textColor, prefixColor);
}

class CPluginInit {
public:
    CPluginInit() {
        base = (DWORD)GetModuleHandleA("samp.dll");
        MH_Initialize();
        MH_CreateHook((void*)(base + 0x0064010), &HOOKED_ChatAddEntry, (void**)&origChatAddEntry);
        MH_EnableHook((void*)(base + 0x0064010));
    };

    ~CPluginInit() {
        MH_DisableHook((void*)(base + 0x0064010));
    };

private:
    DWORD base = 0;
}PluginInit;

1629746829406.png
 

F1reGG

Новичок
Автор темы
8
0
C++:
#include <Windows.h>
#include <iostream>

#include "MinHook.h"
#pragma comment(lib, "libMinHook-x86-v141-mt.lib")

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) {

    printf("type: %d, msg: %s\n", nType, szText);
   
    return origChatAddEntry(_this, nType, szText, szPrefix, textColor, prefixColor);
}

class CPluginInit {
public:
    CPluginInit() {
        base = (DWORD)GetModuleHandleA("samp.dll");
        MH_Initialize();
        MH_CreateHook((void*)(base + 0x0064010), &HOOKED_ChatAddEntry, (void**)&origChatAddEntry);
        MH_EnableHook((void*)(base + 0x0064010));
    };

    ~CPluginInit() {
        MH_DisableHook((void*)(base + 0x0064010));
    };

private:
    DWORD base = 0;
}PluginInit;

Посмотреть вложение 111593

так, а каким образом можно заменить эти сообщения на свои?
 

AdCKuY_DpO4uLa

Известный
286
474
В самое начало, перед всеми инклюдами
C++:
#define _CRT_SECURE_NO_WARNINGS
Один из вариантов того, как можно подменить определенное сообщение
C++:
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 {FFFFFF}Started"))
        sprintf(szText, "САМП ЗАПУЩЕН ЪУЪЪУЪУЪУЪУЪ");

    return origChatAddEntry(_this, nType, szText, szPrefix, textColor, prefixColor);
}
1629802060142.png
 
  • Ха-ха
Реакции: Vintik

kin4stat

mq-team
Всефорумный модератор
2,731
4,693
В самое начало, перед всеми инклюдами
А прочитать сообщение об ошибке и попытаться вникнуть что там написано не пробовал? Эти предупреждения появляются из-за многочисленных выстрелов в ногу другими людьми, и даже в крупных проектах по типу MTA/Linux/CPython.
Да и вообще, зачем использовать функцию форматирования с кучей проверок форматирования для копирования константной строки? Про strcpy не слышал? Еще ты потерял const у szText и szPrefix.
О, а еще у тебя UB, так как имена начинающиеся на _ и на __ зарезервированы.
C++:
void __fastcall HOOKED_ChatAddEntry(void *_this, void *pUnk, int nType, const char* szText, const char* szPrefix, DWORD textColor, DWORD prefixColor) {
    std::string_view Message = szText;
    if(nType == 8 && Message == "{FFFFFF}SA-MP {B9C9BF}0.3.7 {FFFFFF}Started")
        Message = "САМП ЗАПУЩЕН ЪУЪЪУЪУЪУЪУЪ";

    return origChatAddEntry(_this, nType, Message.data(), szPrefix, textColor, prefixColor);
}
 
Последнее редактирование:
  • Влюблен
Реакции: AdCKuY_DpO4uLa

AdCKuY_DpO4uLa

Известный
286
474
А прочитать сообщение об ошибке и попытаться вникнуть что там написано не пробовал? Эти предупреждения появляются из-за многочисленных выстрелов в ногу другими людьми, и даже в крупных проектах по типу MTA/Linux/CPython.
Да и вообще, зачем использовать функцию форматирования с кучей проверок форматирования для копирования константной строки? Про strcpy не слышал? Еще ты потерял const у szText и szPrefix.
О, а еще у тебя UB, так как имена начинающиеся на _ и на __ зарезервированы.
C++:
void __fastcall HOOKED_ChatAddEntry(void *_this, void *pUnk, int nType, const char* szText, const char* szPrefix, DWORD textColor, DWORD prefixColor) {
    std::string_view Message;
    if(nType == 8 && std::string_view(szText) == "{FFFFFF}SA-MP {B9C9BF}0.3.7 {FFFFFF}Started")
        Message = "САМП ЗАПУЩЕН ЪУЪЪУЪУЪУЪУЪ";

    return origChatAddEntry(_this, nType, Message.data(), szPrefix, textColor, prefixColor);
}
В чем проявляется UB?

upd: ты возвращаешь Message.data(). Из-за этого весь чат будет пустым, кроме сообщения о старте сампа
 
Последнее редактирование:
  • Нравится
Реакции: kin4stat

.deserve

Участник
32
36
Не советую использовать __thiscall, потому что поддержка этого кейворда есть только начиная с MSVC 2005. При этом компилируя через GCC, clang ты вообще потеряешь доступ к регистру хранящему this ptr (ecx) ибо он будет на стеке валяться. Для почти полной совместимости желательно использовать соглашение __fastcall, ибо оно абсолютно точно реализовано идентично в GCC, g++, clang, ICC и этого набора уже достаточно. А еще при создании функции хука ты можешь попасться на IDB на некоторых имплементациях MSVC, в связи с тем что у тебя нету дефайна класса, что лучше не допускать. (но к удивлению в 14.2 всё нормально)
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,633
2,479

.deserve

Участник
32
36
msbuild запрещает использование __thiscall в любом случае, поэтому приходится костылить через __fastcall
он не запрещает его использовать при вызове других не статических методов класса, но не позволяет определять не статические методы класса, который не был объявлен
 

SR_team

like pancake
BH Team
4,707
6,347
Не советую использовать __thiscall, потому что поддержка этого кейворда есть только начиная с MSVC 2005. При этом компилируя через GCC, clang ты вообще потеряешь доступ к регистру хранящему this ptr (ecx) ибо он будет на стеке валяться. Для почти полной совместимости желательно использовать соглашение __fastcall, ибо оно абсолютно точно реализовано идентично в GCC, g++, clang, ICC и этого набора уже достаточно. А еще при создании функции хука ты можешь попасться на IDB на некоторых имплементациях MSVC, в связи с тем что у тебя нету дефайна класса, что лучше не допускать. (но к удивлению в 14.2 всё нормально)
Для Win32 GCC и Clang используют соглашение __thiscall с this в ECX. Для POSIX у них везде используется только __cdecl (даже для классов)
 
  • Нравится
  • Вау
Реакции: imring, Cake_ и kin4stat

murakami

Известный
131
13
В самое начало, перед всеми инклюдами
C++:
#define _CRT_SECURE_NO_WARNINGS
Один из вариантов того, как можно подменить определенное сообщение
C++:
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 {FFFFFF}Started"))
        sprintf(szText, "САМП ЗАПУЩЕН ЪУЪЪУЪУЪУЪУЪ");

    return origChatAddEntry(_this, nType, szText, szPrefix, textColor, prefixColor);
}
Посмотреть вложение 111662

Адрес 0x0064010 работает только с версией 0.3.7? Если да, то подскажите по какому адресу он будет перехватывать 0.3.dl?