ماجراجویی معکوسمهندسی یک بازی رومیزی؛ وقتی رمزنگاری پیچیده به یک URL باز ختم میشود — I reverse engineered a board game
خلاصه
یک توسعهدهنده برای دور زدن نیاز به اشتراک در اپلیکیشن بازی رومیزی Hitster، فایلهای آن را با ابزار jadx دیکامپایل کرده و مکانیزم رمزنگاری AES-GCM و کلید مشتقشده را تحلیل میکند. این چالش جذاب در نهایت با کشف یک URL عمومی بدون محافظت به پایان میرسد.
بازیهای رومیزی یا همان بوردگیمها (Board Games) امروزه با فناوریهای مدرن ادغام شدهاند. بازی «Hitster» یکی از همین محصولات است که در آن بازیکنان باید سال انتشار و نام خواننده قطعات موسیقی را حدس بزنند. اسکن بارکد پشت کارتها شما را به اپلیکیشنی هدایت میکند که موزیک را از طریق سرویسهای استریم پخش میکند. مشکل اینجا بود که این اپلیکیشن برای کار کردن نیاز به اشتراک فعال Spotify یا Apple Music داشت. این مسئله بهانهای شد تا یک توسعهدهنده کنجکاو به سراغ مهندسی معکوس نسخه اندروید این اپلیکیشن برود.
شروع کار با دیکامپایل کردن APK
برای شروع، فایل APK اپلیکیشن از وبسایتهای دانلود اپ دریافت شد و با استفاده از ابزار «jadx» کدهای جاوا آن دیکامپایل گشت. در پوشه منابع (res/raw) چندین فایل JSON وجود داشت که یکی از آنها به نام gameset_database_4.json رمزگذاری شده بود.
پس از بررسی فرمتها مشخص شد دادهها ابتدا با Base64 انکود شده و سپس با الگوریتم متقارن رمزگذاری شدهاند. جستجوی ساده عبارت «AES» در کدها منجر به پیدا شدن کلاس k43.java شد که کل منطق دیکریپت کردن را فاش میکرد.
تحلیل الگوریتم رمزنگاری و استخراج کلید
در بررسی کدهای جاوا مشخص شد که تابع f فرآیند رمزگشایی را انجام میدهد:
- دادههای ورودی ابتدا از Base64 خارج میشوند.
- طول دادهها بررسی میشود تا حداقل ۲۸ بایت باشند (۱۲ بایت برای Nonce یا IV و ۱۶ بایت برای تگ احراز هویت در الگوریتم AES-GCM).
- کلید AES به صورت مستقیم در کد قرار ندارد، بلکه از ترکیب طول باقیمانده دادهها با یک رشته مخفی (Secret String) از طریق تابع هش SHA-256 ساخته میشود.
برای پیدا کردن رشته مخفی، نویسنده با کمک اعضای جامعه کاربری زبان Rust در یک سرور Discord، به دنبال آرایههای بایت ۳۲ عضوی گشت. پس از یافتن دو آرایه خاص و اعمال عملیات XOR روی آنها، رشته نهایی به دست آمد. با داشتن این کلید و نوشتن یک اسکریپت مینیمال در زبان Rust، دادههای رمزگذاریشده با موفقیت باز شدند و بیش از ۳۱ هزار خط نگاشت بین شناسههای کارت و قطعات موسیقی استخراج گشت.
پایان خندهدار ماجرا
پس از ساعتها تلاش و تحلیل کدهای رمزنگاری، بررسی بیشتر کدهای اپلیکیشن نشان داد که تمام این دردسرها غیرضروری بوده است. با کمی بررسی الگوهای آدرسدهی HTTPS، مشخص شد که تمام این پایگاه داده به صورت کاملاً متنباز و بدون هیچگونه رمزگذاری روی دامنه اصلی شرکت سازنده قرار دارد و با یک آدرس ساده مانند https://hitster.jumboplay.com/hitster-assets/gameset_database.json قابل دسترسی است.
چرا این مقاله برای مهندسین نرمافزار اهمیت دارد؟
- امنیت از طریق مبهمسازی (Security through obscurity): این پروژه بار دیگر نشان داد که پنهان کردن دادهها با رمزنگاری سمت کلاینت (Client-side) اگر کلید یا منبع اصلی روی سرور محافظت نشود، ارزش امنیتی واقعی ندارد.
- قدرت ابزارهای مهندسی معکوس: آشنایی با نحوه کارکرد jadx، تحلیل بایت آرایهها و پیادهسازی الگوریتمهایی مانند AES-GCM در زبانهای مدرن مثل Rust، مهارتهای پایهای مفیدی برای تست نفوذ و تحلیل اپلیکیشنها هستند.
- واکنش کاربران در هکرنیوز: در بحثهای شکلگرفته در Hacker News، کاربران به جنبه سرگرمی این ماجراجویی اشاره کردند و اینکه چگونه انسانها گاهی برای تفریح و چالش، ساعتها وقت خود را صرف حل مسائلی میکنند که شاید راهحلهای بسیار سادهتری داشته باشند.
این مطلب بهصورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل