مقدمه

چند مدت پیش تصمیم گرفتم که جدا از معرفی و آموزش مربوط به برنامه نویسی رقابتی مطالب دیگری در رابطه با برنامه نویسی یا کارهای سیستمی در وبلاگ منتشر کنم و بعد از مشورت با دوستان در این کار مصمم تر شدم. این مقاله مربوط به مهندسی معکوس کردن APK یا خروجی نهایی برنامه آندروید به Source Code جاوا هست.
البته این روش روی استفاده از NDK برای ساخت APK که اغلب توسط Engine های بازی سازی استفاده می شود جوابگو نیست. برای مهندسی معکوس دو مرحله استخراج فایل Jar و مهندسی معکوس فایل Jar رو باید پشت سر بگذاریم.

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

مهندسی معکوس چیست؟

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

جنبه اخلاقی و شرایط استفاده

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

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


شروع کار با APK

همانطور که گفته شد شروع کار با یک خروجی قابل نصب APK است، نگذارید که این پسوند عجیب و غریب شما را فریب دهد، APK چیزی جز یک فایل Zip ساده نیست. با Rename کردن پسوند فایل به Zip میتوانید محتویات برنامه را مشاهده کنید. پوشه assets و پوشه res بنظر شما آشنا نیست؟ بله عکس ها و فایل های برنامه به صورت رمز نشده ای در این فایل زیپ قابل مشاهده هست اما برای کد های برنامه قضیه به این سادگی نیست. کد های Java در یک فایل به اسم classes.dex ذخیره شده اند.


فایل Dex چیست؟
فایل های Dex یا (Dalvik Executable) فایل های کامپایل شده برنامه های Android هستند، که از Dalvik Runtime یا Android Runtime برای اجرا شدن استفاده می کند.


تبدیل Dex به Jar

برای اینکار از یک ابزار به اسم Dex2Jar استفاده میکنیم که تنها از طریق Command Line در دسترس قرار دارد. ابزار Dex2Jar را میتوانید از SourceForge دانلود کنید. لینک
خود این برنامه به زبان جاوا نوشته شده و در سیستم عامل های مختلف با نصب Java Runtime قابل استفاده است. برای استفاده از این نرم افزار هم میتوانید فایل APK را به پوشه اصلی نرم افزار اضافه کنید و دستورات را اجرا کنید و هم میتوانید به %PATH% در Environment Variable های ویندوز آدرس فایل های اجرایی این نرم افزار را اضافه کنید. برای ساده تر شدن روش اول را انتخاب میکنیم.

برای مثال و تکمیل آموزش مهندسی معکوس APK نرم افزار Telegram را انتخاب میکنیم، البته همانطور که میدانید Telegram یک نرم افزار Open Source بوده و نیازی به مهندسی معکوس برای بدست آوردن Source نرم افزار نمیباشد.

نسخه ای از تلگرام با اسم Telegram.apk را برای مهندسی معکوس به پوشه اصلی ابزار Dex2Jar منتقل میکنیم یعنی همان پوشه ای که فایل اجرایی d2j-jar2dex.bat وجود دارد.

با مراجعه به Run و تایپ CMD در ویندوز Command Prompt را اجرا میکنیم. و با استفاده از دستور CD در این مرحله Directory فعال را به پوشه اصلی ابزار Dex2Jar تغییر میدهیم.

با استفاده از دستور زیر فایل jar را به سادگی از APK استخراج میکنیم.

d2j-dex2jar -f -o Telegram.jar Telegram.apk

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


مشاهده و تغییر فایل Jar
برای مشاهده فایل Jar میتوانید از Java Decompiler و برای تغییر در فایل Jar میتوانید از Java Bytecode Editor یا dirtyJOE استفاده کنید. این سه ابزار دارای رابط کاربری گرافیکی ساده ای میباشند.
همچنین یک نکته دیگر اینکه خود فایل Jar نیز یک فایل Zip ساده است که در آن تک تک Class ها به صورت فایل .Class وجود دارد. میتوان با Bytecode Editor های معرفی شده تک تک این .Class ها را تغییر داد.
روش کلی تر دیگر استفاده از ابزار d2j-jar2jasmin و سپس استفاده از دستور d2j-jasmin2jar میباشد که به شکل زیر امکان پذیر است.

d2j-jar2jasmin -f -o telegram_folder telegram.jar

استخراج فایل jar به صورت فایل های Jasmin در پوشه telegram_folder

d2j-jasmin2jar -f -o telegram.jar telegram_folder/

ساخت فایل jar از فایل های Jasmin موجود در پوشه telegram_folder

البته استفاده کلی از Jasmin به علت Decompile نشدن برخی اجزا و ساخته نشدن یک فایل Jar کامل از پوشه توصیه نمیشود. همانطور که می بینید تغییر در برنامه به سادگی مشاهده Source ها در Java Decompiler نیست.

تبدیل Jar به Dex
با فرمان زیر میتوانید از فایل telegram.jar یک فایل Dex بسازید.

d2j-jar2dex -f -o classes.dex telegram.jar

بروزرسانی و Sign کردن Apk
برای این کار به سادگی با تغییر نام telegram.apk به telegram.zip میتوانیم این پکیج را با classes.dex بروز رسانی کنیم، و در پایان برای Sign کردن Apk بعد از بازگرداندن پسوند از Zip به Apk از دستور زیر استفاده میکنیم.

d2j-apk-sign -f -o telgram_singed.apk telegram.apk

بدیهی است که کلید خصوصی برنامه نویس برای امضای برنامه در دسترس ما نیست و این راهکار امنیتی اندروید اینجا یک مزیت بسیار عالی محسوب میشود. این برنامه نمیتواند به صورت یک update برای نسخه های قبلی telegram ارایه شود و اگر بخواهیم این تلگرام را بر روی تلفن همراه نصب کنیم باید تلگرام اصلی قبل از نصب پاک شود.


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

اگر مشکلی برای انجام مراحل بالا داشتید در بخش نظرات مطرح نمایید.