Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

CSXGuard / BaseHook отлов DeathMsg

Статус пользователя Metal Messiah
сообщение 19.10.2025, 16:54
Сообщение #1


Иконка группы

Стаж: 13 лет

Сообщений: 2458
Благодарностей: 1482
Полезность: 772

HostGame.cf
Пожалуй, напишу в скриптинг т.к. к защите клиента это имеет достаточно посредственное отношение.
Кто-нибудь помнит как отловить в клиенте игры сообщение DeathMsg?
В CSXGuard реализации отлова DeathMsg, сообщений чата и прочего не было, в BaseHook кажется тоже, может кто это видел в исходниках каких-то читов? Подскажите где подсмотреть готовое.

Надо отлавливать %username% killed %username% with %weapon% в каком-либо виде, или то что в консоли пишется, или то что справа вверху в hud'е отображается.

Если в ближайшие дни не найду - буду хукать запись в файл (-condebug) я это явно быстрее реализую. Как-то давненько я уже не занимался кодингом под винду и доработками протектора.

Отредактировал: Metal Messiah, - 19.10.2025, 16:54


Полезные публикации - ссылки у меня в профиле. Ссылка на плагин против спама на сервере StopServerSpam там же.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Impression
сообщение 22.10.2025, 16:24
Сообщение #2
Стаж: 14 лет
Город: Киев

Сообщений: 271
Благодарностей: 87
Полезность: < 0



Код:
// typedef оригинала
int (__cdecl *orig_ConPrintf)(const char *fmt, ...);

int __cdecl my_ConPrintf(const char *fmt, ...)
{
va_list ap; va_start(ap, fmt);
char buf[1024]; vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);

// простая проверка на наличие слова "killed" или "убил" и парсинг
if (strstr(buf, "killed") || strstr(buf, "убил")) {
// распарсить имена/оружие из buf
}

return orig_ConPrintf(fmt, /*...*/); // вызвать оригинал — аккуратно с va_list
}


Отредактировал: Impression, - 22.10.2025, 16:24
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя pro_z
сообщение 22.10.2025, 18:18
Сообщение #3


Стаж: 14 лет

Сообщений: 98
Благодарностей: 12
Полезность: 17

Impression,
Код
#include <windows.h>
#include <stdio.h>

typedef int (*pfnUserMsgHook)(const char* pszName, int iSize, void* pbuf);
typedef pfnUserMsgHook (*pfnHookUserMsg_t)(char* szMsgName, pfnUserMsgHook pfn);

pfnHookUserMsg_t g_pHookUserMsg = nullptr;
pfnUserMsgHook g_pOrigDeathMsg = nullptr;
unsigned char* g_pMsgBuffer = nullptr;

void BEGIN_READ(void* buf, int size)
{
    g_pMsgBuffer = (unsigned char*)buf;
}

int READ_BYTE()
{
    return *g_pMsgBuffer++;
}

char* READ_STRING()
{
    char* str = (char*)g_pMsgBuffer;
    g_pMsgBuffer += strlen(str) + 1;
    return str;
}

int __cdecl DeathMsg_Handler(const char* pszName, int iSize, void* pbuf)
{
    BEGIN_READ(pbuf, iSize);
    
    int killer = READ_BYTE();
    int victim = READ_BYTE();
    int headshot = READ_BYTE();
    char* weapon = READ_STRING();
    
    char logMsg[256];
    sprintf_s(logMsg, sizeof(logMsg),
              "DeathMsg: Killer=%d, Victim=%d, Headshot=%d, Weapon=%s\n",
              killer, victim, headshot, weapon);
    
    OutputDebugStringA(logMsg);
    
    FILE* log = nullptr;
    fopen_s(&log, "deathmsg.log", "a");
    if(log)
    {
        fprintf(log, "%s", logMsg);
        fclose(log);
    }
    
    return g_pOrigDeathMsg(pszName, iSize, pbuf);
}

DWORD WINAPI InitHook(LPVOID lpParam)
{
    Sleep(3000);
    
    HMODULE hEngine = GetModuleHandleA("hw.dll");
    if(!hEngine)
    {
        OutputDebugStringA("ERROR: hw.dll not found\n");
        return 0;
    }
    
    g_pHookUserMsg = (pfnHookUserMsg_t)GetProcAddress(hEngine, "HookUserMsg");
    if(!g_pHookUserMsg)
    {
        OutputDebugStringA("ERROR: HookUserMsg not found\n");
        return 0;
    }
    
    g_pOrigDeathMsg = g_pHookUserMsg("DeathMsg", DeathMsg_Handler);
    
    if(g_pOrigDeathMsg)
        OutputDebugStringA("DeathMsg hook installed successfully\n");
    else
        OutputDebugStringA("ERROR: Failed to hook DeathMsg\n");
    
    return 1;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
    if(dwReason == DLL_PROCESS_ATTACH)
    {
        DisableThreadLibraryCalls(hModule);
        CreateThread(NULL, 0, InitHook, NULL, 0, NULL);
    }
    
    return TRUE;
}

Может так будет лучше, хз

Отредактировал: pro_z, - 22.10.2025, 18:26
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: