نگاره‌هایی پیرامون امنیت، شبکه و رمزنگاری

17 آگوست 2019

با بازی Fallout Shelter چند هفته قبل آشنا شدم و خیلی خوشم اومد. این بازی از نوع شبیه سازی هست و توی بازی های این سبک، شما یه فعالیتی رو آغاز می کنی (مثلا تولید برق) و فعالیت بعد از چند دقیقه تموم میشه. و باید این چند دقیقه رو صبر کنی!

اولش روی گوشی نصب کردم و بعد از اینکه دیدم خیلی باطری گوشی مصرف میشه، تصمیم گرفتم روی کامپیوتر نصب کنم. نسخه ویندوزی داشت ولی من ویندوز نداشتم بنابراین یه Bluestacks نصب کردم و بازی رو روی اون آوردم بالا.

تو این بازی همه چی خوب هست تا وقتی که حوصله صبر کردن دارین. اگه نمی خواهید صبر کنید، باید برید سراغ تقلب.

بررسی برنامه

وقتی محل نصب برنامه رو نگاه کردم متوجه شدم برنامه هر Instance از بازی رو توی یه فایل مجزا با پسوند .sav ذخیره می کنه:

وقتی فایل رو باز کردم متوجه شدم که محتوای اون بصورت Base64 هست. ولی وقتی اون رو دیکود کردم، دیتای خوانایی بدست نیومد. ببینیم این فایل توش چی هست.

فایل apk رو دیکامپایل کردم و متوجه شدم که بازی با Unity نوشته شده و حاوی فایل های DLL دات نت هست. فایل ها رو با برنامه ILSpy باز کردم. و از سرنخی که داشتم یعنی پسوند فایل استفاده کردم. مقدار ثابت .sav رو توی فایل های دیکامپایل شده جستجو کردم:

کلاس SaveFlow شروع خوبی به نظر میاد. اون رو باز کردم.

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

توی این تابع از تابع Encrypt کلاس PersitenceManager استفاده میشه تا یه رمزنگاری انجام بشه. همه اسامی مرتبط با اون چیزی هست که دنبالش هستیم.

اینجا هم از تابع Encrypt دیگه ای توی کلاس StringCipher استفاده شده. پارامتر s_passPhrase احتمالا کلید رمزنگاری هست. ببینیم چطور مقدار دهی شده

توی همین کلاس توی تابع OnAwake این متغیر با استفاده از تابع StringCipher.GeneratePassPhrase() از مقدار ثابت PlayerData مقدار دهی میشه.

اوکی. تا همینجا برای PassPhrase کافیه. پس الان می دونیم PassPhrase رو چطوری می تونیم بسازیم.

برگردیم به تابع Encrypt

اینجا متوجه می شیم که از الگوریتم رمزنگاری Rijndael با حالت CBC استفاده شده.

برای مقدار دهی این الگوریتم نیاز به IV و کلید هست. این دو مقدار توی متغیر های vectorBytes و passphraseBytes ساخته شدن:

نکته مهم اینه که برای ساختن این مقادیر هیچ عبارت متغیری استفاده نشده. بنابراین همیشه یک IV ثابت و یک کلید ثابت خواهیم داشت.

نوشتن یک Cheat

بهتره این کدها رو توی یه برنامه C# بنویسیم ببینیم خروجی اون چی میشه:

اوکی. الان همه چیزی که لازم بود رو داریم.

 حالا با adb به Bluestacks وصل شیم تا فایل sav رو بیرون بکشیم:

$ adb connect localhost:5555
$ adb pull /sdcard/Android/data/com.bethsoft.falloutshelter/files/Vault2.sav

و با این دستور می تونیم اون رو دیکد کنیم:

 $ base64 -D Vault2.sav | openssl aes-256-cbc -d -iv '7475383967656a693334307438397532' -K 'A7CA9F3366D892C2F0BEF417341CA971B69AE9F7BACCCFFCF43C62D1D7D021F9' -out Vault2.decoded

فایل Vault2.decoded یه فایل json هست. حالا می تونید به دلخواه قسمت هایی از اون رو تغییر بدید. برای مثال می تونید مقدار پول تون رو بیشتر کنید:

vault.storage.resources.NukaColaQuantum = 100000
vault.storage.resources.Nuka = 100000

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

time = 60*60*10
timeMgr.timeGameBegin -= time * 10000000
timeMgr.time += time

یا برای خودتون ۵ تا LaunchBox اضافه کنید:

vault.LunchBoxesCount = 5;
vault.LunchBoxesByType = [0,1,2,0,3];

در آخر باید فایل json تغییر داده شده رو دوباره رمز کنیم و می زاریم سر جاش! فقط یادتون باشه که اپلیکشن بازی باید موقع این تغییر فایل ها کاملا بسته باشه.

برای این کار هم می تونید از این دو دستور استفاده کنید:

$ adb shell am force-stop com.bethsoft.falloutshelter

و باز کردن برنامه بعد از تغییر فایل:

$ adb shell monkey -p com.bethsoft.falloutshelter -c android.intent.category.LAUNCHER 1

تمرین

نکته آخر اینکه اگر مایل به داشتن یه کد cheat هستید، به عنوان تمرین، همه این دستورها رو کنار هم قرار بدین تا با یه اسکریپت

  1. اجرای بازی متوقف بشه،
  2. فایل sav رو بکشید بیرون،
  3. اون رو دیکد کنید،
  4. تغییرها رو روش انجام بدین،
  5. فایل رو رمز کنید
  6. برگردونید توی پوشه برنامه
  7. و بازی رو دوباره اجرا کنید.

فقط به خاطر داشته باشید که بعد از داشتن این کد تقلب دیگر از این بازی لذت نخواهید برد!

1 پست نوشته شده
تخصص اصلیم توی پنتست و امنیت اپلیکشین (وب/موبایل/..) هست. فعلا اینجا به‌صورت نیمه‌ناشناس می‌نویسم تا بعدا.
  • به اشتراک بگذارید:
  1. undercover گفت:

    مرسی خیلی خوب بود پنتست اپلیکیشن های موبایلی نوشته شده با فلاتر و ری اکت هم بزارین

  2. r گفت:

    عالی ادامه بده 🙂

  3. ارش گفت:

    عالی بود