برو به محتوای اصلی
سوال
Yasaman Far
بازیساز
۲ سال پیش پرسیده شده

برای اینکه جلوی cheat کردن بازیکن ها، به خصوص در تعداد دارایی ها و امتیاز رو بگیرید از چه روش هایی استفاده می کنید؟ (چه فنی و چه دیزاینی)

من کجام؟ اینجا کجاست؟

در جامعه بازی‌سازان ایران می‌تونید در مورد هر موضوعی سوال کنید، به سوالای بقیه جواب بدید و تجربه‌تون رو به اشتراک بگذارید!

بسته به سبک بازی راه‌های فنی و طراحی خیلی متعدد هستند. من چند مثال می‌زنم شاید کمک کنه.
از لحاظ طراحی:
- کپسوله‌سازی Sync و Source دارایی‌ها (Encapsulation)
دارایی و امتیاز بازیکنان تا حد ممکن نباید روی هم تاثیر بذاره. مثلاً در دوران بازی‌های تحت مرورگر (Browser based games) مثل تراوین هر بازیکن می‌تونست به دهکده‌های دیگه حمله کنه و منابع اونا رو loot کنه. یا با اکانت‌های دیگه تجارت سوری انجام بده. این امر باعث می‌شد تا تعداد زیادی حساب کاربری جعلی ایجاد بشه تا منابع تولید کنند و بازیکن اصلی (Cheater) اونا رو به غارت ببره. Clash of Clans با مشخص کردن کانال دریافت(Source) و خرج(Sync)  منابع فقط در دهکده‌ی یک بازیکن جلوی تجارت رو گرفت و بدون این که بازیکنان روی نقشه مشخصی با هم مبارزه کنند هر واحد تولید رو کپسوله کرد. این طوری بعد از هر حمله امکان حمله به اون بازیکن گرفته می‌شد و با استفاده از سیستم Match making مشخص نبود با چه حریفی مبارزه خواهیم کرد. این امر باعث شد تا جلوی تبانی بازیکنان گرفته بشه. 
به نظرم تو بازی‌های چند نفره‌ای که جابه‌جایی منابع بین چندین بازیکن وجود داره اعمال محدودیت در قالب مکانیک بازی و کانالیزه کردن اونا اولین قدم برای جلوگیری از چیت منطقی در بازیه.

از لحاظ فنی:
روش‌های تقلب
- تغییر فایل‌‌های بازی
بسته به سبک بازی این قضیه خیلی خیلی می‌تونه متفاوت باشه. مثلاً تو بازی چند نفره‌ی سبک FPS یه بازیکن می‌تونه Shader دیوارها رو تغییر بده یا فایل Texture رو عوض کنه تا بتونه بهتر بازیکن‌های حریف رو ببینه یا حتی با تغییر Mesh یه مرحله مزیت رقابتی پیدا کنه. 

- تغییر حافظه‌ی بازی در حال اجرا
حتی اگر تمام فایل‌های بازی رمزنگاری شده باشند بالاخر هنگام اجرای بازی باید تو حافظه بارگذاری بشن. اما یه متقلب با ابزاری مثل Cheat Engine یا هر برنامه مشابه می‌تونه به حافظه‌ی اختصاص یافته به بازی دسترسی پیدا کنه و برتری پیدا کنه. مثلاً تو بازی ۳۸۶ تا تیر داره و با این برنامه‌ها دنبال این مقدار می‌گرده و با پیدا کردن آدرسش جلوی تغییر اون رو می‌گیره و تیرش بی‌نهایت می‌شه. 

روش‌های دیگه‌ای هم هست مثل این که پکت‌‌های شبکه بازی رو رصد کنه و جای بقیه بازی‌کن‌ها رو پیدا کنه اما اون دو مورد بالا از بقیه متداول‌تر هستند. 

راه‌حل؟ 
- استفاده از یه برنا‌مه‌ی جانبی که الگوی تغییر حافظه یا Hash فایل‌های بازی رو بررسی کنه و مطمئن بشه فایل صحیح بارگذاری شده و حین اجرا برنامه‌ی دیگه‌ای حافظه رو دستکاری نکرده. مثل برنامه‌ی VAC (Valve Anti Cheat) که در بازی‌های Counter Strike مورد استفاده قرار می‌گرفت. به خاطر Twitch based بودن بازی بررسی مکرر سرور می‌تونه تجربه‌ی بازیکن‌ها رو خراب کنه. 

- Obscured variables
با مخفی کردن و به هم ریختن متغیرها که به روش‌های مختلف انجام می‌شه اونا رو از دست تغییرات حافظه بیشتر حفظ کرد. به جای int از ObscuredInt استفاده می‌کنی و کسی نمی‌تونه اونا رو ویرایش کنه. توی این نوع تایپ جدید ممکنه یه int رو به چند بخش شکسته باشی و با یه فرمول به کلاسی که استفاده می‌کنه بر گردونیش. این جلوی یه سری چیت‌ها رو می‌گیره.

