در این سری از آموزشها به معرفی مهندسی معکوس و روشهای اجرای آن میپردازیم:
قسمت اول: مهندسی معکوس چیست؟
قسمت دوم: مهندسی معکوس فایلهای پکیج اندروید (APK Files.)
قسمت سوم: روشهای مقابله با مهندسی معکوس فایلهای پکیج اندروید (APK Files.)
در قسمت دوم آموزش به دیکامپایل کردن (فرایند استخراج سورس کد از فایل کامپایل شده) یک پکیج نرمافزاری اندروید (APK) میپردازیم.
فایل پکیج اندروید تنها یک بسته فشرده شده است که شامل منابع برنامه، فایل مانیفست، کتابخانههای اضافی و فایل classes.dex میباشد. پس به راحتی میتوان محتوای درون آن را به کمک نرمافزارهای فشرده سازی مانند Winrar مشاهده کرد.
ابتدا نرم افزارها و بستههای زیر را دانلود کنید:
- dex2jar-0.0.9.15
- jd-gui-0.3.6.windows
- apktool1.5.2
- apktool-install-windows-r05-ibot.tar
- framework-res.apk
- BBCNews.apk
بستههای بالا را از حالت فشرده خارج کرده و به ادامه آموزش توجه کنید.
برای اجرای مهندسی معکوس و دیکامپایل کردن از یک پکیج تمرینی (BBCNews.apk) استفاده میکنیم تا مطالب توضیح داده شده به شکل عملی نشان داده شود.
راهنمای گامبهگام:
- پسوند فایل BBCNews.apk را به zip. تغییر داده و محتوای درون آن را استخراج میکنیم و دوباره به apk. تغییر میدهیم.
- محتوای بسته dex2jar-0.0.9.15 را استخراج کرده و بوسیله پنجره فرمان یا CMD دستور زیر را اجرا میکنیم.
dex2jar d ../classes.dex
- خروجی دستور بالا یک فایل با پسوند Jar. است که یا استفاده از ابزار jd-gui-0.3.6.windows میتوانیم به کلاسهایی که طی فرایند دیکامپایل بدست آمدهاند دسترسی پیدا کرد.
- ابتدا نرمافزار را اجرا کرده و از منوی فایل classes_dex2jar.jar را باز میکنیم. همانطور که در تصویر زیر میبینید تمام سورسهای جاوا استخراج شده و تنها کافی است از منوی فایل Save All Sources را برای ذخیره آنها کلیک کنید.
- تا اینجا توانستهایم تمام سورس کدهای جاوا را بازیابی کنیم اما فایل مانیفست بصورت کامپایل شده هیچ اطلاعات خاصی را در اختیار ما قرار نمیدهد. پس در مرحله بعد مانیفست را دیکامپایل میکنیم.
- از پکیجهای معرفی شده بالا apktool1.5.2 را استخراج کرده و از پنجره دستورات یا CMD دستورات زیر را به ترتیب اجرا میکنیم.
apktool.jar if framework-res.apk
apktool.jar d BBCWorld.apk
- و در آخر فایل مانیفست نیز بدست میآید. حالا کافیست سورس کدها و فایل مانیفست را در پوشهای قرار داده و به داخل کیت توسعه اندروید Import کنید و از پروژه خود لذت ببرید!
نمومه کد فایل:
<?xml version="1.0" encoding="utf-8"?> <manifest android:versionCode="1" android:versionName="1.0" android:installLocation="auto" package="bbc.mobile.news.ww" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <application android:label="@string/app_name" android:icon="@drawable/icon" android:name="bbc.mobile.news.app.ww.BBCNewsWwApp" android:debuggable="false"> <service android:name="com.medialets.advertising.AdManagerService" /> <service android:label="@string/bbc_news_update_service_label" android:name=".service.UpdateService" /> <activity android:label="@string/app_name" android:name=".HomeWwActivity" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:label="@string/app_name" android:name=".ArticleActivity" android:screenOrientation="portrait"> <intent-filter /> </activity> <activity android:label="@string/app_name" android:name=".PersonalisationActivity" android:screenOrientation="portrait"> <intent-filter /> </activity> <activity android:label="@string/app_name" android:name="bbc.mobile.news.VideoActivity" android:screenOrientation="landscape"> <intent-filter /> </activity> <activity android:label="@string/app_name" android:name=".SettingsActivity" android:screenOrientation="portrait"> <intent-filter /> </activity> <activity android:label="@string/app_name" android:name=".PrivacyActivity" android:screenOrientation="portrait"> <intent-filter /> </activity> <activity android:label="@string/app_name" android:name=".RemoteInfoViewActivity" android:screenOrientation="portrait"> <intent-filter /> </activity> <receiver android:name="bbc.mobile.news.receiver.ConnectivityReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver> <receiver android:name="bbc.mobile.news.ww.receiver.BootReceiverWw"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver> <receiver android:label="BootReceiver" android:name="bbc.mobile.news.ww.receiver.BootReceiverWw" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <receiver android:name=".receiver.AlarmReceiverWw" /> </application> <uses-sdk android:minSdkVersion="4" android:maxSdkVersion="10" /> </manifest>
مهندسی معکوس و دیکامپایل کردن پکیجهای اندروید همیشه نتایج دلخواه و ایدهآل ارایه نمیکند چون متغییرها و کلاسهها در هنگام کامپایل تغییر نام داده میشوند و کشف روابط بین آنها زمانبر است.