نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی

برنامه بازسازی جاوا اندروید برای ویندوز. یک راه آسان برای تغییر یک برنامه اندروید

گاهی اوقات برخی از برنامه های اندروید به دلایلی مناسب کاربر نیستند. یک مثال تبلیغات آزاردهنده است. و این طور اتفاق می افتد - همه در برنامه خوب هستند ، اما فقط ترجمه در آن یا کج است یا کاملاً وجود ندارد. یا مثلا برنامه آزمایشی است ولی راهی برای دریافت نسخه کامل وجود ندارد. چگونه شرایط را تغییر دهیم؟

معرفی

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

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

بنابراین، بسته APK که در آن کاملاً همه نرم افزارهای اندرویدی توزیع شده است چیست؟

حذف کامپایل برنامه

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

  • dex2jar - مترجم بایت کد Dalvik به بایت کد JVM که بر اساس آن می توانیم کد جاوا را دریافت کنیم.
  • jd-gui خود یک دیکامپایلر است که به شما امکان می دهد کد جاوا قابل خواندن را از بایت کد JVM دریافت کنید. از طرف دیگر، می توانید از Jad (www.varanecas.com/jad) استفاده کنید. اگرچه بسیار قدیمی است، اما در برخی موارد کد خواناتری نسبت به Jd-gui تولید می کند.

آنها باید اینگونه استفاده شوند. ابتدا dex2jar را راه اندازی می کنیم و مسیر بسته apk را به عنوان آرگومان مشخص می کنیم:

%dex2jar.sh mail.apk

در نتیجه، بسته جاوا mail.jar در دایرکتوری فعلی ظاهر می‌شود که می‌توان آن را در jd-gui برای مشاهده کد جاوا باز کرد.

تنظیم بسته های APK و دریافت آنها

یک بسته برنامه اندروید اساساً یک فایل ZIP معمولی است که برای مشاهده محتویات و باز کردن بسته بندی به ابزار خاصی نیاز ندارد. کافی است یک آرشیو داشته باشید - 7zip برای ویندوز یا کنسول unzip در لینوکس. اما این در مورد لفاف است. داخلش چیه؟ در داخل، ما به طور کلی ساختار زیر را داریم:

  • META-INF/- حاوی گواهی دیجیتالی برنامه است که سازنده آن را تأیید می کند و جمع بندی فایل های بسته.
  • res/ - منابع مختلفی که برنامه در کار خود از آنها استفاده می کند، مانند تصاویر، توصیفی از رابط و سایر داده ها.
  • AndroidManifest.xml- شرح برنامه این شامل، برای مثال، لیست مجوزهای مورد نیاز، نسخه مورد نیاز Android، و وضوح صفحه نمایش مورد نیاز است.
  • classes.dex- بایت کد برنامه کامپایل شده برای ماشین مجازی Dalvik.
  • منابع.arsc- همچنین منابع، اما از نوع متفاوت - به ویژه، رشته ها (بله، این فایل را می توان برای Russification استفاده کرد!).

فایل‌ها و دایرکتوری‌های فهرست‌شده، اگر نه در همه، شاید در اکثریت قریب به اتفاق APK‌ها هستند. با این حال، چند فایل/دایرکتوری کمتر رایج وجود دارد که ارزش ذکر کردن را دارد:

  • دارایی های- آنالوگ منابع تفاوت اصلی این است که برای دسترسی به یک منبع، باید شناسه آن را بدانید، در حالی که لیست دارایی ها را می توان به صورت پویا با استفاده از متد AssetManager.list() در کد برنامه به دست آورد.
  • lib- کتابخانه های لینوکس بومی که با کمک NDK (Native Development Kit) نوشته شده اند.

این دایرکتوری توسط سازندگان بازی استفاده می شود، جایی که موتور بازی خود را با زبان C/C++ نوشته شده و همچنین سازندگان برنامه های کاربردی با کارایی بالا (به عنوان مثال، گوگل کروم) استفاده می کنند. دستگاه را فهمید. اما چگونه می توان فایل پکیج اپلیکیشن مورد نظر را دریافت کرد؟ از آنجایی که دریافت فایل‌های APK از دستگاه بدون روت کردن امکان‌پذیر نیست (آنها در فهرست / data / app هستند)، و روت کردن همیشه توصیه نمی‌شود، حداقل سه راه برای دریافت فایل برنامه به رایانه شما وجود دارد:

  • پسوند APK Downloader برای کروم.
  • برنامه واقعی APK Leecher.
  • میزبانی فایل های مختلف و warezniki.

