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

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

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

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

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

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

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

, Методы защиты от различных уязвимостей игровых серверов
Статус пользователя Nixon
сообщение 13.8.2014, 19:05
Сообщение #2701


Стаж: 13 лет

Сообщений: 399
Благодарностей: 192
Полезность: 589

Плагин от простотёмы, помогает. А что на счет %s0 в админ чате? Модуль от s1lent'a вроде как работал, но сейчас нет.
Чудеса да и только
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя faRzAN
сообщение 13.8.2014, 19:53
Сообщение #2702
Стаж: 13 лет

Сообщений: 136
Благодарностей: 53
Полезность: 198

Цитата(Nixon @ 13.8.2014, 20:05) *
Плагин от простотёмы, помогает. А что на счет %s0 в админ чате? Модуль от s1lent'a вроде как работал, но сейчас нет.
Чудеса да и только

дай ссылку от простотемы
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Nixon
сообщение 13.8.2014, 19:54
Сообщение #2703


Стаж: 13 лет

Сообщений: 399
Благодарностей: 192
Полезность: 589

Цитата(faRzAN @ 13.8.2014, 21:53) *
дай ссылку от простотемы

https://c-s.net.ua/forum/index.php?showtopi...mp;#entry639977
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 13.8.2014, 20:00
Сообщение #2704
Стаж: 14 лет

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

