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

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

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

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

> Важная информация

Перед тем как создать тему или задать вопрос, ознакомьтесь с данной темой, там собраны наиболее распространенные уязвимости и способы устранения.
Так же не поленитесь воспользоваться поиском, вполне возможно, что ваш вопрос уже поднимался на форуме.
При создании новой темы уделите внимание ее названию, оно должно кратко описывать суть вашего вопроса/проблемы. Все вновь созданные темы с названиями "Помогите", "Объясните", "Подскажите" и т.д. будут удалены, а их авторы наказаны.
413 страниц V  « 127 128 129 ... 411 412 »

Защита Counter Strike Сервера

, Методы защиты от различных уязвимостей игровых серверов
Статус пользователя [WPMG]PRoSToTeM@
сообщение 11.8.2014, 19:34
Сообщение #2541
Стаж: 14 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

Цитата(Safety1st @ 11.8.2014, 21:33) *
rofl.gif

Не модуль же. Я же написал что баг в amxmodx и чатоплагинах. Исправил в amxmodx, что не так?

Отредактировал: [WPMG]PRoSToTeM@, - 11.8.2014, 19:35
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 11.8.2014, 19:43
Сообщение #2542
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Не, всё так.

dll'ка - meta-модуль. Я не уточнял, какой модуль имею ввиду.
Ещё один пример, когда ты докапываешься и пфыкаешь, не понимая, что я имею ввиду.

А вообще весело получилось: сам же на фптиме раструбил об уязвимости, сам же и фиксишь. Как астрог прям
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 11.8.2014, 19:47
Сообщение #2543
Стаж: 14 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

Проблема-то по сути в том, что плагины, которые используют client_print/console_print не следят за небезопасными символами, по сути проще либо сделать безопасными эти функции (что позволит эти символы также спокойно выводить), либо сделать отдельные безопасные функции и поменять их где надо (или везде), либо ещё как вариант для некоторых плагинов (которые специально юзают локализованные фразы) сделать unsafe варианты функции (поменять в нескольких плагинах проще, чем в куче). Не будем же мы перед каждым client_print/console_print вырезать все эти символы.

Цитата(Safety1st @ 11.8.2014, 21:43) *
Не, всё так.

dll'ка - meta-модуль. Я не уточнял, какой модуль имею ввиду.

dll'ка, которая прописывается в plugins.ini метамода - мета-плагин.

Цитата(Safety1st @ 11.8.2014, 21:43) *
сам же на фптиме раструбил об уязвимости

Чего чего?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя usercn
сообщение 11.8.2014, 19:56
Сообщение #2544


Стаж: 12 лет

Сообщений: 341
Благодарностей: 140
Полезность: 495

Защита от # в нике и чате
Признаки: Человек пишет в чат #Cstrike_GIGN_Label #Cstrike_GIGN_Label и у всех виснет кс.

Пишу
say #Cstrike_GIGN_Label #Cstrike_GIGN_Label
проверил. КС не виснет, ни у меня ни у других, а вот игровой клиент тупо закрывается (ВинХП, версия клиента 4554)
Ни сообщения об ошибке, ничего, вроде как процесс прибили.


Просунутий сервер з максимумом зброї, можливо старійший в Україні
[UA] DNET CS Public Server #1
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя s1lent
сообщение 11.8.2014, 19:59
Сообщение #2545
Стаж: 16 лет

Сообщений: 440
Благодарности: выкл.

как вариант.
Обходит баг с использованием в никах локализации подобных #Cstrike_

если кто-то вообще не использует client_print, но есть colorchat.
то лучше воспользоваться стоком от Lev.

src
Код
#include "extdll.h"
#include "meta_api.h"

#undef C_DLLEXPORT
#ifdef __linux__
    #include <sys/mman.h>
    #define C_DLLEXPORT extern "C" __attribute__((visibility("default")))
#else
    #define C_DLLEXPORT extern "C" __declspec(dllexport)
#endif

enum {
    PF_messageBegin,
    PF_messageString,
    PF_messageEnd,
    PF_Last
};

typedef struct message_s {
    BOOL done;
    int sayTextId;
    int textMsgId;
} message_t;

typedef struct hooks_s {
    void *address;
    void *handler;
    unsigned char patchBytes[5];
    unsigned char originalBytes[5];

} hooks_t;

