رایت آپ هک و تقلب در بازی کفتر پرشی ترجمیار

با سلام خدمت دوستان عزیز.

همونطور که میدونید و حتی ممکنه ندونید، وبسایت ترجمیار با حضور بسیاری دیگر از استارتاپ ها، یک بازی آنلاین تحت وب راه اندازی کرد به نام "کفتر پرشی" که بازیکن، میاد توی این بازی امتیاز جمع میکنه و برنده ی جوایز میشه. ضرب الاجل این بازی تا پایان روز 15 فروردین هست.

نوع بازی چیه؟

  • همینقدر بدونید که بهشون میگن WebAssembly Games .

شرایط بازی چیه؟

  • شما بازی رو با انتخاب نوع کفتر شروع میکنید. با هر کلیک کفتر شما ارتفاع خاصی رو میره بالا و طبق گرانش میاد پایین. در مسیر شما لوله هایی هست که باید سعی کنید از بین اونها رد بشید وگرنه بازی رو تا جایی که پیش رفتید باختید، حتی اگر زمین بخورید هم همینطوره. (حالا کاری ندارم که بعضی جاهاش اصلا قابل رد شدن نیست)

چرا درباره تقلب در این بازی مینویسم؟
ربات مترجم متعلق به #ترجمیار ، 5 روز پیش این مطلب رو پست کرد و شرایط تقلب رو نوشت. من هم بعد از 48 ساعت، رکوردم به نام Mownten با امتیاز 1315 و تعداد 21 جایزه هنوز پابرجا هست و طبق توییت زیر و اعلام به ترجمیار، روش های تقلب (کشف شده و کشف نشده) در این بازی رو تشریح میکنم.

توییت تشریح تقلب های ممکن در بازی های WebAssembly
توییت تشریح تقلب های ممکن در بازی های WebAssembly

حالا بریم سراغ آنالیز بازی:


  • ما در زمان شروع بازی میبینیم که هفت عدد کفتر متفاوت برای بازی پیشنهاد میشه و شمارش معکوس برای انتخاب خودکار کمتر از 10 ثانیه هست. این موضوع هم برای تنوع در بازی هست هم شاید برای ایجاد فاکتور تشخیصی در تقلب بازیکن. (کفتر زرد رنگ با شماره 7 شناخته میشه)
  • هر کلیکی که در هر جای صفحه بشه، کفتر به بالا میپره (حتی اگر با Alt+Tab به برنامه دیگری برید و برگردید، نباید کلیک کنید وگرنه پرش خودش رو انجام میده). میبینیم که بازی باید با کلیک اول ما شروع بشه.
  • در طول مسیر موانعی بر سر ما ظاهر میشن که از دو طرف پایین و بالا دارای درازای خاصی هستن. بازی اینها رو بعنوان لوله میشناسه که به محض عبور ما از این لوله، یک امتیاز مشخصی برای ما در نظر گرفته بشه. لوله عادی : 5 امتیاز ، لوله تبلیغاتی : 20 امتیاز
    در بالای صفحه سمت چپ میبینیم که تعداد لوله های رد شده شمرده میشه. بعد از اتمام بازی میشه این حدس رو زد که هر لوله تبلیغاتی یه کد داره و به محض عبور بازیکن، اون کد براش درنظر گرفته میشه بعنوان جایزه.
    لوله تبلیغاتی:
شمارنده لوله تبلیغاتی
شمارنده لوله تبلیغاتی

تنوع جوایز که این حدس رو قوی تر میکنن:

بیشتین جوایز متعلق به نفر اول این بازی
بیشتین جوایز متعلق به نفر اول این بازی
  • ما چندین عامل پیش رو هم داریم که طبق تصویر زیر در زمان پیشروی در بازی تغییر میکنن:

تعداد جعبه : که به محض برخورد با اولین مورد، 230 امتیاز داد.
متراژ پیشروی: که در اینجا 56 هست.
امتیاز کنونی: که در اینجا 350 هست.

عوامل متغیر در بازی
عوامل متغیر در بازی
  • وقتی با صورت میخوریم به مانع یا زمین چه اتفاقی میفته؟ میریم به صفحه ی ثبت امتیاز. حالا با امتیاز 100 میرم برای ثبت امتیاز تا ببینم که چه چیزایی در واقع ثبت میشن؟
ثبت امتیاز 100 در بازی
ثبت امتیاز 100 در بازی


نتیجه استعلام جوایز
نتیجه استعلام جوایز


در تصویر فوق میبینیم که با امتیاز 100، الان رتبه 412 رو داریم و هیچ جایزه ای هم برنده نشدیم.

حالا میریم سراغ سناریو تقلب:

یکی از راه ها اینه که جدا از بازی کردن، ببینیم که چه اطلاعاتی از طریق مرورگر فرستاده میشه. برای همین میریم یه افزونه Cookie Editor روی مرورگر نصب میکنیم تا کوکی ها رو ببینیم:

ورودی های متفاوت در کوکی
ورودی های متفاوت در کوکی

خب. اینجا عناصر کمتری رو میبینیم. مثلا Best_Score که بالاترین امتیاز کسب شده هست، last_score که آخرین امتیاز کسب شده هست و یه چیز جالب اینکه total_score داره و میاد امتیازات رو جمع میکنه. برای چی آخه؟ شاید برای جلوگیری از تقلب باشه یا اینکه ببینن چندبار بازی کردیم. این عدد تا 50هزار و 100هزار هم میره تا صاحب بازی حین بررسی امتیاز ببینه که اون بازیکن چقدر ممکنه بازی کرده باشه و اگر مشکوک بود، به امتیازش بتونه شک کنه و کشف تقلب بکنه.

نتیجه؟ گرچه ممکنه با کمی محاسبات ریاضی اون سه متغیر رو ویرایش بکنیم و امتیاز رو بفرستیم تا بره چونکه توی کوکی معلوم نیست که من چندتا لوله تبلیغاتی رو رد کردم و یا جعبه هدیه گرفتم. پس توی جدول مسابقات چطور فهمیده میشه من چندتا کد تخفیف دارم که لیست بکنه؟ اینجاش سواله و قشنگه.

من یک بار کوکی ها رو ویرایش کردم و سعی کردم امتیاز 3036 رو ثتب کنم که جزو 5 نفر برتر باشم در حالیکه امتیاز زیر 100 داشتم.

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

عدم نمایش امتیازی که با Cookie Editor ثبت شده باشد.
عدم نمایش امتیازی که با Cookie Editor ثبت شده باشد.

جالبیش اینجا اینه که اگر ایمیل خودم رو وارد کنم بهم میگه الان ششم هستم، 3036 امتیاز دارم و کلی جایزه. برای استعلام زنده این ایمیل رو وارد کنید: mownten@mail.ru

جوایز و رتبه ی یک امتیاز ویرایش شده با Cookie Editor
جوایز و رتبه ی یک امتیاز ویرایش شده با Cookie Editor

خب در هر صورت نمیشه به این موضوع دل بست و گفت که تقلب شده (با اینکه یه اتفاقاتی در هر صورت افتاده).

خلاصه میریم سراغ سناریو بعدی. سناریو اینه که به جای ویرایش امتیازات بعد از برخورد به مانع، بیایم مقدار های متغیر توی بازی رو تغییر بدیم.

توضیح اینکه برای این کار نیاز به نرم افزار Cheat Engine برای ویرایش متغیرها در نرم افزار قابل اجرا هستیم.

جدید ترین نسخه اون هم Cheat Engine 7.0 هست . برنامه رو اجرا میکنیم و process اجرا شده توسط مرورگر برای این بازی رو فراخوانی میکنیم که تغییرات دلخواه رو بهش Inject کنیم.

کسانی که میخوان این تزریق رو از طریق مرورگر Google Chrome انجام بدن قطعا با خطا مواجه میشن چونکه گوگل در چندین نسخه قبل تر از کروم، قابلیت تزریق در این مرورگر رو بسته.

متن خطا با این مضمونه : Failed to Inject DLL . اینجا شخص به این فکر میفته که شاید بتونه با اجرای Cheat Engine از طریق یوزر SYSTEM با دسترسی بالاتری اقدام به تزریق بکنه ولی ربطی به کروم نداره و خطا رو مجددا نشون میده. در جاهایی گفته شده که میانبر کروم با این عبارت -no-sandbox اجرا بشه که باز هم جواب نمیده.

و باید بریم سراغ Mozilla Firefox چونکه این قابلیت توی فایرفاکس وجود داره و امکان تقلب هست.

حالا چکار کنیم با فایرفاکس:

ما باید 4 بار Cheat Engine رو اجرا کنیم. چرا؟ برای رصد چهار متغیر در بازی:
1- تعداد امتیاز : که متغیر 4-Byte هست
2- تعداد لوله تبلیغاتی: که متغیر 4-Byte هست
3- تعداد جعبه هدیه: که متغیر 4-Byte هست
4- متراژ پیشروی : که متغیر 2-Byte هست

من برای این کار یه ویدیو رکورد کردم که میتونید از طریق لینک های زیر مشاهده کنید و بدلیل pause نداشتن بازی مجبور میشدم alt+tab بزنم و در حین بازی متغیرها رو تغییر بدم.

مشاهده ویدیو در آپارات یا یوتیوب

در اینجا مجبور بودم بازی رو به یه حد عقلانی برسونم که انگار سه برابر مسر رو رفتم. برای اینکار:

امتیاز 4بایتی رو از 815 تغییر دادم به 3015 - تعداد لوله تبلیغاتی از 3 تغییر دادم به 30 - تعداد جعبه هدیه از 3 تغییر دادم به 10 و متراژ 2بایتی رو 22 تغییر دادم به 600 که برای بازی منطقی باشه. منطقا شما با متراژ 22 نمیتونید 3000 امتیاز و این همه جایزه داشته باشید.

امتیاز نهایی من شد 3025 که با نام Hashemi و آدرس ایمیل alihashemi@mail.com ثبتش کردم. در وهله اول در ثبتش با این خطا مواجه شدم: "ثبت امتیاز با خطا مواجه شد" ولی امتیاز ثبت شده بود. چیزی که اینجا ظرافت کدنویس رو نشون داد این بود که من با اون امتیاز فقط 2 جایزه هدیه داشتم فقط و کاملا معلوم بود که تقلب هست. چونکه با ترتیب لوله ها و عدم برخورداری از جعبه هدیه ، امکان نداره همچین امتیازی کسب بشه. در واقع تمام امتیازاتی که در طول بازی بدست آورده بودم برام ثبت شده بود ولی امتیاز بدون توجه به اونا قابل تغییر بود.

یه چیز جالب تر در ادامه ویدیو اینه که بعد از استعلام جوایز مربوط به ایمیل، فقط یه جایزه لوله تبلیغاتی برام در نظر گرفته بود و جایزه هدیه نداشتم درحالی که قبل از تقلب و تغییر متغیرها، من سه تا جایزه لوله و سه تا جایزه هدیه داشتم. (کاش بهش دست نمیزدم D: )

این امتیاز در تاریخ 11 فروردین ساعت 6:28 دقیقه عصر ثبت شد و منتظر موندم تا عکس العمل #ترجمیار رو ببینم که نهایتا منجر به این توییت توسط ترجمیار در همون روز ساعت 10:25 دقیقه شب شد و من هم جواب دادم:

توییت ترجمیار در واکنش به سناریو دوم تقلب من در بازی بهمراه جواب من به توییت. منظور از باگ ناچیز هم همون نتیجه استعلام سناریو اول هست
توییت ترجمیار در واکنش به سناریو دوم تقلب من در بازی بهمراه جواب من به توییت. منظور از باگ ناچیز هم همون نتیجه استعلام سناریو اول هست


خب. تا اینجای کار دیدیم که تغییر متغیرهای طبیعی در بازی جوابگو نیست و میبایست از سناریو سوم استفاده کنم. سناریو سوم (که نمیدونم توسط #ترجمیار بعنوان تقلب حساب میشه یا خیر - که اگر نشه من جوایزم رو از دست میدم D: ) استفاده از قابلیت SpeedHack در Cheat Engine هست.

سوال: قابلیت SpeedHack چیکار میکنه؟

این قابلیت تغییراتی رو در process انجام میده که منجر به تغییر سرعت پردازش میشه. در حالت عادی این سرعت بر روی مقدار یک هست که در صورت کاهش میشه به 0.5 یا 0.25 یا 0 تغییر داد و در صورت افزایش میشه تا 500 برابر سرعت پردازش رو برد بالا. این قابلیت توی کروم منجر به کاهش سرعت پردازش خود کروم در کارهایی مثل باز کردن تب و لودینگ و غیره میشه لکن توی بازی تغییر ایجاد نمیکنه و بایستی از طریق فایرفاکس اقدام کرد.

تا اینجا فهمیدیم تنها راه ممکن برای تقلب در بازی این هست که از طریق فایرفاکس ، Process مربوط به بازی رو کشف کنیم و با Cheat Engine سرعت بازی رو بیاریم پایین و بازی کنیم تا بتونیم با دقت و حوصله بالاتری پیش بریم. از این طریق من تونستم امتیاز 1315 با جمع جوایز 21 با اسم Mownten و آدرس ایمیل mownten@mail.ru رو بدست بیارم.

این امتیاز در تاریخ یکشنبه 10 فروردین ساعت 6 عصر با رتبه 67 ثبت شده که الان 48 ساعت ازش گذشته و همچنان هم توی لیست با رتبه 58 باقی مونده. فقط یک جای موضوع که ایراد داره و بازی دارای باگ هست اینه که من این امتیاز رو بدون دستکاری کردن امتیاز ها بصورت کاملا طبیعی بدست آوردم و اسمم توی جدول امتیازات هست ولی اگر استعلام ایمیلم رو بگیرم، اون امتیاز ثبت شده توسط راهکار ویرایش کوکی در سناریو اول رو نشونم میده که رتبطه 6 هستم با کلی جایزه P: .

زمان ثبت امتیاز 1315 ، یکشنبه 10 فروردین ، رتبه 67
زمان ثبت امتیاز 1315 ، یکشنبه 10 فروردین ، رتبه 67
زمان بقای امتیاز 1315 ، سه شنبه 12 فروردین، رتبه 58
زمان بقای امتیاز 1315 ، سه شنبه 12 فروردین، رتبه 58


موفق و موید باشید

سید علی (سپهر) هاشمی