Тестируйте.
Скрытый текст
Код
#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;
    int msgType;
} 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;
        p->msgType = msg_type;
    }
    T_MESSAGE_BEGIN(msg_dest,msg_type,pOrigin,ed);
};
void WriteByte(int iValue) {

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

        if(p->msgType == p->sayTextId || iValue == HUD_PRINTTALK || iValue == HUD_PRINTCENTER || iValue == 5) {
            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: {
            if (*(p->str[0]) == '#') {
                T_WRITE_STRING(p->str[0]);
            } else {
                T_WRITE_STRING("%s");
                T_WRITE_STRING(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
}


Сразу говорю не тестил.

Отредактировал: [WPMG]PRoSToTeM@, - 13.8.2014, 19:58
Прикрепленные файлы:
Прикрепленный файл  ChatFix.zip ( 30,87 килобайт ) Кол-во скачиваний: 35
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 4 раз
   + Цитировать сообщение
Статус пользователя X*CaHeK*X
сообщение 13.8.2014, 20:55
Сообщение #2705
Стаж: 17 лет

Сообщений: 705
Благодарностей: 225
Полезность: 561

Цитата([WPMG]PRoSToTeM@ @ 14.8.2014, 0:00) *

Тестируйте.
Скрытый текст
Код
#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;
    int msgType;
} 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;
        p->msgType = msg_type;
    }
    T_MESSAGE_BEGIN(msg_dest,msg_type,pOrigin,ed);
};
void WriteByte(int iValue) {

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

        if(p->msgType == p->sayTextId || iValue == HUD_PRINTTALK || iValue == HUD_PRINTCENTER || iValue == 5) {
            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: {
            if (*(p->str[0]) == '#') {
                T_WRITE_STRING(p->str[0]);
            } else {
                T_WRITE_STRING("%s");
                T_WRITE_STRING(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
}


Сразу говорю не тестил.


У меня не сработал. Win7 x64
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 13.8.2014, 21:06
Сообщение #2706
Стаж: 14 лет

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

Цитата(X*CaHeK*X @ 13.8.2014, 22:55) *
У меня не сработал. Win7 x64

Конкретней.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Realution
сообщение 13.8.2014, 23:04
Сообщение #2707


Стаж: 12 лет

Сообщений: 102
Благодарностей: 64
Полезность: 355

Цитата([WPMG]PRoSToTeM@ @ 14.8.2014, 1:00) *

Тестируйте.
Скрытый текст
Код
#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;
    int msgType;
} 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;
        p->msgType = msg_type;
    }
    T_MESSAGE_BEGIN(msg_dest,msg_type,pOrigin,ed);
};
void WriteByte(int iValue) {

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

        if(p->msgType == p->sayTextId || iValue == HUD_PRINTTALK || iValue == HUD_PRINTCENTER || iValue == 5) {
            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: {
            if (*(p->str[0]) == '#') {
                T_WRITE_STRING(p->str[0]);
            } else {
                T_WRITE_STRING("%s");
                T_WRITE_STRING(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
}


Сразу говорю не тестил.

спасибо, работает идеально, билд 5787 и 5758 =))

Отредактировал: Realution, - 13.8.2014, 23:08
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя IM_RAM
сообщение 14.8.2014, 5:43
Сообщение #2708


Стаж: 14 лет

Сообщений: 83
Благодарностей: 16
Полезность: 153

Модуль s1lent'а прекрасно справляется!(v1.2)

Вылетов не удалось добиться не какими сообщениями.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя usercn
сообщение 14.8.2014, 7:55
Сообщение #2709


Стаж: 12 лет

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

Цитата([WPMG]PRoSToTeM@ @ 13.8.2014, 17:17) *

usercn, у CT вроде вообще лога нет.


CT = Colored Translit 3.0 Final
лог у него пишется в отдельные html файлы.

Кстати, как заставить СТ не забирать сообщения из обычных логов сервера.
Ато выходит при работающем СТ в логи сервера введённые игроками сообщения не пишутся.


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


Стаж: 17 лет

Сообщений: 919
Благодарностей: 1392
Полезность: 1160

Цитата([WPMG]PRoSToTeM@ @ 13.8.2014, 21:00) *

Тестируйте.
Скрытый текст
Код
#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;
    int msgType;
} 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;
        p->msgType = msg_type;
    }
    T_MESSAGE_BEGIN(msg_dest,msg_type,pOrigin,ed);
};
void WriteByte(int iValue) {

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

        if(p->msgType == p->sayTextId || iValue == HUD_PRINTTALK || iValue == HUD_PRINTCENTER || iValue == 5) {
            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: {
            if (*(p->str[0]) == '#') {
                T_WRITE_STRING(p->str[0]);
            } else {
                T_WRITE_STRING("%s");
                T_WRITE_STRING(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
}


Сразу говорю не тестил.


С твоим крашит сразу при ответе в чат. Зашел под известным ником, написал в чат, все отвалились.

Отредактировал: Anton1o, - 14.8.2014, 10:19
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя shaid
сообщение 14.8.2014, 10:52
Сообщение #2711


Стаж: 14 лет

Сообщений: 1012
Благодарностей: 432
Полезность: 835

Цитата(usercn @ 14.8.2014, 7:55) *
Кстати, как заставить СТ не забирать сообщения из обычных логов сервера.
Ато выходит при работающем СТ в логи сервера введённые игроками сообщения не пишутся.

не уверен в этом, но попробуй поставить amxx_logging 3 в core.ini
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 14.8.2014, 11:04
Сообщение #2712
Стаж: 14 лет

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

Цитата(Anton1o @ 14.8.2014, 12:16) *
[/spoiler]
С твоим крашит сразу при ответе в чат. Зашел под известным ником, написал в чат, все отвалились.

Крашит сервер или клиент?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
magiczoltrix
сообщение 14.8.2014, 11:07
Сообщение #2713
Стаж: 12 лет

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

Цитата(shaid @ 14.8.2014, 13:52) *
не уверен в этом, но попробуй поставить amxx_logging 3 в core.ini

Colored Translit настройки с этого файла не берёт
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
etkins
сообщение 14.8.2014, 11:08
Сообщение #2714
Стаж: 17 лет

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

а вот этот баг с символом # в нике и чате, он присутствует только если установлен Colored Translit ?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Anton1o
сообщение 14.8.2014, 11:10
Сообщение #2715


Стаж: 17 лет

Сообщений: 919
Благодарностей: 1392
Полезность: 1160

Цитата([WPMG]PRoSToTeM@ @ 14.8.2014, 12:04) *

Крашит сервер или клиент?

клиент
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
csgamer
сообщение 14.8.2014, 11:18
Сообщение #2716
Стаж: 12 лет

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

А нафига в разделе "Защита КС сервера" пишут про баги которые крашат клиент
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 14.8.2014, 11:33
Сообщение #2717
Стаж: 14 лет

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

Цитата(Anton1o @ 14.8.2014, 13:10) *
клиент

ChatFix точно работает? При написании в какой чат такое происходит? Какой плагин взаимодействует с этим чатом?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 14.8.2014, 11:45
Сообщение #2718
Стаж: 14 лет
Город: Moscow

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

Цитата(etkins @ 14.8.2014, 13:08) *
а вот этот баг с символом # в нике и чате, он присутствует только если установлен Colored Translit ?

Нет, баг по сути на каждом сервере имеется.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
etkins
сообщение 14.8.2014, 11:59
Сообщение #2719
Стаж: 17 лет

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

печаль
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя PREDATOREX
сообщение 14.8.2014, 13:50
Сообщение #2720


Стаж: 17 лет

Сообщений: 828
Благодарностей: 611
Полезность: 674

serveroc.com.ua
Цитата(Safety1st @ 14.8.2014, 11:45) *
Нет, баг по сути на каждом сервере имеется.


Я тестил без colored_translit и баг # не действует.

Отредактировал: PREDATOREX, - 14.8.2014, 13:51
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
413 страниц V  « 135 136 137 ... 411 412 »
 
Ответить в данную темуНачать новую тему
 
0 пользователей и 2 гостей читают эту тему: