C++ Metin2 (Oyunun Sourcesine bakma IDA PRO'ya AT - Argument - (Arg) Tutorial)

5.00 yıldız(lar) 2 Değerlendirme Değerlendirenler

LunaUI

Level 5
Katılım
8 Şub 2022
Konular
95
Mesajlar
645
Online süresi
2ay 17g
Reaksiyon Skoru
722
Altın Konu
5
Başarım Puanı
158
Yaş
29
TM Yaşı
4 Yıl 2 Ay 10 Gün
MmoLira
15,777
DevLira
0

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. HEMEN TIKLA!

Source 'ye Bakma IDA PRO Ya At ögretimine Hoş Geldiniz
IDA PRO : Yu Açıp Metin2client.bin i atınız sonra (SHIFT + 12 ile Ida dan String Kısmına Giriş Yapınız)

(CTRL F ile IDA da Arama Kısmına SendCharacter) yazıp cıkan string'e cift tıklayınız


X ile fotoraf da gösterilen yerin üstüne X tusuna basarak Gidiniz (tek call cıkıcaktır cift tıklayınız)

Krtik kısım burasıdır cünkü (burada : Ida Pro Decompiler plugin'e ihtiyacınız vardır (GitHub üzerinden aratarak indirip Ida Pro Kısmındaki Plugin Kısımına Ata Bilirsiniz) - Ardından Plugin'i yükledikten sonra (F5)'e basarak devam edelim

Simdi ise Celestial World Sunucusunda Bulunan (char __thiscall sub_4DFB60(void *this, float *a2, float a3, char a4, char a5, char a6)) bizim kullanıcagımız kısım burası

baslangıcı copy paste yaparak alın : typedef void(__thiscall* TSendCharacterState)(void* pInstance, const Vector3& kPos, float Rotation, unsigned __int8 a4, unsigned __int8 a5, char a6); | Ida Pro decompiler cıktısında (void *this dedigi kızım yani 1 NetworkStream kısmı ) - ( 2 yazan ise vector3 yani float x,y,z) kısmıdır ( float a3 yazan ise rota dır) siz bana bunu sorucaksınız (float a3 nasıl oluyorda rota oluyor) cıktı kısmında arg da kullanılan dönüs acısını fmod ile a3 olarak kullanıldıgı icin biz burada anlıyoruz ki rotamız | float a2* yazan da aynı



*| Simdi Her packet her sucu da aynı olmaz |*
Hemen C++ örnegimi bırakıyorum size (Celestial World Sunucusu icin)

C++ Send Character State Packet (Celestial World):
    static bool NetworkStreamCelestialWorldSendCharacterState(const Vector3& c_rkPPosDst, float fDstRot, unsigned __int8 eFunc, unsigned __int8 uArg, char none)
    {
        try
        {
            typedef void(__thiscall* TSendCharacterState)(void* pInstance, const Vector3& kPos, float Rotation, unsigned __int8 a4, unsigned __int8 a5, char a6);
            TSendCharacterState SendCharacterState = (TSendCharacterState)(sdk_client + metin2client::C_SendCharacterStatePacket);


            void* NetworkStream = sdk::iNetworkStreamInstance();
            if (!NetworkStream || !SendCharacterState)
                return false;

            SendCharacterState(NetworkStream, c_rkPPosDst, fDstRot, eFunc, uArg, none);
            return true;
        }
        catch (...)
        {
            return false;
        }
    }

simdi ise bizim normal packed imize baktıgımızda hangi arg ın eksik oldugunu göre biliyoruz (Gameforge (TR) Sunucusu)
Eyer ki Celestial World' ün bin'i biz ıda pro ya atıp ögrenmeseydik Range Wait çalısmicak ve client kapanıcaktı

C++ Normal Packed:
  static bool NetworkStreamSendCharacterStatePacket(const Vector3& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg)
    {
        try
        {
            typedef void(__thiscall* tSendCharacterState)(void* pInstance, const Vector3& kPos, float z, UINT eFunc, UINT uArg);
            tSendCharacterState Send = (tSendCharacterState)(sdk_client + metin2client::C_SendCharacterStatePacket);

            void* NetworkStream = sdk::iNetworkStreamInstance();
            if (!NetworkStream || !Send)
                return false;

            Send(NetworkStream, c_rkPPosDst, fDstRot, eFunc, uArg);
            return true;
        }
        catch (...)
        {
            return false;
        }
    }
Siz Her Metin2 Source Sine Bakıp ona göre yazdıgınız da ise ezbere yapılmış bir kod yazıcaksınız o yüzden ida pro ya atıp istediginiz sunucuda packetleri rahatlıkla çalıstıra bilirsiniz
(Simdi ise Gecelim Farklı Yaklaşım ile)

SoloMt2 (Sunucusunun SendCharacterState'Sidir) burda farkındalık nedir (timeGetTime 'dır) | Celestial World Sunucusunda 40 Satır Kod varken (SoloMt2) packed inde ise 115 satır kod var yani siz arg'ı bile dogru yapsanız 3 <- yazan adım boyutunuz sabit kalıcak (2 yazan yine 5 saniye de bir konturol yapıcaktır) biz packed in icine extra bunları atlasın diye (Model Vector yani X Y Z mizi de packed'e giriyoruz ) Böylelikle Packed'imiz deki 8 adımı atllayıp 5 saniyeyi atlayıp 3 saniye kadar hasar vurdura biliyoruz

C++ Alves - SoloMt2 (packed):
static bool NetworkStreamAlves2SendCharacterState(const Vector3& c_rkPPosDst, float fDstRot, unsigned int eFunc, unsigned int uArg)
    {
        try
        {
            typedef void(__thiscall* TSendCharacterState)(void* pInstance, const Vector3& c_rkPPosDst, float Rotation, unsigned int a4, unsigned int a5);
            TSendCharacterState SendCharacterState = (TSendCharacterState)(sdk_client + metin2client::C_SendCharacterStatePacket);


            void* NetworkStream = sdk::iNetworkStreamInstance();
            if (!NetworkStream || !SendCharacterState)
                return false;

            SendCharacterState(NetworkStream, c_rkPPosDst, fDstRot, eFunc, uArg);
            return true;
        }
        catch (...)
        {
            return false;
        }
    }

Kullanımı:
 auto Teleport = [&](const Vector3& start, const Vector3& end)
                    {
                        std::vector<Vector3> dist = engine::DivideTwoPointsByDistance(5, start, end);

                        for (auto& point : dist)
                        {
                            engine::SendCharacterModel(point);
                            engine::NetworkStreamAlves2SendCharacterState(point, ent.Rotation, 0, 0);
                        }
                        engine::SendCharacterModel(end);
                        engine::NetworkStreamAlves2SendCharacterState(end, ent.Rotation, 0, 0);
                    };
                    Teleport(oldPosition, newpos);
                    engine::NetworkStreamSendAttackPacket(0, ent.VID);
                    Teleport(newpos, oldPosition);

C++ uzaktan vurum :d:
 static DWORD* GetMainActorPtr()
    {
        DWORD* CPythonCharacterManager = *(DWORD**)(sdk_client + metin2client::C_LocalPlayer);
        if (!CPythonCharacterManager)return nullptr;
        DWORD* Instance = *(DWORD**)((DWORD)CPythonCharacterManager + metin2client::C_LocalAddr);
        if (!Instance)return nullptr;
        return Instance;
    }
 template<typename T>
    static void Write(DWORD offset, T value)
    {
        DWORD* pActor = GetMainActorPtr();
        if (!pActor)
            return;

        *(T*)((DWORD)pActor + offset) = value;
    }
 static void SendCharacterModel(Vector3 pos)
    {
        try
        {
            sdk::Write<float>(metin2client::C_ModelCoordX, pos.x);
            sdk::Write<float>(metin2client::C_ModelCoordY, -fabs(pos.y));
            sdk::Write<float>(metin2client::C_ModelCoordZ, pos.z);
        }
        catch (...)
        {
        }
    }
Ben Gibi ugrasmaktan sa direk asm kısmına hook atarak bypass laya bilirsiniz (Simdi ise Gecelim asm kısmına Sunucu : Gameforge TR)
gameforge send chracter state:
 void GameForge(const Vector3& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg)
    {
        DWORD NetWorkStream = *(DWORD*)(sdk_client + 0x2BE46B4); // push :d
        DWORD aaaaa = (sdk_client + 0x23CC370);
        _asm
        {
            mov ecx, NetWorkStream
            push uArg
            push eFunc
            push fDstRot
            mov eax, c_rkPPosDst 
            push eax
            call aaaaa
        }
    }
eskiden de arg diye adlandırıdık simdi de arg diye adlandırırız biz bu sekilde istediginzi packed'i kullana bilir rzv yapa bilirsiniz yada aynı sistemi kullanarak korumaları bypass llaya bilirsiniz tamamiyle hayal gücünüze baglı
adres bulunumu
 
Güzel konu eline sağlık
 
Güncel olarak çalışıp çalışmadığına dair kanıt görsel ekleyebilirmisiniz.
 
Anlatım için teşekkürler ++
 

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