استفاده از کدام یک موضوع سلیقه ای است. ما ترجیح می دهیم از برنامه های جداگانه استفاده کنیم، بنابراین استفاده از Real APK Leecher را شرح می دهیم، به خصوص که در جاوا نوشته شده است و بر این اساس، حتی در ویندوز، حتی در nix نیز کار می کند.

پس از شروع برنامه، باید سه قسمت ایمیل، رمز عبور و شناسه دستگاه را پر کنید و یک زبان را انتخاب کنید. دو مورد اول ایمیل و رمز عبور حساب Google شما هستند که در دستگاه استفاده می کنید. سومین شناسه دستگاه است و با شماره گیری کد روی شماره گیر می توانید آن را دریافت کنید # #8255## و سپس خط Device ID را پیدا کنید. هنگام پر کردن، فقط باید شناسه را بدون پیشوند android وارد کنید.

پس از پر کردن و ذخیره کردن، اغلب پیام "خطا هنگام اتصال به سرور" ظاهر می شود. این ربطی به Google Play ندارد، بنابراین با خیال راحت آن را نادیده بگیرید و به دنبال بسته های مورد علاقه خود بگردید.

بررسی و اصلاح

فرض کنید بسته‌ای را پیدا کرده‌اید که به آن علاقه دارید، آن را دانلود کرده‌اید، بسته‌بندی آن را باز کرده‌اید... و وقتی سعی کردید برخی از فایل‌های XML را مشاهده کنید، با تعجب متوجه شدید که فایل یک فایل متنی نیست. چگونه آن را دیکامپایل کنیم و به طور کلی چگونه با بسته ها کار کنیم؟ آیا نصب SDK واقعا ضروری است؟ خیر، نیازی به نصب SDK ندارید. در واقع، برای تمام مراحل باز کردن، تغییر و بسته‌بندی بسته‌های APK، ابزارهای زیر مورد نیاز است:

  • بایگانی ZIPبرای باز کردن و بسته بندی؛
  • کوچک- اسمبلر/جداساز بایت کد ماشین مجازی دالویک (code.google.com/p/smali)؛
  • aapt- ابزاری برای بسته بندی منابع (به طور پیش فرض، منابع به شکل باینری برای بهینه سازی عملکرد برنامه ذخیره می شوند). همراه با Android SDK، اما می توان به طور جداگانه به دست آورد.
  • امضا کننده- ابزاری برای امضای دیجیتالی یک بسته اصلاح شده (bit.ly/Rmrv4M).

می توانید از همه این ابزارها به طور جداگانه استفاده کنید، اما این کار ناخوشایند است، بنابراین بهتر است از نرم افزارهای سطح بالاتر ساخته شده بر اساس آنها استفاده کنید. اگر از Linux یا Mac OS X استفاده می کنید، ابزاری به نام apktool وجود دارد. این به شما امکان می دهد منابع را به شکل اصلی خود باز کنید (از جمله فایل های XML باینری و arsc)، بسته را با منابع اصلاح شده بازسازی کنید، اما نمی داند چگونه بسته ها را امضا کند، بنابراین باید ابزار امضاکننده را به صورت دستی اجرا کنید. با وجود این واقعیت که ابزار به زبان جاوا نوشته شده است، نصب آن نسبتاً غیر استاندارد است. ابتدا باید خود فایل jar را دریافت کنید:

$ cd /tmp $ wget http://bit.ly/WC3OCz $ tar -xjf apktool1.5.1.tar.bz2

$ wget http://bit.ly/WRjEc7 $ tar -xjf apktool-install-linux-r05-ibot.tar.bz2

$ mv apktool.jar ~/bin $ mv apktool-install-linux-r05-ibot/* ~/bin $ export PATH=~/bin:$PATH

اگر روی ویندوز کار می کنید، پس یک ابزار عالی برای آن به نام Virtual Ten Studio وجود دارد که تمام این ابزارها (از جمله خود apktool) را نیز جمع آوری می کند، اما به جای یک رابط CLI، یک رابط گرافیکی بصری در اختیار کاربر قرار می دهد تا با آن عملیات باز کردن، جداسازی و کامپایل کردن را با چند کلیک انجام دهید. این ابزار Donation-ware است، یعنی گاهی اوقات ویندوز با یک پیشنهاد برای دریافت مجوز ظاهر می شود، اما در نهایت می توان این را تحمل کرد. توصیف آن بی معنی است، زیرا می توانید در عرض چند دقیقه رابط کاربری را درک کنید. اما apktool به دلیل کنسولی بودنش باید بیشتر مورد بحث قرار گیرد.

گزینه های apktool را در نظر بگیرید. به طور خلاصه، سه دستور اصلی وجود دارد: d (decode)، b (build) و if (install frame). اگر با دو دستور اول همه چیز مشخص است، پس فرمان سوم یعنی عملگر شرطی چه می کند؟ فریم ورک UI مشخص شده را باز می کند، که در هنگام تجزیه یک بسته سیستم مورد نیاز است.

جالب ترین گزینه های دستور اول را در نظر بگیرید:

  • -s- فایل های dex را از هم جدا نکنید.
  • -r- منابع را باز نکنید.
  • - اطلاعات اشکال زدایی را در نتایج جداسازی فایل dex وارد نکنید.
  • ---فریم مسیر- از چارچوب UI مشخص شده به جای apktool داخلی استفاده کنید. اکنون چند گزینه برای دستور b در نظر بگیرید:
  • - مونتاژ اجباری بدون بررسی تغییرات؛
  • - اگر بنا به دلایلی می خواهید از منبع دیگری استفاده کنید، مسیر aapt (ابزار ساخت بایگانی APK) را مشخص کنید.

استفاده از apktool بسیار ساده است، تنها کاری که باید انجام دهید این است که یکی از دستورات و مسیر APK را مشخص کنید، به عنوان مثال:

$ apktool d mail.apk

پس از آن، تمام فایل های بسته استخراج شده و جدا شده در فهرست پست الکترونیکی ظاهر می شوند.

آماده سازی. غیرفعال کردن تبلیغات

البته تئوری خوب است، اما اگر نمی دانیم با بسته بسته بندی نشده چه کنیم، چرا به آن نیاز است؟ بیایید سعی کنیم تئوری را به نفع خودمان اعمال کنیم، یعنی برخی از نرم افزارها را اصلاح می کنیم تا به ما تبلیغات نشان ندهد. به عنوان مثال، اجازه دهید مشعل مجازی باشد - یک مشعل مجازی. برای ما، این نرم افزار عالی است، زیرا پر از تبلیغات مزاحم است و به اندازه کافی ساده است که در وحشی کد گم نشوید.


پس با استفاده از یکی از روش های بالا اپلیکیشن را از بازار دانلود کنید. اگر تصمیم دارید از Virtuous Ten Studio استفاده کنید، کافی است فایل APK را در برنامه باز کنید و آن را باز کنید، برای آن یک پروژه ایجاد کنید (File -> New project)، سپس از منوی زمینه پروژه، Import File را انتخاب کنید. اگر انتخاب شما روی apktool بود، کافی است یک دستور را اجرا کنید:

$ apktool d com.kauf.particle.virtualtorch.apk

پس از آن، یک درخت فایل در دایرکتوری com.kauf.particle.virtualtorch ظاهر می شود، مشابه آنچه در بخش قبل توضیح داده شد، اما به جای فایل های dex و یک فایل apktool.yml، یک فهرست smali اضافی دارد. مورد اول حاوی کد جدا شده فایل dex اجرایی برنامه است، مورد دوم حاوی اطلاعات سرویس مورد نیاز apktool برای جمع آوری بسته است.

اولین جایی که باید به آن نگاه کنیم، البته AndroidManifest.xml است. و در اینجا بلافاصله با خط زیر روبرو می شویم:

به راحتی می توان حدس زد که او مسئول اعطای مجوزهای برنامه برای استفاده از اتصال اینترنت است. در واقع، اگر فقط بخواهیم از شر تبلیغات خلاص شویم، به احتمال زیاد کافی است که اپلیکیشن را از اینترنت ممنوع کنیم. بیایید سعی کنیم آن را انجام دهیم. خط مشخص شده را حذف کنید و سعی کنید نرم افزار را با استفاده از apktool کامپایل کنید:

$ apktool b com.kauf.particle.virtualtorch

فایل APK به دست آمده در دایرکتوری com.kauf.particle.virtualtorch/build/ ظاهر می شود. با این حال، نمی‌توان آن را نصب کرد زیرا امضای دیجیتال و جمع‌بندی فایل‌ها را ندارد (به سادگی یک فهرست META-INF/ ندارد). ما باید بسته را با ابزار apk-signer امضا کنیم. راه اندازی شد. این رابط از دو زبانه تشکیل شده است - در اولی (Key Generator) کلیدها را ایجاد می کنیم، در دومی (APK Signer) امضا می کنیم. برای ایجاد کلید خصوصی، فیلدهای زیر را پر کنید:

  • فایل هدف- فایل خروجی ذخیره کلید. معمولاً یک جفت کلید را ذخیره می کند.
  • کلمه عبورو تایید- رمز عبور برای ذخیره سازی؛
  • نام مستعار- نام کلید در مخزن؛
  • رمز عبور مستعارو تایید- رمز عبور کلید مخفی؛
  • اعتبار- مدت اعتبار (به سال). مقدار پیش فرض بهینه است.

فیلدهای باقی مانده، به طور کلی، اختیاری هستند - اما باید حداقل یکی را پر کنید.


هشدار

برای امضای برنامه با apk-signer، باید Android SDK را نصب کرده و مسیر کامل آن را در تنظیمات برنامه مشخص کنید.

تمام اطلاعات فقط برای مقاصد اطلاعاتی ارائه شده است. نه ویراستاران و نه نویسنده مسئول هیچ گونه آسیب احتمالی ناشی از مطالب این مقاله نیستند.

اکنون می توانید با این کلید APK را امضا کنید. در تب APK Signer، فایل جدید تولید شده را انتخاب کنید، رمز عبور، نام مستعار کلیدی و رمز عبور آن را وارد کنید، سپس فایل APK را پیدا کنید و با جسارت روی دکمه "Sign" کلیک کنید. اگر همه چیز خوب پیش برود، بسته امضا خواهد شد.

اطلاعات

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

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

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

به طور معمول، نویسندگان برنامه، کلاس های خاصی را برای نمایش تبلیغات و روش های فراخوانی این کلاس ها در طول راه اندازی برنامه یا یکی از «فعالیت های» آن (به عبارت ساده، صفحه های برنامه) ایجاد می کنند. بیایید سعی کنیم این کلاس ها را پیدا کنیم. ما به دایرکتوری smali می رویم، سپس com (در org فقط کتابخانه گرافیکی باز cocos2d وجود دارد)، سپس kauf (دقیقا آنجا، زیرا این نام توسعه دهنده است و تمام کدهای او در آنجا وجود دارد) - و اینجاست، دایرکتوری بازاریابی در داخل ما یک دسته فایل با پسوند smali پیدا می کنیم. اینها کلاس هستند و قابل توجه ترین آنها کلاس Ad.smali است که با نام آن به راحتی می توان حدس زد که تبلیغات را نمایش می دهد.

ما می‌توانیم منطق کار آن را تغییر دهیم، اما حذف احمقانه تماس‌های هر یک از روش‌های آن از خود برنامه بسیار ساده‌تر است. بنابراین، از دایرکتوری بازاریابی خارج می شویم و به دایرکتوری ذرات همسایه و سپس به virtualtorch می رویم. فایل MainActivity.smali در اینجا شایسته توجه ویژه است. این یک کلاس استاندارد اندروید است که توسط Android SDK تولید شده و به عنوان نقطه ورود به برنامه (مشابه عملکرد اصلی در C) تنظیم شده است. فایل را برای ویرایش باز کنید.

داخل کد اسمالی (اسمبلر محلی) است. به دلیل ماهیت سطح پایین آن، خواندن آن نسبتاً گیج کننده و دشوار است، بنابراین ما آن را مطالعه نمی کنیم، بلکه به سادگی همه موارد ذکر شده از کلاس Ad را در کد پیدا می کنیم و آنها را نظر می دهیم. ما در رشته "تبلیغ" در جستجو رانندگی می کنیم و به خط 25 می رسیم:

آگهی خصوصی فیلد:Lcom/kauf/marketing/Ad;

در اینجا، یک آگهی فیلد برای ذخیره یک شی از کلاس Ad ایجاد می شود. با گذاشتن علامت ## در جلوی خط نظر می دهیم. ما به جستجو ادامه می دهیم. خط 423:

نسخه جدید نسخه ۳، Lcom/kauf/marketing/Ad.

این جایی است که شی ایجاد می شود. نظر می دهیم. جستجو را ادامه می دهیم و در خطوط 433، 435، 466، 468، 738، 740، 800 و 802 فراخوانی متدهای کلاس Ad را پیدا می کنیم. نظر می دهیم. بنظر همینه پس انداز می کنیم. اکنون بسته باید دوباره مونتاژ شود و عملکرد آن و وجود تبلیغات بررسی شود. برای خلوص آزمایش، خط حذف شده از AndroidManifest.xml را برمی گردانیم، بسته را جمع آوری می کنیم، آن را امضا می کنیم و آن را نصب می کنیم.

خوکچه هندی ما تبلیغات قابل مشاهده

اوپ-پا! تبلیغات تنها زمانی که برنامه در حال اجرا بود ناپدید شد، اما در منوی اصلی باقی ماند که هنگام راه اندازی نرم افزار مشاهده می کنیم. بنابراین، صبر کنید، اما نقطه ورودی کلاس MainActivity است، و تبلیغ در حالی که برنامه در حال اجرا بود ناپدید شد، اما در منوی اصلی باقی ماند، بنابراین نقطه ورودی متفاوت است؟ برای آشکار کردن نقطه ورودی واقعی، فایل AndroidManifest.xml را دوباره باز می کنیم. و بله، شامل خطوط زیر است:

آنها به ما می گویند (و مهمتر از آن Android) که فعالیتی به نام Start باید در پاسخ به تولید یک intent (رویداد) android.intent.action.MAIN از دسته android.intent.category.LAUNCHER راه اندازی شود. این رویداد زمانی ایجاد می‌شود که روی نماد برنامه در راه‌انداز ضربه بزنید، بنابراین نقطه ورودی، یعنی کلاس Start را مشخص می‌کند. به احتمال زیاد، برنامه نویس ابتدا یک برنامه بدون منوی اصلی نوشت که نقطه ورودی آن کلاس استاندارد MainActivity بود و سپس یک پنجره (اکتیویتی) جدید حاوی یک منو و توضیح در کلاس Start اضافه کرد و به صورت دستی آن را وارد کرد. نقطه.

فایل Start.smali را باز می کنیم و دوباره به دنبال خط "Ad" می گردیم، در خطوط 153 و 155 به کلاس FirstAd اشاره می کنیم. همچنین در کد منبع وجود دارد و با قضاوت از روی نام، وظیفه نمایش تبلیغات در صفحه اصلی را بر عهده دارد. ما بیشتر نگاه می کنیم، یک نمونه از کلاس FirstAd و یک intent، با توجه به زمینه مربوط به این نمونه، وجود دارد، و سپس برچسب cond_10، که انتقال شرطی به آن دقیقاً قبل از ایجاد یک نمونه از کلاس انجام می شود. :

If-ne p1, v0, :cond_10 .line 74 new-instance v0, Landroid/content/Intent; ... :cond_10

به احتمال زیاد، برنامه به نوعی به صورت تصادفی محاسبه می کند که آیا لازم است تبلیغات در صفحه اصلی نشان داده شود یا خیر، و اگر نه، مستقیماً به cond_10 می پرد. خوب، بیایید کار او را ساده کنیم و انتقال شرطی را با یک تغییر شرطی جایگزین کنیم:

#if-ne p1, v0, :cond_10 goto:cond_10

دیگر هیچ اشاره ای به FirstAd در کد وجود ندارد، بنابراین فایل را می بندیم و مشعل مجازی خود را با استفاده از apktool دوباره جمع می کنیم. در گوشی هوشمند کپی کنید، نصب کنید، اجرا کنید. Voila، همه تبلیغات از بین رفته اند، به همه ما تبریک می گویم.

نتایج

این مقاله تنها معرفی مختصری از روش های باز کردن و اصلاح اپلیکیشن های اندروید است. بسیاری از مشکلات در پشت صحنه باقی ماندند، مانند حذف حفاظت، تجزیه کد مبهم، ترجمه و جایگزینی منابع برنامه، و همچنین اصلاح برنامه های نوشته شده با استفاده از Android NDK. با این حال، داشتن دانش اولیه، درک همه اینها فقط یک موضوع زمان است.

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

بنابراین من وظیفه داشتم برنامه را فقط با داشتن apk تغییر دهم. و کسانی که درگیر دیکامپایل برنامه ها بوده اند می دانند که کامپایل آن بعدا چقدر سخت است.

کامپایل کردن

برای Android "و ابزارهای زیر وجود دارد:
  • ApkTool برای کامپایل کردن منابع.
  • Dex2Jar برای تبدیل dex به jar.
  • JD-GUI برای دریافت منابع از jar.
  • من JAD را هم توصیه می کنم، بعضی جاها بهتر از JD-GUI دیکامپایل می شوند.
اطلاعات کافی در مورد استفاده از آنها در اینترنت وجود دارد.

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

این می تواند پایان آزمایشات با کامپایل کردن باشد، اما تنبلی موتور پیشرفت است و روش جدیدی متولد شد.

تعریف مجدد کلاس ها

بنابراین، jar یک کتابخانه است، پس چرا فقط آن را در یک پروژه جدید قرار ندهید؟ ما آن را به پوشه libs می اندازیم، از اکتیویتی اصلی ارث می بریم و آن را کامپایل می کنیم. همه چیز کار می کند، نکته اصلی این است که نام کلاس ها مطابقت ندارند، بنابراین نام بسته ها باید متفاوت باشد، در غیر این صورت BuildConfig و R تولید شده حداقل مطابقت دارند.

به این ترتیب، می‌توانید از Activity، Service، BroadcastReceiver و احتمالاً برخی کلاس‌های دیگر اعلام‌شده در مانیفست ارث بری کنید، همچنین باید نام کلاس‌های جدیدی را در مانیفست تعیین کنید، در غیر این صورت از آنها استفاده نمی‌شود.

اکنون می توانید توابع مجازی را مجدداً تعریف کنید، اما این تمام است، به خصوص که کلمه کلیدی نهایی به شما اجازه انجام این کار و ارث بردن را نمی دهد، پس بیایید ادامه دهیم.

جایگزینی کلاس ها

پس از زیپ کردن کتابخانه jar، فایل های کلاس را دریافت می کنیم، این ها کلاس های کامپایل شده هستند، توجه می کنیم که هنگام ساخت پروژه، همان فایل های کلاس در پوشه bin / classes هستند، اما اگر فایل های کتابخانه را در آنجا قرار دهیم چه می شود ...

همه چیز به این سادگی نیست، ابتدا باید پروژه را کامپایل کنید. برای استفاده از کلاس های برنامه اصلی، باید به نحوی آن را به پروژه متصل کنید، اما آن را صادر نکنید. این کار به سادگی انجام می شود: از پوشه libs، خود Eclipse کتابخانه ها را صادر می کند، بنابراین ما کتابخانه jar را به پوشه lib منتقل می کنیم و آن را به پروژه متصل می کنیم، در Eclipse این است Project-> Preferences-> Java Build Path-> Libraries-> افزودن Jars ... در برگه Order and Export باید مطمئن شوید که چک باکس تنظیم نشده باشد، زیرا ما نیازی به صادرات کتابخانه نداریم، همه چیز در فایل های کلاس خواهد بود.

اکنون مقداری کلاس از منابع برنامه دیکامپایل شده می گیریم، خطاهای کامپایل را در آن رفع می کنیم، مثلاً یک دیالوگ نشان می دهیم تا مطمئن شویم که کلاس جدید استفاده شده است. بعد، پروژه را پاک می کنیم، در Eclipse Project-> Clean است، فایل های کلاس را در پوشه bin / classes کپی می کنیم، پروژه را می سازیم و همه چیز کار می کند!

با ساخت های بعدی پروژه، نیازی به پاک کردن آن نیست، بنابراین استفاده از این روش کاملا راحت است. برای سهولت در رفع خطاها پس از کامپایل کردن، از منابع به دست آمده از JD-GUI و JAD استفاده کردم، معمولا این کافی بود.

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

نتیجه

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

با احتمال زیاد مخفی کردن تمام ردپای برنامه اصلی امکان پذیر نخواهد بود، نام کلاس های بدون فیوز مانند Activity و Service و همچنین نام بسته های آنها حفظ می شود و پس از دیکامپایل در دسترس خواهد بود. برنامه اصلاح شده، اما برای نسخه های دزدی این مشکلی ندارد، به همین دلیل ارزش محافظت از برنامه را دارد، روش های حفاظتی مشابه سایر روش های محافظت در برابر تغییرات کد هستند.

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

بنابراین من وظیفه داشتم برنامه را فقط با داشتن apk تغییر دهم. و کسانی که درگیر دیکامپایل برنامه ها بوده اند می دانند که کامپایل آن بعدا چقدر سخت است.

کامپایل کردن

برای Android "و ابزارهای زیر وجود دارد:
  • ApkTool برای کامپایل کردن منابع.
  • Dex2Jar برای تبدیل dex به jar.
  • JD-GUI برای دریافت منابع از jar.
  • من JAD را هم توصیه می کنم، بعضی جاها بهتر از JD-GUI دیکامپایل می شوند.
اطلاعات کافی در مورد استفاده از آنها در اینترنت وجود دارد.

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

این می تواند پایان آزمایشات با کامپایل کردن باشد، اما تنبلی موتور پیشرفت است و روش جدیدی متولد شد.

تعریف مجدد کلاس ها

بنابراین، jar یک کتابخانه است، پس چرا فقط آن را در یک پروژه جدید قرار ندهید؟ ما آن را به پوشه libs می اندازیم، از اکتیویتی اصلی ارث می بریم و آن را کامپایل می کنیم. همه چیز کار می کند، نکته اصلی این است که نام کلاس ها مطابقت ندارند، بنابراین نام بسته ها باید متفاوت باشد، در غیر این صورت BuildConfig و R تولید شده حداقل مطابقت دارند.

به این ترتیب، می‌توانید از Activity، Service، BroadcastReceiver و احتمالاً برخی کلاس‌های دیگر اعلام‌شده در مانیفست ارث بری کنید، همچنین باید نام کلاس‌های جدیدی را در مانیفست تعیین کنید، در غیر این صورت از آنها استفاده نمی‌شود.

اکنون می توانید توابع مجازی را مجدداً تعریف کنید، اما این تمام است، به خصوص که کلمه کلیدی نهایی به شما اجازه انجام این کار و ارث بردن را نمی دهد، پس بیایید ادامه دهیم.

جایگزینی کلاس ها

پس از زیپ کردن کتابخانه jar، فایل های کلاس را دریافت می کنیم، این ها کلاس های کامپایل شده هستند، توجه می کنیم که هنگام ساخت پروژه، همان فایل های کلاس در پوشه bin / classes هستند، اما اگر فایل های کتابخانه را در آنجا قرار دهیم چه می شود ...

همه چیز به این سادگی نیست، ابتدا باید پروژه را کامپایل کنید. برای استفاده از کلاس های برنامه اصلی، باید به نحوی آن را به پروژه متصل کنید، اما آن را صادر نکنید. این کار به سادگی انجام می شود: از پوشه libs، خود Eclipse کتابخانه ها را صادر می کند، بنابراین ما کتابخانه jar را به پوشه lib منتقل می کنیم و آن را به پروژه متصل می کنیم، در Eclipse این است Project-> Preferences-> Java Build Path-> Libraries-> افزودن Jars ... در برگه Order and Export باید مطمئن شوید که چک باکس تنظیم نشده باشد، زیرا ما نیازی به صادرات کتابخانه نداریم، همه چیز در فایل های کلاس خواهد بود.

اکنون مقداری کلاس از منابع برنامه دیکامپایل شده می گیریم، خطاهای کامپایل را در آن رفع می کنیم، مثلاً یک دیالوگ نشان می دهیم تا مطمئن شویم که کلاس جدید استفاده شده است. بعد، پروژه را پاک می کنیم، در Eclipse Project-> Clean است، فایل های کلاس را در پوشه bin / classes کپی می کنیم، پروژه را می سازیم و همه چیز کار می کند!

با ساخت های بعدی پروژه، نیازی به پاک کردن آن نیست، بنابراین استفاده از این روش کاملا راحت است. برای سهولت در رفع خطاها پس از کامپایل کردن، از منابع به دست آمده از JD-GUI و JAD استفاده کردم، معمولا این کافی بود.

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

نتیجه

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

با احتمال زیاد مخفی کردن تمام ردپای برنامه اصلی امکان پذیر نخواهد بود، نام کلاس های بدون فیوز مانند Activity و Service و همچنین نام بسته های آنها حفظ می شود و پس از دیکامپایل در دسترس خواهد بود. برنامه اصلاح شده، اما برای نسخه های دزدی این مشکلی ندارد، به همین دلیل ارزش محافظت از برنامه را دارد، روش های حفاظتی مشابه سایر روش های محافظت در برابر تغییرات کد هستند.

درباره نحوه دیکامپایل کردن برنامه‌ها برای اندروید، می‌دانید که من در مورد نحوه جمع‌آوری تمام فایل‌هایی که هنگام جداسازی برنامه در APK بیرون آمدند، توقف کردم.

انحراف غزلی

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

مونتاژ

جمع آوری مجدد چنین فایل هایی در یک APK بسیار ساده است. برای انجام این کار، باید apktool را با پرچم ساخت مناسب اجرا کنید و مسیر پوشه ای را که برنامه دیکامپایل شده داخل آن قرار دارد، ارسال کنید. به عنوان مثال، اگر یک پوشه برنامه داریم که در همان دایرکتوری apktool قرار دارد، دستور به شکل زیر خواهد بود:

پوسته

برنامه java -jar apktool.jar b

java - jar apktool .jar b app

پس از مونتاژ، فایل APK تمام شده در دایرکتوری قرار خواهد گرفت برنامه / ساخت. مرحله بعدی امضای APK است. این کار به این منظور انجام می شود که برنامه روی دستگاه هایی که اشکال زدایی در آنها ممنوع است کار کند. یعنی راه اندازی اپلیکیشن های بدون امضا در چنین دستگاه هایی ممنوع است. در اینجا می‌توانید درباره گواهی‌های دیجیتال و روش امضای فایل‌ها اطلاعات بیشتری کسب کنید.

امضای یک فایل بسیار ساده است: یک ابزار ویژه به نام signapk برای آن وجود دارد. باید با ارسال گواهی به عنوان آرگومان، سپس مسیر برنامه و در نهایت مسیر برنامه امضا شده (نتیجه جایی که باید ذخیره شود) اجرا شود. چیزی شبیه این به نظر می رسد:

پوسته

java -jar signapk.jar testkey.x509.pem testkey.pk8 *.apk apk_signed.apk

java - jar signapk .jar testkey .x509 .pem testkey .pk8 * apk apk_signed .apk

شما بپرسید از کجا می توانم چنین گواهینامه ای تهیه کنم؟ گواهی ها را می توان در اینترنت یافت. یا خودتان آن را تولید کنید. برای مثال، دستورالعمل های دقیق در مورد تنظیم و تولید تمام فایل های لازم را می توان یافت.

نتیجه

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

از همه شما متشکرم، دوباره می بینمت.

اخیراً نحوه استفاده از خدمات آنلاین رایگان را به شما گفتم (فایل APK را بررسی کنید). امروز به ادامه مبحث فایل های APK می پردازیم و به شما نشان می دهم که چگونه یک فایل APK را بصورت آنلاین دیکامپایل کنید.

اما ابتدا برای کسانی که اطلاعی ندارند به شما می گویم که دکامپایل و دیکامپایل APK چیست و در چه مواردی ممکن است نیاز باشد. کدنویس ها، IT-shnikam و دیگر حرفه ای های کامپیوتر خواندن فصل بعد توصیه نمی شود! مستقیماً به بررسی کلی خدمات آنلاین بروید.

  • پیشگفتار
  • دیکامپایل چیست
  • دیکامپایلر فایل APK آنلاین
    • سرویس آنلاین APK Decompilers
    • سرویس آنلاین Javadecompilers
    • سرویس آنلاین APK-Deguard
  • نتیجه گیری

فرآیند دیکامپایلر یا دیکامپایل چیست؟

دیکامپایلر سعی می کند باینری کامپایل شده را به نوعی کد منبع ترجمه کند. کیفیت این عملیات به طور مستقیم به ویژگی های زبان برنامه نویسی منبع بستگی دارد.

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

APK Decompilation

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

چرا باید فایل APK را دیکامپایل کنید؟

پاسخ ساده است - برای اینکه ابتدا ببینید این یا آن برنامه اندروید چگونه کار می کند و البته در صورت لزوم آن را تغییر دهید. هنگامی که یک فایل APK را دیکامپایل می کنید (اگر ابتدا مبهم نشده باشد)، مجموعه کاملی از فایل های جاوا را با کد منبع دریافت می کنید.

اکثر مردم فقط نیاز به مشاهده محتوا دارند و برای انجام این کار، ابزارهای مختلف زیادی باید بر روی کامپیوتر نصب شوند. به ماشین جاوا، اندروید SDK و ابزارهایی مانند: JavaDecompiler، dex2jar و غیره نصب شده نیاز دارد. در واقع، اگرچه دشوار است، اما صحیح ترین راه، افسوس که نیاز به دانش و مهارت از کاربر و البته سر و صدا دارد.

آیا راه ساده تری برای دیکامپایل کردن برنامه اندروید وجود دارد؟

بله حتما. با توسعه فن آوری های ابری، خدمات آنلاین رایگان ظاهر شد که اکنون در مورد آنها صحبت خواهم کرد.

APK را به صورت آنلاین با جاوا کامپایلر دیکامپایل کنید

بیایید بررسی خود را با یک سرویس آنلاین شروع کنیم. این ابزار مبتنی بر نسخه آفلاین Decompiler Jadx است.

1. به وب سایت Javadecompilers می رویم، دکمه "Browse" را کلیک می کنیم و برنامه مورد نیاز را انتخاب می کنیم.

2. بر روی دکمه "آپلود و دیکامپایل" کلیک کنید.

دیکامپایلرهای جاوا

3. پس از چند دقیقه (بسته به حجم برنامه) نتیجه نمایش داده می شود که با کلیک بر روی دکمه «ذخیره» می توانید آن را در رایانه خود دانلود کنید.


دیکامپایلرهای جاوا

4. همچنین می توانید تمام فایل های موجود در دایرکتوری ها را مشاهده کرده و هر کدام را به صورت جداگانه دانلود کنید.


دیکامپایلرهای جاوا

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

APK را بصورت آنلاین با APK-Deguard دیکامپایل کنید

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


APK Deguard

در اینجا فایل APK دیکامپایل شده در سایت به نظر می رسد.


APK Deguard

سرویس آنلاین APK-Deguard مانند سایت قبلی به شما امکان دانلود کد منبع را می دهد. با فرمت های txt، zip و apk.


APK Deguard

محدودیتی در حداکثر اندازه برنامه دانلود شده وجود دارد. حجم فایل نباید بیشتر از 16 مگابایت باشد. این سرویس بد نیست و کاملا قابل استفاده است، مدتهاست که نشانه گذاری شده است.

دیکامپایلرهای APK

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


دیکامپایلرهای APK

از نظر عملکرد، نسبت به قبلی ها پایین تر است. به شما امکان می‌دهد منابع را بدون امکان مشاهده فهرست‌ها و فایل‌های موجود در سایت، در رایانه خود دانلود کنید.

برترین مقالات مرتبط