4 ديسمبر، 2016







أليوم بإذن الله حنشرح اهم حاجة على ألإطلاق المفروض تكون موجوده 
في سورسك وسيرفرك بشكل عام وهي " ألحماية ".
يعني ايه " الحمايه " ؟ 

حقولك يعني تمنع برامج الهاكر بس مش من اللودر .. لا من السورس نفسه !
توضيح أكثر .. الشيت انجن مثلا بيقدر يغير القيم زي الدامج او الليفل او الباتل بور وخلافه .
طيب عاوز تمنعه من السورس .. أقرب مثال هو كود الباتل بور الي نزلته قبل كده
والي يحدد قيمة الباتل باور ولو زادت يتنفذ شرط محدد مسبقا.
حنوضح اكثر بالشرح أدناه .. اولا الجزء المتعلق بالشخصيه
انا عاوز امنع ان حد الباتل باور بتاعه يزيد عن 405 مثلا
حنروح على الورلد ونستخدم فويد 


void CharactersCallback( 
ونفتح ريجيون جديد ونحط فيه الشرط بتاعنا
if (client.Entity.NobilityRank == NobilityRank.King && client.Entity.BattlePower > 405) 
                {  
ونضيف تحت الأمر الي هيتنفذ لو الشرط اتحقق
ConquerItem[] inventory = new ConquerItem[client.Inventory.Objects.Length]; 
                    client.Inventory.Objects.CopyTo(inventory, 0); 

                    foreach (ConquerItem item in inventory) 
                    { 
                        client.Inventory.Remove(item, Game.Enums.ItemUse.Remove); 
                    } 
                      
                    client.Equipment.Remove(1); 
                    client.Equipment.Remove(2); 
                    client.Equipment.Remove(3); 
                    client.Equipment.Remove(4); 
                    client.Equipment.Remove(5); 
                    client.Equipment.Remove(6); 
                    client.Equipment.Remove(7); 
                    client.Equipment.Remove(8); 
                    client.Equipment.Remove(9); 
                    client.Equipment.Remove(10); 
                    client.Equipment.Remove(11); 
                    client.Equipment.Remove(12); 
                    client.Equipment.Remove(18); 
                    client.Equipment.Remove(19); 
                    client.Disconnect(); 
                } 
دا مثال بسيط والمعظم عارفه طيب دلوقتي أنا عاوز ان الأتاك ميزيدش عن 60 الف مثلآ هنضيف الشرط
if (client.Entity.MaxAttack >= 60000 || client.Entity.MinAttack >= 60000) 
                {  
ونضيف الأمر الي هيتنفذ تحته
client.Disconnect(); 
                }  
شرطنا هنا أن لو الماكس أتاك او الميني زاد عن 60 الف الأيميل يقفل طبعآ تقدر تضيف أي أمر انت عاوز تعمله زي البان او الحظر مثلآ نفس النظام مع الدفنس او الأتش بي وكل القيم بتاعت الشخصيه تقدر تحددهم .
دلوقتي الجزء المتعلق بالأيتيم يعني ازاي نخلي الأيتيم مياخدش غير القيمه بتاعته هنضيف دي في Entity أو Player عشان نستخدمها
public ConquerItem item;
وهنضيف في الورلد الكود دا
if (client.Entity.item.Bless > 7 || client.Entity.item.Plus > 12 || client.Entity.item.Enchant > 255) 
                { 
                    client.Disconnect(); 
                }  
الكود بيمنع ان الدامج يزيد عن 7 و البلاص عن 12 والاتش بي عن 255 ملحوظه : أنا لسه عامل الأكواد دي حالآ مجربتهاش .. يعني لو احتاجت تعديل سيبه في تعلق
دلوقتي الـسبيد هاك طبعآ تقدر تمنعه لو عرفت أقصي عدد نطات للأكونت في الثانيه وأقل عدد كمان لازم الأتجاهات والنظام القديم دا لكن هديك النظام القديم والجديد القديم .. هتعمل كلاس جديد وتحط فيه الأكواد دي
using System; 

namespace TroZena 
{ 
    public unsafe class AntiSpeedHack 
    { 
        static bool UnInAttack(Client.GameState client, int Value) 
        { 
            if (Time32.Now <= client.Entity.AttackStamp.AddMilliseconds(1650)) 
            { 
                return false; 
            } 
            return true; 
        } 
        static bool UsingSH(int Value, Game.Enums.ConquerAngle Facing) 
        { 
            switch (Facing) 
            { 
                case Game.Enums.ConquerAngle.North: 
                    { 
                        if (Value < 640) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                case Game.Enums.ConquerAngle.NorthEast: 
                    { 
                        if (Value < 630) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                case Game.Enums.ConquerAngle.NorthWest: 
                    { 
                        if (Value < 625) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                case Game.Enums.ConquerAngle.South: 
                    { 
                        if (Value < 620) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                case Game.Enums.ConquerAngle.East: 
                    { 
                        if (Value < 640) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                case Game.Enums.ConquerAngle.West: 
                    { 
                        if (Value < 635) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                case Game.Enums.ConquerAngle.SouthWest: 
                    { 
                        if (Value < 645) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                case Game.Enums.ConquerAngle.SouthEast: 
                    { 
                        if (Value < 645) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                default: 
                    { 
                        Console.WriteLine("UnKnow Facing [Speed Hack]!" + Facing.ToString()); return true; 
                    } 
            } 
            return false; 
        } 
        public static void Process(Client.GameState client, Time32 Now) 
        { 
            if (!client.FTbode) 
            { 
                client.FTbode = true; 
                client.bodeSHStamp = Time32.Now; 
            } 
            else 
            { 
                var Value = (Time32.Now.Value - client.bodeSHStamp.Value); 
                if (UsingSH(Value, client.Entity.Facing)) 
                { 
                    if (UnInAttack(client, Value)) 
                    { 
                        Console.WriteLine("SpeedHack Detected : " + client.Entity.Name + " | Info | Value : " + Value + " Facing : " + client.Entity.Facing); 
                        client.Disconnect(); 
                    } 
                } 
                client.bodeSHStamp = Time32.Now; 
            } 
        } 
    } 
}  
دا شكل الكود القديم نشرح . الكود الأول
static bool UnInAttack(Client.GameState client, int Value) 
        { 
            if (Time32.Now <= client.Entity.AttackStamp.AddMilliseconds(1650)) 
            { 
                return false; 
            } 
            return true; 
        }   
دا خاص بالأتاك .. ومضمون الكود انه يقفل الأكونت لو كان أخر وقت ضرب فيه وحش أو شخصيه أقل من ثانيه و نص تقريبآ الكود دا
AddMilliseconds(1650)) 
دا بيدي مهله قيمتها 1650 ميلي ثانيه بعد أخر مره الأكونت قتل او هاجم وحش او شخصيه الثانيه = 1000 ميلي ثانيه تقدر تزود أو تنقص القيمه وتظبطها علي الوضع المناسب لسيرفرك
الكود التاني
static bool UsingSH(int Value, Game.Enums.ConquerAngle Facing) 
        { 
            switch (Facing) 
            { 
                case Game.Enums.ConquerAngle.North: 
                    { 
                        if (Value < 640) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                case Game.Enums.ConquerAngle.NorthEast: 
                    { 
                        if (Value < 630) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                case Game.Enums.ConquerAngle.NorthWest: 
                    { 
                        if (Value < 625) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                case Game.Enums.ConquerAngle.South: 
                    { 
                        if (Value < 620) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                case Game.Enums.ConquerAngle.East: 
                    { 
                        if (Value < 640) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                case Game.Enums.ConquerAngle.West: 
                    { 
                        if (Value < 635) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                case Game.Enums.ConquerAngle.SouthWest: 
                    { 
                        if (Value < 645) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                case Game.Enums.ConquerAngle.SouthEast: 
                    { 
                        if (Value < 645) 
                        { 
                            return true; 
                        } 
                        break; 
                    } 
                default: 
                    { 
                        Console.WriteLine("UnKnow Facing [Speed Hack]!" + Facing.ToString()); return true; 
                    } 
            } 
            return false; 
        }   
دا خاص بالأتجاهات شمال جنوب شرق غرب يستحسن أنك تستغني عن الكود دا الا لو عارف الأتجاهات بالظبط ونبدله بأخر حركه للشخصيه هنعيد تكويده تاني عشان يبقا بالشكل دا وهنستخدم في Entity الأكواد دي
 public Time32 LastClientJump; 
        public Time32 LastMove;   
و كمان دول لو مش موجودين عندك في GameClient Or GameState
public Time32 bodeSHStamp; 
        public bool FTbode = false; 
هيبقا عندنا الكود او الكلاس بالشكل الجديد كدا
using System; 

namespace TroZenA 
{ 
    public unsafe class AntiSpeedHack 
    { 
        static bool UnInAttack(Client.GameClient client, int Value) 
        { 
            if (Time32.Now <= client.Entity.AttackStamp.AddMilliseconds(1650)) 
            { 
                return false; 
            } 
            return true; 
        } 
        static bool UsingSH(Client.GameClient client, int Value) 
        { 
            if (Time32.Now <= client.Entity.LastClientJump.AddMilliseconds(client.LastJumpTime) || Time32.Now <= client.Entity.LastMove.AddMilliseconds(client.LastJumpTime)) 
            { 
                return false; 
            } 
            return true;  
        } 
        public static void Process(Client.GameClient client, Time32 Now) 
        { 
            if (!client.FTbode) 
            { 
                client.FTbode = true; 
                client.bodeSHStamp = Time32.Now; 
            } 
            else 
            { 
                var Value = (Time32.Now.Value - client.bodeSHStamp.Value); 
                if (UsingSH(client, Value)) 
                { 
                    if (UnInAttack(client, Value)) 
                    { 
                        Console.WriteLine("SpeedHack Detected : " + client.Entity.Name + " | Info | Value : " + Value + " Facing : " + client.Entity.Facing); 
                        client.Disconnect(); 
                    } 
                } 
                client.bodeSHStamp = Time32.Now; 
            } 
        } 
    } 
}  
طيب هو كدا مجرد كلاس موجود بس مش شغال لأنه غير مرتبط بأي ملف تنفيذي في السورس زي الورلد او البروجرام أو الباكتات طيب احنا نقدر نشغله بطريقتين الأولي : ممكن تختلف عن ناس لأنها من الباكت هاندلر الأختلاف في اسم الفويد سورس زي تروزينا هتلاقي الأسم بتاع الفويد مثلآ
void PlayerJump(Data generalData, Client.GameClient client) 
هتضيف تحته الأمر دا
if (!client.Entity.OnCyclone() && !client.Entity.ContainsFlag(Update.Flags.Ride) && !client.Entity.OnOblivion() && !client.Entity.OnSuperman() && !client.Entity.ContainsFlag3(Update.Flags3.DragonCyclone) && !client.Entity.OnSuperCyclone() && !client.Entity.Transformed) 
            { 
                AntiSpeedHack.Process(client, Now);            
            }   
والكود بيقول لو الأكونت مش في حالة السرعه زي الاكس بي بتاع التروجان او اي اكس بي اسكل لأنها بتخلي الأكونت سريع يبقا ينفذ الأمر
AntiSpeedHack.Process(client, Now);
والي بيروح يشوف معدل الحركه بتاع الكلنت لو لقاها أكبر من الي محددينه هيكتب في الكونصول أسم الاكونت الي استخدم الهاك وهيقفل الأكونت
Console.WriteLine("SpeedHack Detected : " + client.Entity.Name + " | Info | Value : " + Value + " Facing : " + client.Entity.Facing); 
                        client.Disconnect();  
لو عاوز طريقه تانيه لتشغيل الكود يبقا هتروح الورلد زي أكود التشيك تحت الفويد الي حددناه قبل كدا وتضيف الكود دا برضو
#region AntiSpeedHack by Phoenix 
                if (!client.Entity.OnCyclone() && !client.Entity.ContainsFlag(Update.Flags.Ride) && !client.Entity.OnOblivion() && !client.Entity.OnSuperman() && !client.Entity.ContainsFlag3(Update.Flags3.DragonCyclone) && !client.Entity.OnSuperCyclone() && !client.Entity.Transformed) 
                { 
                    AntiSpeedHack.Process(client, Now); 
                } 
                #endregion  
دي كانت مجرد فكره لمنع الهاك وتقدروا تطوروها وتستخدموها عشان تقفل أي هاك يقابلك كل الي هتعمله هتفهم شغل الهاك ويقدر يعمل ايه بالظبط وتقفل عليه الطريق وتسد الثغرات الي في السورس لو في أي أقتراح أو طلب سيبه في كومنت