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
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
Rica ederim, yorum için teşekkürler.Paylaşım için çok teşekkürler.
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 8
- Görüntüleme
- 336
- Cevaplar
- 11
- Görüntüleme
- 602
- Cevaplar
- 6
- Görüntüleme
- 300
- Cevaplar
- 0
- Görüntüleme
- 292
- Cevaplar
- 9
- Görüntüleme
- 489