[Fix] Flood/Kickhack Mantığı ile Oyuncunun Bağlantısını Kesme

Kaiser

⋞ 〈 ☪ 〉 ⋟
Yönetici
Premium Üye
Geliştirici
Yardımsever Üye
Editör
Mesaj
3.687
Çözümler
344
Beğeni
3.574
Puan
1.849
Ticaret Puanı
0
Ülkemizde ne kadar bilinip kullanıldığı belli olmamakla birlikte, bazı yabancı ülkelerde pek bilinen ve hala kullanılan bir açık.
Açığa gelecek olursak; herhangi bir karakterden /messenger_auth t Emre yazdığımızda Emre isimli karaktere flood gönderiyor.
Bazı kötü niyetli kişiler bot vb. araçlarla bu floodu çok daha fazla sayıda gönderebilirler.

Bkz:
hak1kwa.gif


Çözüm için aşağıdaki adımları uygulayınız:

game/src/messenger_manager.cpp açın ve arayın:
C++:
void MessengerManager::AuthToAdd(MessengerManager::keyA account, MessengerManager::keyA companion, bool bDeny)

Fonksiyonu komple değiştirin:
C++:
bool MessengerManager::AuthToAdd(MessengerManager::keyA account, MessengerManager::keyA companion, bool bDeny)
{
    DWORD dw1 = GetCRC32(companion.c_str(), companion.length());
    DWORD dw2 = GetCRC32(account.c_str(), account.length());

    char buf[64];
    snprintf(buf, sizeof(buf), "%u:%u", dw1, dw2);
    DWORD dwComplex = GetCRC32(buf, strlen(buf));

    if (m_set_requestToAdd.find(dwComplex) == m_set_requestToAdd.end())
    {
        sys_log(0, "MessengerManager::AuthToAdd : request not exist %s -> %s", companion.c_str(), account.c_str());
        return false;
    }

    m_set_requestToAdd.erase(dwComplex);

    if (!bDeny)
    {
        AddToList(companion, account);
        AddToList(account, companion);
    }
    return true;
}

messenger_manager.h açın ve arayın:
C++:
void    AuthToAdd(keyA account, keyA companion, bool bDeny);

Değiştirin:
C++:
bool    AuthToAdd(keyA account, keyA companion, bool bDeny);

cmd_general.cpp açın ve arayın:
C++:
ACMD(do_messenger_auth)

Komple değiştirin:
C++:
ACMD(do_messenger_auth)
{
    if (ch->GetArena())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·ÃÀå¿¡¼ »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    char arg1[256], arg2[256];
    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    if (!*arg1 || !*arg2)
        return;

    char answer = LOWER(*arg1);
    bool bIsDenied = answer != 'y';
    bool bIsAdded = MessengerManager::instance().AuthToAdd(ch->GetName(), arg2, bIsDenied); // DENY
    if (bIsAdded && bIsDenied)
    {
        LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg2);

        if (tch)
            tch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´ÔÀ¸·Î ºÎÅÍ Ä£±¸ µî·ÏÀ» °ÅºÎ ´çÇß½À´Ï´Ù."), ch->GetName());
    }

}
 
Eline sağlık. Martysama altyapı kullanan kişilerde bu @fixme130 olarak mevcut.
 
Konu için teşekkür ederim. Ben de bu fix yokmuş uyguladım.
 
Son düzenleme:
Geri
Üst