mavzermete 1
mavzermete
Hikaye Ekle

[Serverside] Anti Wall Hack

Ayyıldız2 | 2008 TR Yapısı • 1-99 Orta Emek Destan • Oto Avsız • 10 Temmuz 21:00 HEMEN TIKLA!

Alıntıdır


Sunucu Taraflı Anti-Wallhack



Selam,

Tamamen sunucu taraflı bir Anti-Wallhack implementasyonu üzerinde çalıştım. Sonuçtan oldukça memnunum.

Şu ana kadar tespit edebildiğim tek sorun şu: hack kullanmayan oyuncular da, hareket bir block-zone içinde veya ona çok yakın gerçekleştiğinde ara sıra bir set-back yiyebiliyor. Bence bu çok da büyük bir sorun değil. Eğer öyleyse, benden daha zeki birinin bu konuyla tekrar ilgilenmesi gerekecek.

Test etmediğim şey ise mob sıkıştırma — bu konuda topluluktan gelecek geri bildirimleri merakla bekliyorum.

Videolara hoşgörüyle yaklaşın, yıllardır bunun düzgün nasıl yapılacağını hâlâ çözebilmiş değilim...

Öncesi:




Sonrası:






📁 common/service.h

C++:
#define DISABLE_WALL_HACK                        //Disable wall hacks



📁 char.h

C++:
//Şunu arayın:
        void            SyncPacket();

//Üstüne yeni fonksiyonları tanımlayın:
#ifdef DISABLE_WALL_HACK
        bool            IsValidMovingLocation(long x, long y);
        bool            IsValidMovingPath(long fromX, long fromY, long toX, long toY);
#endif



📁 char.cpp

C++:
//Yeni fonksiyonların implementasyonu:
#ifdef DISABLE_WALL_HACK
bool CHARACTER::IsValidMovingLocation(long x, long y)
{
    if(!SECTREE_MANAGER::instance().IsMovablePosition(GetMapIndex(), x, y))
        return false;

    PIXEL_POSITION pos;
    pos.x = x;
    pos.y = y;
    pos.z = GetZ();
    if (!SECTREE_MANAGER::instance().GetMovablePosition(GetMapIndex(), pos.x, pos.y, pos))
        return false;

    return true;
}

bool CHARACTER::IsValidMovingPath(long fromX, long fromY, long toX, long toY)
{
    if (!IsValidMovingLocation(toX, toY))
        return false;

    const long dx = toX - fromX;
    const long dy = toY - fromY;
    const long adx = std::abs(dx);
    const long ady = std::abs(dy);
    const long maxDelta = MAX(adx, ady);

    // Step size ~10 units -> smaller value allows closer movement but increases risk of slipping from hackers
    const int steps = MAX(1, (int)(maxDelta / 10));

    for (int i = 1; i <= steps; ++i)
    {
        long x = fromX + (dx * i) / steps;
        long y = fromY + (dy * i) / steps;

        if (!IsValidMovingLocation(x, y))
            return false;
    }

    return true;
}
#endif



📁 input_main.cpp

C++:
//void CInputMain::Move(LPCHARACTER ch, const char * data) fonksiyonunda şunu arayın:

    DWORD dwCurTime = get_dword_time();
    bool CheckSpeedHack = (false == ch->GetDesc()->IsHandshaking() && dwCurTime - ch->GetDesc()->GetClientTime() > 7000);

//Üstüne ekleyin:

#ifdef DISABLE_WALL_HACK
    if (ch->IsPC())
    {
        if (!ch->IsValidMovingPath(ch->GetX(), ch->GetY(), pinfo->lX, pinfo->lY))
        {
            sys_log(0, "BLOCKED_MOVE: %s map %d from (%d, %d) to (%d, %d) Riding(%d)",
                ch->GetName(), ch->GetMapIndex(), ch->GetX(), ch->GetY(), pinfo->lX, pinfo->lY, ch->IsRiding());
            LogManager::instance().HackLog("BLOCKED_MOVE", ch);
            ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY(), ch->GetZ());
            ch->Stop();
            ch->StopStaminaConsume();
            return;
        }
    }
#endif

C++:
//int CInputMain::SyncPosition(LPCHARACTER ch, const char * c_pcData, size_t uiBytes) fonksiyonunda şunu arayın:

        else
        {
            victim->SetLastSyncTime(tvCurTime);
            victim->Sync(e->lX, e->lY);
            buffer_write(lpBuf, e, sizeof(TPacketCGSyncPositionElement));
        }

//Üstüne ekleyin:

#ifdef DISABLE_WALL_HACK
        else if (victim->IsPC() && !victim->IsValidMovingPath(victim->GetX(), victim->GetY(), e->lX, e->lY))
        {
            LogManager::instance().HackLog("SYNC_BLOCKED_MOVE", ch);
            sys_err("Blocked SyncPosition (%s) from Name(%s) CH(%d,%d) VICTIM(%d,%d) SYNC(%d,%d)",
                victim->GetName(), ch->GetName(), ch->GetX(), ch->GetY(),
                victim->GetX(), victim->GetY(), e->lX, e->lY);
            if (ch->GetSyncHackCount() < g_iSyncHackLimitCount)
                ch->SetSyncHackCount(ch->GetSyncHackCount() + 1);
            victim->Show(victim->GetMapIndex(), victim->GetX(), victim->GetY(), victim->GetZ());
            victim->Stop();
            continue;
        }
#endif
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst