- 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
"Client ne gönderirse göndersin, server kendi hesaplamasını yapmalı"