hooks_t hookMessage[PF_Last];
message_t eventMessage;

plugin_info_t Plugin_info = {

    META_INTERFACE_VERSION,
    "ChatFix",
    "1.0",
    "10/08/14",
    "s1lent",
    "http://www.aghl.ru/",
    "ChatFix",
    PT_STARTUP,
    PT_NEVER,
};

enginefuncs_t g_engfuncs;
enginefuncs_t g_engfuncs_post;

meta_globals_t *gpMetaGlobals;
gamedll_funcs_t *gpGamedllFuncs;
mutil_funcs_t *gpMetaUtilFuncs;

globalvars_t *gpGlobals;
META_FUNCTIONS gMetaFunctionTable;

C_DLLEXPORT int Meta_Query(char *,plugin_info_t **pPlugInfo,mutil_funcs_t *pMetaUtilFuncs) {
    *pPlugInfo = &Plugin_info;
    gpMetaUtilFuncs = pMetaUtilFuncs;
    return TRUE;
}
BOOL allowMemoryPatch(void *ptr) {
#ifdef __linux__
    void *addr = (void *)((long)ptr & ~(4096 - 1));
    return !mprotect(addr,sysconf(_SC_PAGESIZE),(PROT_READ|PROT_WRITE|PROT_EXEC));
#else
    static DWORD oldProtection;
    return VirtualProtect(ptr,5,PAGE_EXECUTE_READWRITE,&oldProtection);
#endif
}
BOOL doPatch(hooks_t *a) {
    if(allowMemoryPatch(a->address)) {
        memcpy(a->address,a->patchBytes,5);
    }
    return TRUE;
}
BOOL undoPatch(hooks_t *a) {
    if(allowMemoryPatch(a->address)) {
        memcpy(a->address,a->originalBytes,5);
    }
    return TRUE;
}
void MessageBegin(int msg_dest,int msg_type,const float *pOrigin,edict_t *ed) {
    if(ed && (eventMessage.sayTextId == msg_type || eventMessage.textMsgId == msg_type)) {
        eventMessage.done = TRUE;
    };
    hooks_t *a = &hookMessage[PF_messageBegin];

    if(undoPatch(a)) {
        reinterpret_cast<void (*)(int,int,const float *,edict_t *)>(a->address)(msg_dest,msg_type,pOrigin,ed);
        doPatch(a);
    };
};
void WriteString(const char *szString) {
    hooks_t *a = &hookMessage[PF_messageString];

    if(eventMessage.done && *szString != '#') {
        char *phaystack = const_cast<char *>(szString);
        *(phaystack + 187) = '\0';
        if(undoPatch(a)) {

            reinterpret_cast<void (*)(const char *)>(a->address)((const char *)"%s");
            reinterpret_cast<void (*)(const char *)>(a->address)((const char *)phaystack);

            doPatch(a);
        }
        return;
    }
    if(undoPatch(a)) {
        reinterpret_cast<void (*)(const char *)>(a->address)(szString);
        doPatch(a);
    }
};
void MessageEnd() {
    eventMessage.done = FALSE;
    hooks_t *a = &hookMessage[PF_messageEnd];
    if(undoPatch(a)) {
        reinterpret_cast<void (*)()>(a->address)();
        doPatch(a);
    }
}
int RegUserMsg_Post(const char *szName,int)
{
    if(!strcmp(szName,"SayText")) {
        eventMessage.sayTextId = META_RESULT_ORIG_RET(int);
    }
    else if(!strcmp(szName,"TextMsg")) {
        eventMessage.textMsgId = META_RESULT_ORIG_RET(int);
    }
    RETURN_META_VALUE(MRES_IGNORED,0);
}
C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine,int *interfaceVersion) {
    memset(&g_engfuncs_post,0,sizeof(enginefuncs_t));
    g_engfuncs_post.pfnRegUserMsg = RegUserMsg_Post;
    memcpy(pengfuncsFromEngine,&g_engfuncs_post,sizeof(enginefuncs_t));
    return TRUE;
}
C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now,META_FUNCTIONS *pFunctionTable,meta_globals_t *pMGlobals,gamedll_funcs_t *pGamedllFuncs) {
    if(!pMGlobals) {
        LOG_ERROR(PLID,"Meta_Attach called with null pMGlobals");
        return FALSE;
    }
    gpMetaGlobals = pMGlobals;
    if(!pFunctionTable) {
        LOG_ERROR(PLID,"Meta_Attach called with null pFunctionTable");
        return FALSE;
    }
    gpGamedllFuncs = pGamedllFuncs;

    void *r[] = {

        (void *)(*g_engfuncs.pfnMessageBegin), (void *)MessageBegin,
        (void *)(*g_engfuncs.pfnWriteString), (void *)WriteString,
        (void *)(*g_engfuncs.pfnMessageEnd), (void *)MessageEnd
    };

    hooks_t *a = NULL;
    for(int j = 0; j < PF_Last * 2; j += 2) {
        a = &hookMessage[j / 2];

        a->patchBytes[0] = 0xE9;
        a->address = r[j];
        a->handler = r[j + 1];

        *((unsigned long *)(&a->patchBytes[1])) = (unsigned long)a->handler - (unsigned long)a->address - 5;

        memcpy(a->originalBytes,(void *)a->address,5);

        if(MemoryPatched(a->address)) {
            memcpy(a->address,a->patchBytes,5);
        }
    }
    gMetaFunctionTable.pfnGetEngineFunctions_Post = GetEngineFunctions_Post;
    memcpy(pFunctionTable,&gMetaFunctionTable,sizeof(META_FUNCTIONS));
    return TRUE;
}
C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now,PL_UNLOAD_REASON reason) {
    return FALSE;
}
#ifdef __linux__
    C_DLLEXPORT void GiveFnptrsToDll(enginefuncs_t *pengfuncsFromEngine,globalvars_t *pGlobals)
    {
#else
    #ifdef _MSC_VER
    C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll(enginefuncs_t *pengfuncsFromEngine,globalvars_t *pGlobals)
    {
        __asm
        {
            push ebp
            mov ebp,esp
            sub esp,__LOCAL_SIZE
            push ebx
            push esi
            push edi
        }
    #else    // _MSC_VER
        #ifdef __GNUC__
            C_DLLEXPORT void __stdcall GiveFnptrsToDll(enginefuncs_t *pengfuncsFromEngine,globalvars_t *pGlobals)
            {
        #else
            #error There is no support (yet) for your compiler. Please use MSVC or GCC compilers.
        #endif
    #endif // _MSC_VER
#endif // __linux__
        memcpy(&g_engfuncs,pengfuncsFromEngine,sizeof(enginefuncs_t));
        gpGlobals = pGlobals;
        #ifdef _MSC_VER
        if(sizeof(int *) == 8)
        {
            __asm
            {
                pop edi
                pop esi
                pop ebx
                mov esp,ebp
                pop ebp
                ret 16
            }
        }
        else
        {
            __asm
            {
                pop edi
                pop esi
                pop ebx
                mov esp,ebp
                pop ebp
                ret 8
            }
        }
    #endif // #ifdef _MSC_VER
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя usercn
сообщение 11.8.2014, 20:04
Сообщение #2546


Стаж: 12 лет

Сообщений: 341
Благодарностей: 140
Полезность: 495

Цитата(s1lent @ 11.8.2014, 20:59) *
как вариант.
если кто-то вообще не использует client_print, но есть colorchat.
то лучше воспользоваться стоком от Lev.

src
Код
#include "extdll.h"
#include "meta_api.h"

#undef C_DLLEXPORT
#ifdef __linux__
    #include <sys/mman.h>
    #define C_DLLEXPORT extern "C" __attribute__((visibility("default")))
#else
    #define C_DLLEXPORT extern "C" __declspec(dllexport)
#endif

enum {
    PF_messageBegin,
    PF_messageString,
    PF_messageEnd,
    PF_Last
};

typedef struct message_s {
    BOOL done;
    int sayTextId;
    int textMsgId;
} message_t;

typedef struct hooks_s {
    void *address;
    void *handler;
    unsigned char patchBytes[5];
    unsigned char originalBytes[5];

} hooks_t;

hooks_t hookMessage[PF_Last];
message_t eventMessage;

plugin_info_t Plugin_info = {

    META_INTERFACE_VERSION,
    "ChatFix",
    "1.0",
    "10/08/14",
    "s1lent",
    "http://www.aghl.ru/",
    "ChatFix",
    PT_STARTUP,
    PT_NEVER,
};

enginefuncs_t g_engfuncs;
enginefuncs_t g_engfuncs_post;

meta_globals_t *gpMetaGlobals;
gamedll_funcs_t *gpGamedllFuncs;
mutil_funcs_t *gpMetaUtilFuncs;

globalvars_t *gpGlobals;
META_FUNCTIONS gMetaFunctionTable;

C_DLLEXPORT int Meta_Query(char *,plugin_info_t **pPlugInfo,mutil_funcs_t *pMetaUtilFuncs) {
    *pPlugInfo = &Plugin_info;
    gpMetaUtilFuncs = pMetaUtilFuncs;
    return TRUE;
}
BOOL allowMemoryPatch(void *ptr) {
#ifdef __linux__
    void *addr = (void *)((long)ptr & ~(4096 - 1));
    return !mprotect(addr,sysconf(_SC_PAGESIZE),(PROT_READ|PROT_WRITE|PROT_EXEC));
#else
    static DWORD oldProtection;
    return VirtualProtect(ptr,5,PAGE_EXECUTE_READWRITE,&oldProtection);
#endif
}
BOOL doPatch(hooks_t *a) {
    if(allowMemoryPatch(a->address)) {
        memcpy(a->address,a->patchBytes,5);
    }
    return TRUE;
}
BOOL undoPatch(hooks_t *a) {
    if(allowMemoryPatch(a->address)) {
        memcpy(a->address,a->originalBytes,5);
    }
    return TRUE;
}
void MessageBegin(int msg_dest,int msg_type,const float *pOrigin,edict_t *ed) {
    if(ed && (eventMessage.sayTextId == msg_type || eventMessage.textMsgId == msg_type)) {
        eventMessage.done = TRUE;
    };
    hooks_t *a = &hookMessage[PF_messageBegin];

    if(undoPatch(a)) {
        reinterpret_cast<void (*)(int,int,const float *,edict_t *)>(a->address)(msg_dest,msg_type,pOrigin,ed);
        doPatch(a);
    };
};
void WriteString(const char *szString) {
    hooks_t *a = &hookMessage[PF_messageString];

    if(eventMessage.done && *szString != '#') {
        char *phaystack = const_cast<char *>(szString);
        *(phaystack + 187) = '\0';
        if(undoPatch(a)) {

            reinterpret_cast<void (*)(const char *)>(a->address)((const char *)"%s");
            reinterpret_cast<void (*)(const char *)>(a->address)((const char *)phaystack);

            doPatch(a);
        }
        return;
    }
    if(undoPatch(a)) {
        reinterpret_cast<void (*)(const char *)>(a->address)(szString);
        doPatch(a);
    }
};
void MessageEnd() {
    eventMessage.done = FALSE;
    hooks_t *a = &hookMessage[PF_messageEnd];
    if(undoPatch(a)) {
        reinterpret_cast<void (*)()>(a->address)();
        doPatch(a);
    }
}
int RegUserMsg_Post(const char *szName,int)
{
    if(!strcmp(szName,"SayText")) {
        eventMessage.sayTextId = META_RESULT_ORIG_RET(int);
    }
    else if(!strcmp(szName,"TextMsg")) {
        eventMessage.textMsgId = META_RESULT_ORIG_RET(int);
    }
    RETURN_META_VALUE(MRES_IGNORED,0);
}
C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine,int *interfaceVersion) {
    memset(&g_engfuncs_post,0,sizeof(enginefuncs_t));
    g_engfuncs_post.pfnRegUserMsg = RegUserMsg_Post;
    memcpy(pengfuncsFromEngine,&g_engfuncs_post,sizeof(enginefuncs_t));
    return TRUE;
}
C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now,META_FUNCTIONS *pFunctionTable,meta_globals_t *pMGlobals,gamedll_funcs_t *pGamedllFuncs) {
    if(!pMGlobals) {
        LOG_ERROR(PLID,"Meta_Attach called with null pMGlobals");
        return FALSE;
    }
    gpMetaGlobals = pMGlobals;
    if(!pFunctionTable) {
        LOG_ERROR(PLID,"Meta_Attach called with null pFunctionTable");
        return FALSE;
    }
    gpGamedllFuncs = pGamedllFuncs;

    void *r[] = {

        (void *)(*g_engfuncs.pfnMessageBegin), (void *)MessageBegin,
        (void *)(*g_engfuncs.pfnWriteString), (void *)WriteString,
        (void *)(*g_engfuncs.pfnMessageEnd), (void *)MessageEnd
    };

    hooks_t *a = NULL;
    for(int j = 0; j < PF_Last * 2; j += 2) {
        a = &hookMessage[j / 2];

        a->patchBytes[0] = 0xE9;
        a->address = r[j];
        a->handler = r[j + 1];

        *((unsigned long *)(&a->patchBytes[1])) = (unsigned long)a->handler - (unsigned long)a->address - 5;

        memcpy(a->originalBytes,(void *)a->address,5);

        if(MemoryPatched(a->address)) {
            memcpy(a->address,a->patchBytes,5);
        }
    }
    gMetaFunctionTable.pfnGetEngineFunctions_Post = GetEngineFunctions_Post;
    memcpy(pFunctionTable,&gMetaFunctionTable,sizeof(META_FUNCTIONS));
    return TRUE;
}
C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now,PL_UNLOAD_REASON reason) {
    return FALSE;
}
#ifdef __linux__
    C_DLLEXPORT void GiveFnptrsToDll(enginefuncs_t *pengfuncsFromEngine,globalvars_t *pGlobals)
    {
#else
    #ifdef _MSC_VER
    C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll(enginefuncs_t *pengfuncsFromEngine,globalvars_t *pGlobals)
    {
        __asm
        {
            push ebp
            mov ebp,esp
            sub esp,__LOCAL_SIZE
            push ebx
            push esi
            push edi
        }
    #else    // _MSC_VER
        #ifdef __GNUC__
            C_DLLEXPORT void __stdcall GiveFnptrsToDll(enginefuncs_t *pengfuncsFromEngine,globalvars_t *pGlobals)
            {
        #else
            #error There is no support (yet) for your compiler. Please use MSVC or GCC compilers.
        #endif
    #endif // _MSC_VER
#endif // __linux__
        memcpy(&g_engfuncs,pengfuncsFromEngine,sizeof(enginefuncs_t));
        gpGlobals = pGlobals;
        #ifdef _MSC_VER
        if(sizeof(int *) == 8)
        {
            __asm
            {
                pop edi
                pop esi
                pop ebx
                mov esp,ebp
                pop ebp
                ret 16
            }
        }
        else
        {
            __asm
            {
                pop edi
                pop esi
                pop ebx
                mov esp,ebp
                pop ebp
                ret 8
            }
        }
    #endif // #ifdef _MSC_VER
}



Можете подробнее рассписать от каких проблем он лечит.
Спасибо.


Просунутий сервер з максимумом зброї, можливо старійший в Україні
[UA] DNET CS Public Server #1
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя s1lent
сообщение 11.8.2014, 20:08
Сообщение #2547
Стаж: 16 лет

Сообщений: 440
Благодарности: выкл.

не лечит, а точнее обходит того бага сообщения с локализацией подобных #Cstrike_
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 11.8.2014, 20:09
Сообщение #2548
Стаж: 14 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

s1lent, а если какой-то плагин уже юзает разбивку по аргументам с помощью %s ?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя s1lent
сообщение 11.8.2014, 20:09
Сообщение #2549
Стаж: 16 лет

Сообщений: 440
Благодарности: выкл.

Цитата([WPMG]PRoSToTeM@ @ 12.8.2014, 1:09) *

s1lent, а если какой-то плагин уже юзает разбивку по аргументам с помощью %s ?


тогда ничем не смогу помочь, это как раз таки единственный минус.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
binky
сообщение 11.8.2014, 20:17
Сообщение #2550
Стаж: 12 лет

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

Можете написать весь набор бажных сообщений
пишу say_team @%s0 сервер не упал, но игра у меня зависла пришлось перегружать комп
пишу #Cstrike_GIGN_Label #Cstrike_GIGN_Label сервер не падает, но игра опять зависает
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 11.8.2014, 20:21
Сообщение #2551
Стаж: 14 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

s1lent, ещё такой вопрос MessageBegin/WriteString/MessageEnd из gamedll тоже будет хукать?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя s1lent
сообщение 11.8.2014, 20:22
Сообщение #2552
Стаж: 16 лет

Сообщений: 440
Благодарности: выкл.

Цитата([WPMG]PRoSToTeM@ @ 12.8.2014, 1:21) *

s1lent, ещё такой вопрос MessageBegin/WriteString/MessageEnd из gamedll тоже будет хукать?


да
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 11.8.2014, 20:27
Сообщение #2553
Стаж: 14 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

s1lent, а как он отреагирует если во втором WriteString будет строка не начинающаяся на # ?
Типа такого:
Код
ClientPrint(pOther->pev, HUD_PRINTCENTER, "#Game_bomb_pickup", &gpGlobals->pStringBase[pPlayer->pev->netname]);


Отредактировал: [WPMG]PRoSToTeM@, - 11.8.2014, 20:28
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 11.8.2014, 20:42
Сообщение #2554
Стаж: 14 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

Код
ClientPrint(pOther->pev, HUD_PRINTCENTER, "#Game_bomb_drop", STRING(pev->netname));

Прикрепленные файлы:
Прикрепленное изображение
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя s1lent
сообщение 11.8.2014, 20:47
Сообщение #2555
Стаж: 16 лет

Сообщений: 440
Благодарности: выкл.

не учел это.
да и print_center можно отсеять
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 11.8.2014, 20:53
Сообщение #2556
Стаж: 14 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

s1lent, с этим такой же баг
Код
ClientPrint(temp->pev, HUD_PRINTTALK, "#Game_teamAttack_attack", STRING(pev->netname));

Код
ClientPrint(pTarget->pev, HUD_PRINTRADIO, NumAsString(ENTINDEX(edict())), "#Game_radio", STRING(pev->netname), msg_verbose);


Код
ClientPrint(pPlayer->pev, HUD_PRINTCONSOLE, "#Votes", UTIL_dtos1(index), item->mapname, UTIL_dtos2(m_iMapVotes[index]));


Отредактировал: [WPMG]PRoSToTeM@, - 11.8.2014, 20:52
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя s1lent
сообщение 11.8.2014, 22:37
Сообщение #2557
Стаж: 16 лет

Сообщений: 440
Благодарности: выкл.

можно так попробовать.

src
Код
#include "extdll.h"
#include "meta_api.h"

#undef C_DLLEXPORT

#ifdef __linux__
    #include <sys/mman.h>
    #define C_DLLEXPORT extern "C" __attribute__((visibility("default")))
#else
    #define C_DLLEXPORT extern "C" __declspec(dllexport)
#endif

enum {
    PF_messageBegin,
    PF_messageByte,
    PF_messageString,
    PF_messageEnd,
    PF_Last
};

typedef struct message_s {
    BOOL done;
    BOOL byteSend;
    char *str[4];
    int argNum;
    int sayTextId;
    int textMsgId;
} message_t;

typedef struct hooks_s {
    void *address;
    void *handler;
    unsigned char patchBytes[5];
    unsigned char originalBytes[5];

} hooks_t;

hooks_t hookMessage[PF_Last];
message_t eventMessage;

plugin_info_t Plugin_info = {

    META_INTERFACE_VERSION,
    "ChatFix",
    "1.3",
    "10/08/14",
    "s1lent",
    "http://www.aghl.ru/",
    "ChatFix",
    PT_STARTUP,
    PT_NEVER,
};

enginefuncs_t g_engfuncs;
enginefuncs_t g_engfuncs_post;

meta_globals_t *gpMetaGlobals;
gamedll_funcs_t *gpGamedllFuncs;
mutil_funcs_t *gpMetaUtilFuncs;

globalvars_t *gpGlobals;
META_FUNCTIONS gMetaFunctionTable;

C_DLLEXPORT int Meta_Query(char *,plugin_info_t **pPlugInfo,mutil_funcs_t *pMetaUtilFuncs) {
    *pPlugInfo = &Plugin_info;
    gpMetaUtilFuncs = pMetaUtilFuncs;
    return TRUE;
}
BOOL allowMemoryPatch(void *ptr) {
#ifdef __linux__
    void *addr = (void *)((long)ptr & ~(4096 - 1));
    return !mprotect(addr,sysconf(_SC_PAGESIZE),(PROT_READ|PROT_WRITE|PROT_EXEC));
#else
    static DWORD oldProtection;
    return VirtualProtect(ptr,5,PAGE_EXECUTE_READWRITE,&oldProtection);
#endif
}
BOOL doPatch(hooks_t *a) {
    if(allowMemoryPatch(a->address)) {
        memcpy(a->address,a->patchBytes,5);
    }
    return TRUE;
}
BOOL undoPatch(hooks_t *a) {
    if(allowMemoryPatch(a->address)) {
        memcpy(a->address,a->originalBytes,5);
    }
    return TRUE;
}
inline void T_MESSAGE_BEGIN(int msg_dest,int msg_type,const float *pOrigin = NULL,edict_t *ed = NULL) {
    hooks_t *a = &hookMessage[PF_messageBegin];
    if(undoPatch(a)) {
        reinterpret_cast<void (*)(int,int,const float *,edict_t *)>(a->address)(msg_dest,msg_type,pOrigin,ed);
        doPatch(a);
    }
}
inline void T_WRITE_BYTE(int iValue) {
    hooks_t *a = &hookMessage[PF_messageByte];
    if(undoPatch(a)) {
        reinterpret_cast<void (*)(int)>(a->address)(iValue);
        doPatch(a);
    }
}
inline void T_WRITE_STRING(const char *szString) {
    hooks_t *a = &hookMessage[PF_messageString];
    if(undoPatch(a)) {
        reinterpret_cast<void (*)(const char *)>(a->address)(szString);
        doPatch(a);
    }
}
inline void T_MESSAGE_END() {
    hooks_t *a = &hookMessage[PF_messageEnd];
    if(undoPatch(a)) {
        reinterpret_cast<void (*)()>(a->address)();
        doPatch(a);
    }
}
void MessageBegin(int msg_dest,int msg_type,const float *pOrigin,edict_t *ed) {

    message_t *p = &eventMessage;
    if(ed && (p->sayTextId == msg_type || p->textMsgId == msg_type)) {

        for(int i = 0; i < p->argNum; i++) {
            p->str[i] = 0;
        }
        p->argNum = 0;
        p->done = TRUE;
        p->byteSend = FALSE;
    }
    T_MESSAGE_BEGIN(msg_dest,msg_type,pOrigin,ed);
};
void WriteByte(int iValue) {

    message_t *p = &eventMessage;
    if(p->done && !p->byteSend) {

        if(iValue == HUD_PRINTTALK) {
            p->byteSend = TRUE;
        }
        else {
            p->done = FALSE;
        }
    }
    T_WRITE_BYTE(iValue);
};
void WriteString(const char *szString) {

    message_t *p = &eventMessage;
    if(p->done) {
        p->str[p->argNum++] = const_cast<char *>(szString);
        return;
    }
    T_WRITE_STRING(szString);
};
void MessageEnd() {
    message_t *p = &eventMessage;    
    if(p->done && p->argNum) {
        switch(p->argNum) {
            case 1: {
                T_WRITE_STRING("%s%s");
                T_WRITE_STRING("");
                T_WRITE_STRING((const char *)p->str[0]);
                break;
            }
            case 2: {
                T_WRITE_STRING((const char *)p->str[0]);
                T_WRITE_STRING((const char *)p->str[1]);
                break;
            }
            case 3: {
                T_WRITE_STRING((const char *)p->str[0]);
                T_WRITE_STRING((const char *)p->str[1]);
                T_WRITE_STRING((const char *)p->str[2]);
                break;
            }
            case 4: {
                T_WRITE_STRING((const char *)p->str[0]);
                T_WRITE_STRING((const char *)p->str[1]);
                T_WRITE_STRING((const char *)p->str[2]);
                T_WRITE_STRING((const char *)p->str[3]);
                break;
            }
            default: {
                break;
            }
        }
        p->done = FALSE;
        p->byteSend = FALSE;
    }
    T_MESSAGE_END();
}
int RegUserMsg_Post(const char *szName,int)
{
    if(!strcmp(szName,"SayText")) {
        eventMessage.sayTextId = META_RESULT_ORIG_RET(int);
    }
    else if(!strcmp(szName,"TextMsg")) {
        eventMessage.textMsgId = META_RESULT_ORIG_RET(int);
    }
    RETURN_META_VALUE(MRES_IGNORED,0);
}
C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine,int *interfaceVersion) {
    memset(&g_engfuncs_post,0,sizeof(enginefuncs_t));
    g_engfuncs_post.pfnRegUserMsg = RegUserMsg_Post;
    memcpy(pengfuncsFromEngine,&g_engfuncs_post,sizeof(enginefuncs_t));
    return TRUE;
}
C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now,META_FUNCTIONS *pFunctionTable,meta_globals_t *pMGlobals,gamedll_funcs_t *pGamedllFuncs) {
    if(!pMGlobals) {
        return FALSE;
    }
    gpMetaGlobals = pMGlobals;
    if(!pFunctionTable) {
        return FALSE;
    }
    gpGamedllFuncs = pGamedllFuncs;

    void *r[] = {

        (void *)(*g_engfuncs.pfnMessageBegin), (void *)MessageBegin,
        (void *)(*g_engfuncs.pfnWriteByte), (void *)WriteByte,
        (void *)(*g_engfuncs.pfnWriteString), (void *)WriteString,
        (void *)(*g_engfuncs.pfnMessageEnd), (void *)MessageEnd
    };

    hooks_t *a = NULL;
    for(int j = 0; j < PF_Last * 2; j += 2) {
        a = &hookMessage[j / 2];

        a->patchBytes[0] = 0xE9;
        a->address = r[j];
        a->handler = r[j + 1];

        *((unsigned long *)(&a->patchBytes[1])) = (unsigned long)a->handler - (unsigned long)a->address - 5;

        memcpy(a->originalBytes,(void *)a->address,5);

        if(allowMemoryPatch(a->address)) {
            memcpy(a->address,a->patchBytes,5);
        }
    }
    gMetaFunctionTable.pfnGetEngineFunctions_Post = GetEngineFunctions_Post;
    memcpy(pFunctionTable,&gMetaFunctionTable,sizeof(META_FUNCTIONS));
    return TRUE;
}
C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now,PL_UNLOAD_REASON reason) {
    return FALSE;
}
#ifdef __linux__
    C_DLLEXPORT void GiveFnptrsToDll(enginefuncs_t *pengfuncsFromEngine,globalvars_t *pGlobals) {
#else
    #ifdef _MSC_VER
    C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll(enginefuncs_t *pengfuncsFromEngine,globalvars_t *pGlobals) {
        __asm {
            push ebp
            mov ebp,esp
            sub esp,__LOCAL_SIZE
            push ebx
            push esi
            push edi
        }
    #else    // _MSC_VER
        #ifdef __GNUC__
            C_DLLEXPORT void __stdcall GiveFnptrsToDll(enginefuncs_t *pengfuncsFromEngine,globalvars_t *pGlobals) {
        #else
            #error There is no support (yet) for your compiler. Please use MSVC or GCC compilers.
        #endif
    #endif // _MSC_VER
#endif // __linux__
        memcpy(&g_engfuncs,pengfuncsFromEngine,sizeof(enginefuncs_t));
        gpGlobals = pGlobals;
        #ifdef _MSC_VER
        if(sizeof(int *) == 8) {
            __asm {
                pop edi
                pop esi
                pop ebx
                mov esp,ebp
                pop ebp
                ret 16
            }
        }
        else {
            __asm {
                pop edi
                pop esi
                pop ebx
                mov esp,ebp
                pop ebp
                ret 8
            }
        }
    #endif // #ifdef _MSC_VER
}


Скачать.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
kritik
сообщение 11.8.2014, 23:01
Сообщение #2558
Стаж: 12 лет

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

s1lent, тебя куда-то не туда понесло. Надо входящие данные от клиента проверять, а не исходящие от сервера.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя s1lent
сообщение 11.8.2014, 23:14
Сообщение #2559
Стаж: 16 лет

Сообщений: 440
Благодарности: выкл.

какие входящие данные)?

цель того мета плагина такова, хукнуть все вызовы подобных client_print отсылающие месседжи (SayText,TextMsg) amxmodx, gamedll и т.п
потом отсеивать от gamedll, ну как вариант только получать сколько write_string отсылает, в amxmodx-e всегд 1 write_string.

ну или ждать когда исправят в amxmodx-e.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
kritik
сообщение 11.8.2014, 23:21
Сообщение #2560
Стаж: 12 лет

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

Ник и чат. Ник можно и по локализации проверить, а в чате # разве что в контексте #1, #2 и т.п. нужна. Чего лишний раз все сообщения трогать ради такой мелочи.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
413 страниц V  « 127 128 129 ... 411 412 »
 
Ответить в данную темуНачать новую тему
 
0 пользователей и 3 гостей читают эту тему: