R10DEV.NET HABER SİTESİ AÇILDI!R10DEV.NET HABER SİTESİ AÇILDI!

Metin2 C++ SendSpecial (Source Code) – Packet Gönderme Fix
0
11

admin

PATRON
SİTE YETKİLİSİ
Moderator
ÜYE
Kurumsal Üye
Katılım
23 Eki 2022
Mesajlar
6,197
Çözümler
11
Tepkime puanı
3,815
Puanları
113
Yaş
28

📌 Metin2 C++ SendSpecial (Source Code) – Main Kod + Kullanım

Metin2 client üzerinde SendSpecial fonksiyonunu kullanarak paket gönderme işlemini gerçekleştiren C++ source kodunu aşağıda paylaşıyorum. Özellikle network stream üzerinden özel paket (special packet) göndermek isteyenler için işinize yarar.




🔧 Gerekli Tanımlar

C_Hearder = 0xDC;
C_SendSpecial = 0x14FF20;




🧠 Network Stream Instance Alma

static void* iNetworkStreamInstance()
{
DWORD inst = (DWORD)(sdk_client + metin2client::C_CPythonNetworkStream);
if (!inst) return nullptr;
return (void*)inst;
}




📡 SendSpecial Fonksiyonu

static bool NetworkStreamSendSpecial(int nLen, void* pvBuf)
{
try
{
typedef bool(__thiscall* Special)(void* This, int nLen, void* pvBuf);
Special Send = (Special)(sdk_client + metin2client::C_SendSpecial);
void* pNetStream = sdk::iNetworkStreamInstance();

if (!pNetStream || !Send)
return false;

return Send(pNetStream, nLen, pvBuf);
}
catch (...)
{
return false;
}
}




💉 Byte (Opsiyonel Hook / Shellcode)

BYTE Byte[] = {
0x55,
0x8B, 0xEC,
0x60,
0xB8, 0x00, 0x00, 0x00, 0x00,
0x8B, 0x48, 0x08,
0x03, 0x48, 0x04,
0x8B, 0x09,
0x85, 0xC9,
0x74, 0x08,
0xFF, 0x70, 0x10,
0xFF, 0x70, 0x0C,
0xFF, 0x10,
0x61,
0x8B, 0xE5,
0x5D,
0xC3
};




🚀 Kullanım (Attack Packet Örneği)

#pragma pack(push)
#pragma pack(1)

typedef struct cmd
{
BYTE header;
BYTE bType;
DWORD dwVictimVID;
BYTE bCRCMagicCubeProcPiece;
BYTE bCRCMagicCubeFilePiece;
} TPacketCGAttack;




🔁 Thread İçinde Kullanım

DWORD WINAPI dungeona(HMODULE hModule)
{
AllocConsole();

while (true)
{
auto entities = GetEntities();

for (int i = 0; i < entities.size(); ++i)
{
const auto& ent = entities;

TPacketCGAttack SendBattlePacket{};
SendBattlePacket.header = metin2client::C_Hearder;
SendBattlePacket.bType = 0;
SendBattlePacket.dwVictimVID = ent.VID;
SendBattlePacket.bCRCMagicCubeProcPiece = 0;
SendBattlePacket.bCRCMagicCubeFilePiece = 0;

engine::NetworkStreamSendSpecial(sizeof(TPacketCGAttack), &SendBattlePacket);
}

Sleep(500);
}

return 0;
}






⚠️ Notlar

  • Offsetler client sürümüne göre değişebilir
  • Yanlış kullanım ban sebebidir
  • Testleri local serverda yapmanız önerilir
  • GetEntities() fonksiyonunun düzgün çalışması gerekir

Metin2 Hile Fixi

🛡️ Metin2 SendSpecial Exploit Fix (Server Side)


Client'tan gelen bu tarz paketleri engellemenin tek yolu:
👉 SUNUCU TARAFINDA doğrulama (validation)


Client'a asla güvenilmez.




🔎 1. Header Kontrolü (Whitelist)


Gönderilen paketin header'ı mutlaka kontrol edilmeli:


if (packet->header != EXPECTED_HEADER)
return;


📌 Öneri:


  • Sadece izin verdiğin packet'ları kabul et
  • Diğerlerini direkt dropla



🧠 2. State Kontrolü (En Önemlisi)


Attack packet için:

if (!ch->CanAttack())
return;


Kontrol etmen gerekenler:


  • Oyuncu stun mı?
  • Safe zone'da mı?
  • Ölü mü?
  • Skill cooldown var mı?



🎯 3. Target (VID) Doğrulama


Client istediği VID'yi gönderebilir → TEHLİKELİ


LPCHARACTER victim = CHARACTER_MANAGER::instance().Find(packet->dwVictimVID);

if (!victim)
return;

if (DISTANCE_APPROX(ch->GetX() - victim->GetX(), ch->GetY() - victim->GetY()) > MAX_ATTACK_RANGE)
return;


📌 Böylece:


  • Uzaktan vurma (range hack) engellenir
  • Fake VID engellenir



⏱️ 4. Attack Speed / Spam Koruması


DWORD dwTime = get_dword_time();

if (dwTime - ch->GetLastAttackTime() < MIN_ATTACK_DELAY)
return;

ch->SetLastAttackTime(dwTime);


📌 Bu neyi engeller:


  • Packet spam
  • Speed hack
  • Macro abuse



🔐 5. CRC / Integrity Kontrol (Opsiyonel ama güçlü)


Client'ta gördüğün:


bCRCMagicCubeProcPiece
bCRCMagicCubeFilePiece


Server'da kontrol edebilirsin:


if (packet->bCRCMagicCubeProcPiece != expected1 ||
packet->bCRCMagicCubeFilePiece != expected2)
return;


📌 Ama:


  • Bu tek başına güvenli değil
  • Reverse edilip bypasslanabilir



🚫 6. Invalid Packet Ban / Log


sys_log(0, "HACK DETECTED: %s", ch->GetName());

ch->Disconnect();


veya:



ch->ChatPacket(CHAT_TYPE_INFO, "Invalid packet detected.");





💣 En Önemli Kural


❗ "Client ne gönderirse göndersin, server kendi hesaplamasını yapmalı"

Örnek:


  • Damage client'tan alınmaz
  • Range client'tan alınmaz
  • Cooldown client'tan alınmaz



🧩 Özet


Bu paylaştığın SendSpecial tarzı şeylere karşı fix:


✔ Packet validation
✔ State kontrol
✔ Range kontrol
✔ Attack speed limit
✔ Server-side logic
 
Üst
Reklam Ver
R10dev.net'i ana ekrana ekle!