- Obfuscated code 
همین الان یه بازی که با یونیتی ساخته شده رو بردارید فایل Assembly CSharp رو تو فایل‌هاش پیدا کنید. با برنامه ILSpy  این DLL رو باز کنید. بله! تمام سورس کد برنامه رو می‌تونید ببینید. تمام چیزهایی که فکر می‌کردید جاشون امنه دیگه نیست. برای این قضیه در زبان‌های Managed مثل C# که به راحتی Decompile می‌شن می‌تونید از Obfuscator استفاده کنید. برای هر زبان چندین ابزار هست که این کار رو انجام می‌ده. 
در کل تمام فایل‌های یونیتی از جمله Prefab و Sceneها هم به همین راحتی با ابزار آماده می‌تونن خونده بشن. برای اینا هیچ‌وقت اطلاعات مهمی رو این جور جاها نگه ندارید.  (برای حفظ اطلاعات مهم و روشش‌های اون یه مقاله لازمه)

- Authoritative server
توی بازی شبکه تمام حرکات بازیکن به یه سرور فرستاده بشه و منطق بازی یه بار سمت سرور اجرا بشه. توی بازی‌های بزرگ با توجه به پیچیدگی بازی می‌تونه خیلی بار زیادی برای سرور داشته باشه. یکی دیگه از راه‌حل‌ها برای بازی‌های چند نفره اینه که هر بازیکن اطلاعات بقیه بازیکن‌ها رو در هر لحظه بررسی کنه. مثلاً من می‌خوام یه خونه بسازم که ۱۰ تا سکه می‌خواد، من تو هر ثانیه به طور ثابت یک سکه دریافت می‌کنم... بقیه کلاینت‌ها می‌تونن چک کنند که من این مقدار پول از اول بازی به دست آوردم یا نه، اگر چیت کنم به سرور اطلاع بدن تا سرور یه بار بازی رو بررسی کنه.

در آخر، این موارد بخشی از روش‌ها و متدهای چیت و جلوگیریش هست و مقالات و بحث‌های زیادی در این باره صورت گرفته. تا جایی که شرکت‌های بزرگ افراد متخصص برای جلوگیری از چیت استخدام می‌کنند که راه‌حل‌های فنی رو طراحی و پیاده‌سازی کنند و این که چیت کردن یه بازار سیاه چند میلیون دلاری داره. پس خیلی ساده در این بحث نمی‌گنجه. 

امیرحسین ناطقی
مدیر عامل کوییز آف کینگز

محمد جان خیلی کامل و عالی توضیح دادن، من فقط یه نکته رو هم اضافه کنم برای بازی‌های بزرگتر پیشنهاد می‌کنم که از سرویس‌های پروتکشن حتما استفاده کنن و خیلی از مشکلات رو براشون حل می‌کنه، توی این بحث توضیحات بیشتری دادم :
https://askgame.ir/post/5e8b54ce29c2e26e441b7aea#response-5e8b578b93c9760d6e1fb907۱۰۳
 

امین برمکی
آرتیست - طراح بازی

یه نکته هم که لزوما ارتباطی با چیت نداره استفاده از energy system هست. 
energy system بیشتر برای دسترسی یکسان بازیکن‌ها به منابع بازی در بازه زمان هست. 

مثال: در clash royale شما با یک حلقه مواجهید که شامل "پیروزی > بدست آوردن صندقچه >  ارتقا > پیروزی بعدی" میشه. اینجا سورس شما صندقچه هست. پس بازی از  یک energy system برای محدود کردن دسترسی شما به صندوقچه استفاده میکنه که در اینجا chest slot هست (نگهدارنده صندوقچه). 

برای اینکه جلوی cheat کردن بازیکن ها، به خصوص در تعداد دارایی ها و امتیاز رو بگیرید از چه روش هایی استفاده می کنید؟ (چه فنی و چه دیزاینی)

شما 4 تا chest slot دارید که هر کدام یه صندوقچه را نگه میداره و هر صندوق به طور میانگین در 8 ساعت unlock میشه. پس شما بعد از هر 4 برد (بدست آوردن 4 صندوقچه) بمدت 8 ساعت از بازی خارج میشید و بعد دوباره بازی میکنید.

نکات مثبت این سیستم:

  • بازیکن فعال و غیر فعال تقریبا به یک اندازه به resource دسترسی دارند.
  • برای خارج شدن از این سیستم باید هزینه پرداخت شود. (unlock with Gem)
  • بازیکن بخاطر بازی در فواصل مشخص (بازی کن > صبر کن > بازی کن ) به مرور به بازی اعتیاد پیدا میکند و این شانس وجود دارد که به صورت دراز مدت‌تر به بازی بپردازد.

حالا در این بین روش‌های سنتی‌تر برای محدود کردن انرژی در بازی وجود داره که همراه با punishment هست و خیلی توصیه نمیشه. دیزاین‌های supper cell سلامت هستند و ازین نظر قابل الگو برداری هستند.