הסבר בסיסי על מבנה התיקיות והקבצים בתוך קובץ APK (אפליקציית אנדרואיד), להבנה ראשונית איך לבצע Reversing לאפליקציות אנדרואיד
בעבר כתבתי את המדריך הזה בפורום מתמחים טופ. עכשיו פרסמתי מדריך בסיסי לתרגום קבצי APK (ניתן לרכישה כאן) אז החלטתי גם לפרסם את ההסבר הכללי הזה על מבנה קובץ APK.
אז בואו נתחיל.
שלב ראשון - מבנה קובץ הAPK
קבצים מסומנים בכחול, תיקיות בכתום
AndroidManifest.xml: קובץ זה מכיל מידע קריטי על האפליקציה כמו שם החבילה, פעילויות (activities), הרשאות (permissions) ועוד.
META-INF/: תיקיה זו מכילה קבצים הקשורים לאימות והחתימה הדיגיטלית של האפליקציה.
MANIFEST.MF: קובץ זה מכיל רשימה של כל הקבצים ב-APK עם חתימותיהם. CERT.RSA ו-CERT.SF: קבצים אלו מכילים את החתימה הדיגיטלית של האפליקציה.
lib/: תיקיה זו מכילה ספריות קוד מקוריות (native libraries) שתומכות בארכיטקטורות שונות של מעבדים כמו ARM, x86 ועוד. assets/: תיקיה זו מכילה קבצים נוספים שמשתמשי האפליקציה יכולים לגשת אליהם בזמן ריצה.
res/: תיקיה זו מכילה את כל משאבי האפליקציה כמו קבצי תמונה, קבצי XML, פריסות (layouts) ועוד.
classes.dex: קובץ זה מכיל את הקוד הבינארי של האפליקציה בפורמט Dalvik Executable (DEX). או בקיצור - SMALI.
resources.arsc: קובץ זה מכיל מידע על המשאבים של האפליקציה בצורה מכווצת. (ועורכי הAPK מבוססי APKTOOL, מחלצים את התיקיות והקבצים שבתוכו לתוך תיקיית res)
שלב שני - תיקיות lib וassets
תיקיות אלו לא נמצאות בכל האפליקציות, בתיקיית lib יהיו ספריות קוד שבהם האפליקציה עושה שימוש. בתיקיית assets - קבצים חיצוניים, למשל קבצי טקסט, שהאפליקציה עושה בהם שימוש.
שלב שלישי - תיקית res
תיקיית res (קיצור של Resources) מכילה את כל המשאבים הסטטיים שהאפליקציה שלך משתמשת בהם. המשאבים האלו יכולים לכלול פריסות ממשק משתמש, מחרוזות, תמונות, ערכים שונים ועוד. להלן פירוט על התיקיות השונות הנמצאות בתיקיית res ועל סוגי הקבצים שהן מכילות:
שימו לב! אני מתאר כאן את תיקיית res לאחר פריקת קובץ הresources.arsc לתוכה. בMT MANAGER התיקיות השייכות אליו יהיו בתוכו, ולא בתיקיית res.
- res/layout תיקיה זו מכילה קבצי XML המגדירים את הפריסות (layouts) של המסכים באפליקציה. כל קובץ XML מגדיר את מבנה רכיבי הממשק על המסך, בהתאם לאקטיביטי אליו הוא משוייך.
דוגמה לקובץ פריסה (activity_main.xml):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me" />
</LinearLayout>
- res/values תיקיה זו מכילה קבצי XML המגדירים ערכים שונים כמו מחרוזות, צבעים, מימדים, סגנונות ועוד.
דוגמאות לקבצים בתיקיה res/values: בתוך תיקיה זו, יהיו תיקיות של השפות השונות, ובתוכם קבצי הXML השונים. values-en - אנגלית values-ar - ערבית values-iw - עברית. לפעמים מוסיפים גם את האיזור values-en-rUS - אנגלית ארה”ב values-iw-rIL - עברית ישראל
strings.xml: מכיל מחרוזות טקסט. (קבצי השפה)
<resources>
<string name="app_name">MyApp</string>
<string name="hello_world">Hello, World!</string>
</resources>
colors.xml: מכיל הגדרות צבעים.
<resources>
<color name="primaryColor">#FF6200EE</color>
<color name="secondaryColor">#FF03DAC5</color>
</resources>
dimens.xml: מכיל הגדרות מימדים.
<resources>
<dimen name="default_margin">16dp</dimen>
<dimen name="default_text_size">14sp</dimen>
</resources>
styles.xml: מכיל הגדרות סגנונות.
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/primaryColor</item>
<item name="colorPrimaryDark">@color/primaryColorDark</item>
<item name="colorAccent">@color/accentColor</item>
</style>
</resources>
- res/drawable תיקיה זו מכילה קבצי גרפיקה כמו תמונות (PNG, JPG) וקבצי XML המגדירים צורות וציורים מורכבים.
דוגמה לקובץ צורה (shape.xml):
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FF6200EE"/>
<corners android:radius="8dp"/>
</shape>
-
res/mipmap תיקיה זו מכילה אייקונים של האפליקציה בגדלים שונים עבור מכשירים שונים. בדרך כלל ישנם תת-תיקיות כמו mipmap-mdpi, mipmap-hdpi, mipmap-xhdpi, mipmap-xxhdpi ו-mipmap-xxxhdpi.
-
res/anim ו-res/animator תיקיות אלו מכילות קבצי XML המגדירים אנימציות ואנימטורים שמשתמשים בהם באפליקציה.
דוגמה לקובץ אנימציה (fade_in.xml):
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="500"/>
- res/menu תיקיה זו מכילה קבצי XML המגדירים תפריטים (menus) שמופיעים באפליקציה, כגון תפריטי אפשרויות ותפריטי קונטקסט.
דוגמה לקובץ תפריט (menu_main.xml):
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_settings"
android:title="@string/action_settings"
android:orderInCategory="100"
android:showAsAction="never" />
</menu>
- res/xml תיקיה זו מכילה קבצי XML כלליים שניתן להשתמש בהם להגדרות שונות של האפליקציה, כמו תצורות, הגדרות אבטחה ועוד.
דוגמה לקובץ תצורה (preferences.xml):
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<EditTextPreference
android:key="username"
android:title="Username"
android:summary="Enter your username" />
</PreferenceScreen>
- res/raw תיקיה זו מכילה קבצים גולמיים (raw) שאינם מפוענחים מראש. ניתן להשתמש בקבצים אלו כקבצי נתונים שמישומים באפליקציה, כמו קבצי אודיו, וידאו, טקסט ועוד.
דוגמה לשימוש בקובץ גולמי:
<mediaPlayer>
android:src="@raw/sample_audio"
</mediaPlayer>
שלב רביעי - קובץ הdex
השלב המסובך ביותר. בגדול, אם נפרק אותו עם APK TOOL, או עם DEX EDITOR PLUS בMT MANAGER. נגיע לקוד הsmali של אקטיבטי לפי הנתיב שלו. למשל כאן מסומן הקובץ של האקטיביטי MmsApp באפליקציה שהPacakgeName הוא com.android.mms
קוד הSmali הוא בעצם קוד הJava (או הקוטלין) המקומפל של האפליקציה. להסבר יותר מפורט על Reversing של אפליקציות ועריכה של הSmali, ראו את הפוסט הזה שלי.