چگونه یک فایل APK خراب را رفع کنیم و دارایی ها را استخراج کنیم
شما ساعتها را صرف دانلود یک بسته بازی ۲ گیگابایتی کردهاید، فقط برای اینکه مرورگرتان بگوید «دانلود انجام نشد» با ۹۹ درصد، یا بدتر از آن، برای Android که فریاد بزند "خطای تجزیه: مشکلی در تجزیه بسته وجود داشت." APK خراب لزوماً یک فایل مرده نیست. از آنجایی که فایلهای APK بر اساس استاندارد فشردهسازی ZIP ساخته شدهاند، اغلب میتوان آنها را تعمیر کرد، حداقل به اندازه کافی برای استخراج داراییهای گرانبها در داخل.
در زیر به آنچه واقعاً در یک APK شکسته میشود، ابزارهای تعمیری که ارزش دستیابی به آنها را دارند و اینکه چگونه مبدل XAPK ما میتواند در هنگام مواجهه با یک بسته شکسته به شما کمک کند، میپردازیم.
آناتومی فساد APK
یک APK اساسا یک آرشیو ZIP با ساختاری خاص است. فساد معمولا در یکی از سه مکان اتفاق می افتد:
- سربرگ: بایت های همان ابتدای فایل گم شده یا تغییر کرده است.
- مانیفست (XML): AndroidManifest.xml ناقص است یا از یک رمزگذاری پشتیبانی نشده استفاده می کند.
- کد DEX: بایت کد جاوا/کوتلین واقعی کوتاه شده است و برنامه را غیرقابل اجرا می کند.
روش 1: تعمیر ZIP هدلس (ساده ترین)
اگر فایل "قابل خواندن" است اما باز نمی شود، از ابزاری مانند تعمیر ZIP DiskInternals (رایگان) یا دستور خط فرمان zip -FF در Linux/macOS استفاده کنید. این ابزارها فایل را برای "امضای" فایل ها اسکن می کنند و دایرکتوری مرکزی را از ابتدا بازسازی می کنند.
کد برای کاربران ترمینال: zip -FF corrupt_app.apk --out fixed_app.apk
روش 2: رفع Zipalign/Alignment
گاهی اوقات یک APK صرفاً به این دلیل که در مرزهای 4 بایت تراز نشده است "فاسد" است. مدیریت حافظه Android به این نیاز دارد. می توانید با استفاده از ابزار زیپالاین از Android SDK این مشکل را برطرف کنید:
zipalign -v 4 input.apk output.apk
هشدار بیت پوسیدگی
اگر خود فایل DEX (classes.dex) فاقد داده باشد، هیچ مقداری از تعمیر ZIP باعث کارکرد برنامه نخواهد شد. در این مورد، تنها هدف شما باید استخراج دارایی/منابع و یافتن یک کپی جدید از برنامه باشد.
چگونه بفهمیم واقعاً چه چیزی اشتباه است
قبل از انتخاب ابزار تعمیر، خرابی را شناسایی کنید. پیام خطایی که Android (یا ابزار آرشیو شما) نشان می دهد معمولاً یک سرنخ است:
| علامتی که می بینید | معمولاً به چه معناست | اول چه چیزی را امتحان کنیم |
|---|---|---|
| "تجزیه بسته" انجام نشد (Android) | دایرکتوری مرکزی ZIP غیرقابل خواندن است، یا عدم تطابق نسخه آشکار | تعمیر هدر ZIP (روش 1) |
| "مشکلی در تجزیه بسته وجود داشت" + APK کمی کوچکتر از حد انتظار است | دانلود کوتاه شده: چند کیلوبایت آخر هرگز وارد نشد | دانلود مجدد از همان منبع؛ اگر دانلود مجدد در دسترس نباشد، ZIP تعمیر کنید |
| 7-Zip / WinRAR آن را باز می کند اما "خطای CRC" را در پرونده های جداگانه گزارش می دهد | فایل تکی داخل ZIP آسیب دیده است | همه چیز جز عضو آسیب دیده را استخراج کنید، سپس به آنچه گم شده است نگاه کنید |
| "برنامه نصب نشده است" بدون جزئیات بیشتر | اغلب عدم تطابق امضا یا مشکل همسویی، نه فساد واقعی | zipalign + بررسی مجدد امضا (روش 2) |
| بلافاصله پس از نصب با java.lang.VerifyError خراب می شود | کد بایت classes.dex آسیب دیده یا با نسخه ناسازگار است | با تعمیر قابل بازیابی نیست دوباره یک کپی تمیز دریافت کنید. |
پیاده روی بتن
تصور کنید یک APK 320 مگابایتی دارید که دانلود آن تقریباً 99٪ قطع شده است. تلفن شما با «تجزیه بسته انجام نشد» از نصب آن امتناع می کند. در اینجا نحوه حمله به آن در یک ایستگاه کاری Windows یا macOS، به ترتیبی که واقعاً چیزهایی را امتحان می کنید، آورده شده است.
مرحله 1. تأیید کنید که فایل حداقل بیشتر آنجاست
اندازه فایل را با هر چیزی که منبع تبلیغ می کند بررسی کنید. اگر فایل بهطور چشمگیری کوچکتر باشد (مثلاً 220 مگابایت به جای 320 مگابایت)، دانلود بهشدت کوتاه شده است و تعمیر بستهبندی فایدهای ندارد: بخشهای بزرگی از classes.dex یا داراییها به سادگی گم شدهاند. در این صورت دانلود را مجدداً راه اندازی کنید.
مرحله 2. ساختار ZIP را تست کنید
ترمینال را در پوشه حاوی APK باز کنید و در macOS یا Linux اجرا کنید:
unzip -t broken.apk
این ابزار هر فایل داخل بایگانی و هر گونه خطای CRC را گزارش می کند. اگر تعداد انگشت شماری از ورودی ها خطا داشته باشند و classes*.dex یا resources.arsc نباشند، شانس مناسبی برای ایجاد یک نصب کارآمد دارید.
مرحله 3. دایرکتوری مرکزی را بازسازی کنید
اگر unzip -t از خود دایرکتوری مرکزی شکایت دارد ("امضای انتهای فهرست مرکزی یافت نشد"، "1 EOCD از دست رفته")، از حالت "اصلاح" استفاده کنید:
zip -FF broken.apk --out fixed.apk
پرچم -FF به zip میگوید که فایل را برای امضای سرصفحه فایل محلی اسکن کند و دایرکتوری ورودی به ورودی را بازسازی کند. خروجی، fixed.apk، همان چیزی است که در واقع سعی می کنید نصب کنید.
مرحله 4. در صورت لزوم دوباره تنظیم کنید و دوباره امضا کنید
پس از هر تغییر ساختاری، امضای APK دیگر معتبر نیست، زیرا تغییر حتی یک بایت، بلوکهای امضای v2/v3 را باطل میکند. اگر کلید امضای خود را دارید (این برای ساختهایی که دارید مناسب است)، تراز کنید و دوباره امضا کنید:
zipalign -v 4 fixed.apk aligned.apk
apksigner sign --ks my.keystore aligned.apk
بدون کلید خودتان، تنها راه نصب فایل از طریق نصب موجود با گواهی امضای یکسان است، به این معنی که APK تعمیر شده از شخص ثالث در بالای نصب فروشگاه Play موجود نصب نخواهد شد، زیرا زنجیره امضا تغییر کرده است.
وقتی تعمیر هدف اشتباه است
ارزش آن را دارد که در مورد آنچه که "رفع" می تواند انجام دهد و نمی تواند صادق باشد:
- شما نمی توانید بایت هایی را که هرگز وارد نشده اند بازیابی کنید. اگر دانلود کوتاه شده باشد، هیچ تعمیر هدر داده های از دست رفته را بازسازی نمی کند. دوباره دانلود کنید.
- بیت پوسیدگی دائمی است. اگر فایلی در فضای ذخیرهسازی قرار داشته باشد که چند بیت داخل classes.dex برگردانده شود، مرحله تأیید بایت کد در زمان نصب آن را رد میکند و هیچ راهی برای دانستن اینکه بایتهای اصلی قرار است چقدر باشند وجود ندارد.
- فایل های تعمیر شده دارای امضاهای جدید هستند. حتی یک APK کاملاً ثابت دیگر توسط ناشر اصلی امضا نمی شود. این یک ویژگی است، نه یک باگ: مانع از لغزش کدهای مخرب مهاجم به یک برنامه محبوب و امضای مجدد به عنوان ناشر اصلی می شود.
اگر هدف شما صرفاً اجرای بازیای بود که دانلود آن در 99% از بین رفته است، مسیر کمترین مقاومت تقریباً همیشه پاک کردن فایل جزئی، آزاد کردن فضای دیسک و بارگیری مجدد از یک اتصال قابل اعتماد است. وقتی دانلود مجدد غیرممکن است، ابزارهای تعمیر می درخشند: فایلهای APK بایگانیشده قدیمی، فایلهای دریافتی از طریق یک انتقال LAN پوستهدار یا نسخههای پشتیبانگیری که منبع اصلی آنها از بین رفته است.
سوالات متداول (FAQ)
آیا می توانم آیکون ها و اسکرین شات ها را از یک APK خراب استخراج کنم؟
معمولا بله. فایلهای نماد تحت res/mipmap-* قرار دارند و دادههای اسکرینشات برای شروع در APK نادر است. حتی زمانی که دایرکتوری مرکزی آسیب می بیند، سرصفحه های فایل های فردی اغلب به اندازه کافی دست نخورده هستند که گزینه "Extract with Errors ignored" 7-Zip اکثر تصاویر را بیرون می کشد.
آیا یک APK تعمیر شده یک برنامه نصب شده را به روز می کند؟
فقط در صورتی که تعمیر امضای اصلی را حفظ کند، که معمولاً پس از تعمیر ساختاری غیرممکن است. APK تعمیر شده را به عنوان یک نصب جدید در نظر بگیرید: ابتدا نسخه قدیمی را حذف نصب کنید (اطلاعات آن را از دست خواهید داد) یا روی دستگاهی نصب کنید که هنوز برنامه را ندارد.
آیا ابزار آنلاینی وجود دارد که همه اینها را انجام دهد؟
ابزارهای مبتنی بر مرورگر میتوانند ساختار APK را بخوانند و به شما بگویند که چه چیزی خراب است (ابزار اطلاعات APK ما دقیقاً این کار را انجام میدهد)، اما در واقع بازنویسی ZIP و امضای مجدد به ابزار دسکتاپ یا سرور نیاز دارد. ما عمداً مرحله ثبت مجدد را روی سرور اجرا نمی کنیم زیرا این به معنای بارگذاری فایل شما است: وعده حفظ حریم خصوصی این سایت این است که هیچ چیز از مرورگر شما خارج نشود.
فایلهای XAPK که استخراج نمیشوند چطور؟
یک XAPK فقط یک ZIP است، بنابراین تکنیک های مشابهی اعمال می شود. zip -FF را روی آن اجرا کنید تا APK داخلی به اضافه هر فایل OBB را بازیابی کنید، سپس طوری عمل کنید که گویی یک APK آسیب دیده و یک OBB جداگانه دارید.
اگر هدف شما فقط دریافت گرافیک، صداها یا داده های OBB از دانلود ناموفق است، از 7-Zip استفاده کنید. 7-Zip تهاجمیتر از ابزار زیپ Windows Explorer است و اغلب به شما اجازه میدهد «خطاها را نادیده بگیرید» تا فایلهایی را که فقط تا حدی دانلود شدهاند استخراج کنید.
APK خود را عمیق اسکن کنید
فایل را در تحلیلگر ما آپلود کنید تا ببینید آیا ساختار معتبر است یا مانیفست قابل خواندن نیست.
آنالیز سلامت فایلنتیجه گیری
"خطای تجزیه" سیستم عاملی است که منصرف می شود. با استفاده از ابزارهای ذکر شده در بالا، کنترل را پس می گیرید. در حالی که همیشه نمیتوانید یک برنامه خراب را «تعمیر» کنید تا آن را اجرا کنید، تقریباً همیشه میتوانید بازیابی اطلاعات را در داخل آن نصب کنید. برای راهنمایی های بیشتر در مورد مدیریت فایل های حجیم، راهنمای ما در مورد ادغام Split APK یا استخراج داده های بازی OBB را بررسی کنید.