PracticU

הסבר על JNI ועל קבצי SO

בלי כתוביותעם כתוביות
PracticU › קורס סייבר והאקינג ל-Android - פריצה לטלפונים ואפליקציות אנדרואיד - בודק חוסן - Mobile App Pentesting › הסבר על JNI ועל קבצי SO
מילון מושגים:
Java - שפת תכנות עילית ומונחית עצמים, הרצה על מכונה וירטואלית (JVM) ומשמשת לפיתוח מגוון יישומים.
ספרייה - אוסף קוד מוכן, כמו פונקציות ומחלקות, שמפתחים משתמשים בו בתוכניותיהם במקום לכתוב הכול מחדש.
אימות - תהליך שמוודא שהמשתמש או המערכת הם מי שהם טוענים שהם, בדרך כלל באמצעות סיסמה, קוד או תעודה.
XML - שפת סימון לייצוג נתונים מובְנים בעזרת תגיות, המשמשת להחלפת מידע בין מערכות ולקובצי הגדרות.
מעבד - יחידת העיבוד המרכזית של המחשב, שמבצעת את הפקודות של התוכניות ומנהלת את החישובים.
לייאאוט - ארגון וסידור הרכיבים החזותיים על המסך או בדף, כמו מיקום כפתורים, טקסט ותמונות.
Android - מערכת הפעלה מבוססת Linux לטלפונים ולמכשירים ניידים, שפותחה על ידי גוגל.
קוד מקור - הקוד שמפתחים כותבים בשפת תכנות, לפני הידור, המגדיר את פעולת התוכנה.

הסבר על JNI ועל קבצי SO
בשיעור זה נגלה את המחרוזת הסודית של UnCrackable Level 2, הסיסמה הסודית של אפליקציה שנבנתה כדי שנפרוץ אותה. נעקוב אחרי קוד ה Java עד שנגלה שהבדיקה האמיתית מוחבאת בתוך ספרייה מקומית, ונפתח את קובץ ה SO שלה בכלי IDA Pro ונציב בו נקודות עצירה לקראת הדיבאגינג שיבוא בהמשך.
נושאי הסיכום המוצגים בשיעור:
1. נקודת הפתיחה: מקלידים באפליקציה ניסיון פשוט ומתקבלת הודעה שזה לא טוב ושכדאי לחפש משהו אחר. השאלה היא מה היא בעצם בודקת, וכדי לגלות זאת פותחים את ה APK שלנו, זה שעבר את הטלאי, בעזרת JADX ומציצים מה קורה כשלוחצים על כפתור האימות.
2. התחלה מקובץ המניפסט: נכנסים לקובץ ה XML של AndroidManifest, קובץ חובה בכל APK, ומאתרים את המסך שמוצהר עליו מסך פעולה של מסך ראשי ומשגר. החלון הזה הוא המסך הראשון שמופעל, והוא ה MainActivity של האפליקציה.
3. טעינת ספרייה חיצונית: בתוך החלון רואים קריאה לטעינת ספרייה חיצונית, loadLibrary, וזהו קוד עזר שנכתב בשפת C או C++ ומהודר לשפת מכונה. בקטע הספריות של הקובץ רואים את הקובץ שנטען, ושימו לב כמה גרסאות יש לו, גרסה ל ARM 64 ביט, גרסה ל ARM כללית, גרסה ל x86 של 64 ביט וגרסה ל x86 רגיל, כי המערכת טוענת את הגרסה המתאימה לפי סוג המעבד.
4. המילה native: מתוך המחלקה נראית הצהרה על פונקציית init שלפני שמה נכתבה המילה native. משמעות המילה היא שהמימוש של הפונקציה אינו כאן אלא נמצא בתוך אחת הספריות שנטענו, וכאשר Java רואה מילה כזאת היא מחפשת את קוד הפונקציה בתוך הספריות הטעונות.
5. אנטומיה של הצהרת פונקציה: ההצהרה בנויה מרמת הגישה, private אומר שהפונקציה נגישה רק מתוך המחלקה הזאת ו public אומר שממחלקה אחרת אפשר לגשת אליה, מסוג הערך המוחזר כאשר void אומר שהיא לא מחזירה דבר למי שקרא לה, שם הפונקציה, הפרמטרים שהיא מקבלת בסוגריים, ואז הקוד שלה שנקרא המימוש. החלק שלפני הקוד נקרא חתימה של פונקציה, מה היא מקבלת ומה היא מחזירה, ופונקציה מוצהרת כ native היא חתימה בלי מימוש, כי המימוש יושב בספרייה החיצונית.
6. מהלך ה onCreate: פונקציית onCreate מופעלת אוטומטית ראשונה בהפעלת המחלקה, ובתוכה מבוצעת קודם כול פונקציית ה init, אחר כך בדיקה שזה לא מכשיר פרוץ, ואחר כך בדיקה שאיננו מחוברים עם דבאגר, שמנסה לצאת אם מתחברים אליה לצפות פנימה, ולבסוף פונקציית verify.
7. אימות הקשר בין הכפתור לפונקציה: חושדים שפונקציית verify קשורה לכפתור האימות, אך איך בטוחים בזה. בסוף onCreate קוראת פקודת הצגת התוכן שמציירת על המסך את מה שמתואר בקובץ התצוגה, ולכן נכנסים אל המשאבים, אל ה layout, ופותחים את קובץ ה XML של המסך הראשי, ושם בתוך הגדרת הכפתור כתוב במפורש שבלחיצה מופעלת פונקציית verify, וכך מתאמת הקשר.
8. רשימת החברים של המחלקה: במקום לחפש פונקציות ידנית ניתן להיעזר בחלונית המבנה שמציגה את כל המשתנים וכל הפונקציות של המחלקה, ושם רואים את onCreate שמופעלת ראשונה ואינה מחזירה דבר, ואת verify שגם היא אינה מחזירה דבר, ולידה הקוד של הבדיקה.
9. מהלך פונקציית verify: היא מכריזה על משתנה מחרוזת שמקבל את הטקסט שהקשנו מתוך שדה הקלט, יוצרת במשתנה חלון קופץ, מכניסה לו כותרת של הצלחה או כישלון לפי תנאי, והתנאי בודק האם הטקסט שהכנסנו הוא הנכון. אם כן מוצג הצלחה, ואם לא מוצג כישלון, ובתוך התנאי בעזרת קונטרול קליק מגיעים אל המחלקה שבודקת.
10. ההפניה אל הספרייה: בתוך מחלקת בדיקת הקוד יש פונקציית A שקוראת לפונקציית bar ומעבירה אליה את המחרוזת שקיבלה, ושוב מתגלה המילה native, כלומר קוד הפונקציה מוחבא בתוך הספרייה. המסקנה הגדולה, הסוד כלל לא נמצא ב Java, הוא מוחבא בתוך ספריית עזר חיצונית, וכדי לגלות כיצד היא משווה ומה היא בודקת צריך להיכנס אליה פנימה.
11. הכלי שלא יעזור והכלי שכן: דבאגר של Android Studio לא יתאים כאן, מפני שהוא דורש קוד מקור ולנו אין קוד מקור אלא רק קוד בשפת מכונה. נכנסים לתיקיית ה APK הפתוח שלנו, אל תיקיית ה lib, ובתוכה אל הפלטפורמה המתאימה, x86, ושם יושב קובץ ה SO שאותו רוצים לחקור.
12. IDA Pro: את הקובץ חוקרים בעזרת הכלי המפורסם ביותר בשוק, IDA Pro, שאינו חינמי ועולה כאלפי דולרים, אך כולם עובדים איתו בפועל ולכן חשוב להכיר אותו ולא לפחד ממנו. מחלצים אותו מה zip, יוצרים קיצור דרך אל שולחן העבודה ופותחים אותו, והוא שואל אם לפרק קובץ חדש.
13. פתיחת קובץ ה SO: מצביעים על קובץ ה SO שבתיקיית העבודה שלנו, והכלי שואל לפי איזה תקן לפרש אותו, ועונים לפי תקן ELF, שהוא התקן של קובצי ההרצה והספריות בעולם הלינוקס. מאשרים את הפעלתו בחומת האש, ונפתח קוד המקור של הקובץ עם הפקודות שלו. לא לפחד מהתצוגה, נעשה הכול יחד.
14. מה הכלי יודע לפרש: בזכות תקן ה ELF הוא מבין את המשמעות של החלקים השונים, למשל שזו שגרה, פונקציה שעושה דברים, שאלה פקודות אסמבלר, ושזה סתם נתונים. את הקוד אפשר להציג בתור בלוקים גרפיים שמקושרים זה לזה, או כרצף רצוף של פקודות, במעבר בין המצבים בעזרת מקש הרווח, וכשיש קריאה לפונקציה נפתח בלוק חדש.
15. איתור הפונקציות המיוצאות: בתפריט התצוגה, בתוך תתי התצוגות, פותחים את ה Exports, הפונקציות שהקובץ מייצא החוצה, אלה הפונקציות הציבוריות שמהן Java פונה אל הקובץ ומחפשת אותן. מתגלות שם שתי פונקציות, init ו bar, וליד כל אחת מהן הכתובת שלה בתוך הקובץ. נכנסים אל bar בכתובת שלה בלחיצה כפולה, ומוצג הקוד שלה עם הרגיסטרים המוכרים, ובעזרת F2 מציבים בראשית הפונקציה נקודת עצירה, breakpoint, שתעצור את התוכנה בנקודה זאת ותאפשר להציץ בזיכרון שלה.
16. החיפוש אחר השוואה: בתוך הקוד מחפשים פקודות השוואה, ומתגלה פקודת strcmp, השוואת מחרוזות, שנשמעת כאן הכי מעניינת, מפני שהיא משווה מחרוזות. מציבים גם שם נקודת עצירה בעזרת F2, ומוחקים את שאר נקודות ההשוואה שהצבנו, מפני שהשוואת המחרוזות היא זו שרוצים להציץ אליה ולראות עם מה היא משווה ומה מול מה. את ההתחברות אל המכשיר כדי להציץ פנימה נעשה בשיעור הבא, כדי שלא יצא ארוך מדי.
בשיעור זה נעקבנו מהמניפסט אל המסך הראשי, גילינו את טעינת הספרייה המקומית ואת הפונקציות המוצהרות כ native שהמימוש שלהן בפנים, אימתנו דרך קובץ התצוגה שכפתור האימות מפעיל את verify, נעקבנו עד לפונקציה המקומית שמשווה את הקוד, פתחנו את קובץ ה SO שלה ב IDA Pro לפי תקן ELF, מצאנו את הפונקציות המיוצאות שלה, הצבנו נקודות עצירה בראשית הפונקציה ועל פקודת השוואת המחרוזות שבתוכה. בשיעור הבא נעסוק בנושא עקיפה של הגנת Anti Debugging עם IDA.
SR12596HE

פרקי ההרצאה: הסבר על JNI ועל קבצי SO

  1. 00:00

    חיפוש הסוד באפליקציה

  2. 00:37

    פתיחת ה-APK ב-JADX

  3. 01:33

    טעינת ספרייה חיצונית

  4. 02:26

    הכרת המילה Native

  5. 04:15

    הכרזה על פונקציה

  6. 05:08

    פונקציות onCreate ו-Verify

  7. 06:05

    הקשר ל-XML של המסך

  8. 07:01

    קריאת קוד ה-Verify

תמלול ההרצאה: הסבר על JNI ועל קבצי SO

הטקסט המלא של הדקות הראשונות בהרצאה «הסבר על JNI ועל קבצי SO» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    שלום לכולם, בהרצאה הזו אנחנו רוצים לגלות את הסטרינג הסודי, את הסיסמה הסודית של Uncrackable Level 2, של אפליקציה שנועדה כדי שנפרוץ אותה ונגלה את הסטרינג הסודי.

  2. 00:15

    בואו נראה מה הם מחביאים, 1, 2, 3, 4, הם אומרים שזה לא טוב הסטרינג הזה, תחפש משהו אחר. השאלה היא, מה מסתתר, מה הוא בודק? בואו ניקח את התיקייה שלנו, את ה-APK שלנו שהוא אחרי הפייץ', נפתח אותו בעזרת ג'אדאקס ונציץ מה קורה פה כשלוחצים על כפתור של וריפיי.

  3. 00:35

    אני פותח את ה-APK, את האפליקציה בעזרת ג'אדאקס ורואה את קוד ג'אווה המקורי שלה. איך אנחנו מתחילים להסתכל אם אתם רוצים ממש מההתחלה לראות?

  4. 00:47

    אנחנו נכנסים לקובץ XML של אנדרואיד מניפסט XML שזה קובץ חובה ב-APK. רואים פה איפה שיש לנו מיין ולנצ'ר, איפה שיש שתי שורות האלו?

  5. 00:59

    זה אומר שהאקטיביטי הזה זה המסך הראשון שמופעל. איזה מסך זה? SG Vantage Point Uncrackable Main Activity זה המסך הראשון שמופעל.

  6. 01:13

    אז אני הולך פה SG Vantage Point Uncrackable 2 Main Activity וזה החלון שלנו. בתוך החלון הזה יש פה פונקציות שונות. קודם כל מה אני רואה? אני רואה פה שיש לנו פה לורד ליבררי, הוא טוען ספרייה חיצונית.

  7. 01:30

    מה זה אומר הספרייה החיצונית? זה בדיוק קוד עזר שכתוב ב-C או C++ ולמעשה זאת ספריית עזר עם קוד חיצוני שכתוב בשפת מכונה. אנחנו יכולים לראות את זה פה ב-Libraries, נניח ב-X86, ליפ פו, אתם רואים ספריית עזר שנקראת פו?

  8. 01:50

    הנה היא נמצאת כאן. ושימו לב, בגלל שהיא כתובה בשפת מכונה, יש לה גרסה ל-ARM 64-Bit ויש לה גרסה ל-ARM כללית. ויש לה ל-64 ביט x86 לפי סוג המעבד.

  9. 02:05

    שימו לב כמה גרסאות שונות יש לספריית העזר הזאתי, לליברירי, ספרייה דינמית שנטענת. אוקיי, אז שמנו לב שיש פה ליברירי. דרך אגב, אם אני רוצה להפעיל איזושהי פונקציה מהליברירי הזה, אנחנו נראה איך עושים את זה עוד מעט, תכף נדבר על זה לעומק.

  10. 02:24

    אז תראו שיש פה טעינה חיצונית. אוקיי, אבל לא בשביל זה באנו, סתם שמתי לב שיש לנו פה טעינה חיצונית. היינו בלנתח את הקובץ אז התחלנו מזה שיש לנו את האנדרואיד מניפסט קובץ מניפסט xml שהוא חייב להיות פה בפנים כתוב את מי להפעיל קודם וכתוב את מיין אקטיביטי הולך למיין אקטיביטי במיין אקטיביטי יש

  11. 02:47

    פונקציית a אתם רואים פונקציית a פונקציית init דרך אגב פונקציית init כתובה עם מילת native מה זה אומר מילת native לפני שם של הפונקציה זה אומר שהיא נמצאת כאן בתוך הליבררי בתוך אחד הליבריז האלו כאשר זה אותו קוד שמקומפל כמה פעמים בצורות שונות והמעבד מטעין אותו לפי מה שהוא צריך לפי סוג המעבד.

  12. 03:12

    אז במקרה שלנו אנחנו נראה שמה שנטען זה ליב פו x86 תכף אני אראה לכם איך יודעים את זה. בקיצור מילת נייטיב אומרת שפונקציית אינית נמצאת כאן ולכן אנחנו רואים לדוגמה פה שם של פונקציית a בסוגריים משהו ואז את הקוד שלה אתם רואים זה הקוד של הפונקציה.

  13. 03:32

    כאן הכרזה על פונקציה וישר נקודה פסיק אין לה קוד למה אין לה קוד כי הקוד שלה נמצא בתוך נייטיב כאן אנחנו רק מכריזים שקיימת פונקציה כזאת שג'אווה עידה כשהוא רואה מילת נייטיב הוא מחפש את הקוד שלה בתוך הליבריז שמתם לב הנה הכרזה פרייבט ווייד הכרזה על פונקציה והקוד שלה ההכרזה ממה היא מורכבת מפרייבט איזה ערך מוחזר עוד פעם פרייבט זה למי יש גישה

  14. 04:03

    האם יש גישה מבחוץ או אין גישה מבחוץ לפונקציה הזאת? האם זאת פונקציה פנימית או חיצונית? public זה אומר היא חיצונית, זה אומר שמקלאס אחר אפשר לגשת לפונקציה הזאת.

  15. 04:15

    כל הפונקציות הן בתוך קלאס. אתם רואים? כל הפונקציות הן בתוך קלאס. אז private אומר שהפונקציה הזאת נגישה רק מתוך הקלאס הזה. אי אפשר מקלאס חיצוני לגשת אליה.

  16. 04:26

    void זה אומר שהיא לא מחזירה כלום למי שקרא לה. אחרי זה הולך שם פונקציה, ואחרי זה בסוגריים מה היא מקבלת ואחרי זה הקוד שלה.

  17. 04:36

    הדבר הזה זה המימוש וזה נקרא חתימה של פונקציה. חתימה זה מה היא מקבלת ומה היא מחזירה. אותו דבר כאן, יש חתימה של פונקציה אבל בלי המימוש שלה.

  18. 04:47

    למה אין את המימוש שלה? כי המימוש נמצא בתוך נייטיב, בתוך הליברריז, בתוך הספרייה החיצונית. יפה. אז ראינו שיש לנו פה את הספרייה ה-init החיצונית, יש לנו פונקציה onCreate וזאת הפונקציה שמופעלת אוטומט דבר ראשון ופה מתבצעת קודם כל פונקציית init אחרי זה בדיקה שזה לא root אחרי זה עוד משהו מתבצע בקיצור כל זה עובד כאן הנה יש פה בדיקה שזה דבאגר האם

  19. 05:17

    אנחנו מחוברים עם דבאגר והוא מנסה לצאת אם אנחנו מתחברים עם דבאגר להציץ פנימה ויש פונקציית verify עכשיו אני חושד שהverify הזה קשור לכפתור הזה של verify אבל איך אני יכול להיות בטוח שהכפתור הזה מקושר לפונקציה הזאת אני חושד אבל לא בטוח.

  20. 05:35

    שימו לב פה, יש לי פה פונקציית onCreate שמופעלת אוטומט תמיד. בסוף של פונקציית onCreate שהיא מופעלת אוטומט כשהקלאס הזאת מופעלת, יש פה Set Content View.

  21. 05:47

    Content View זה אומר תצייר לי על המסך מה שכתוב פה בפנים. מה כתוב פה בפנים? ללכת ל-Ressources, בתוך ה-Ressources ללכת ל-Layout, בתוך ה-Layout לחפש Main Activity.

  22. 06:02

    בתוך ה-Layout, אקטיביטי מיין, סליחה. אקטיביטי, כף תחתון, מיין. הנה זה זה. זאת אומרת, פונקציית און קריאייט אומרת להציג את המידע הגרפי של מה שכתוב ב-XML הזה.

  23. 06:15

    בואו נראה מה כתוב פה ב-XML, הנה יש לנו פה בטון, ובתוך הבטון כתוב לנו און קליק פונקציית וריפיי. ככה אני יודע שבאמת מופעלת פונקציית וריפיי ולא משהו אחר, ואני יכול ללכת למיין אקטיביטי, לקלאס, ולחפש את הפונקציית וריפיי במקום לחפש אותה עדנית אני יכול לעשות פה פלוס ולראות את כל

  24. 06:36

    המשתנים ואת כל הפונקציות הנה יש לי פונקציית וריפיי פונקציית און קריאייט שמופעלת ראשונה ולא מחזירה כלום פונקציית וריפיי שלא מחזירה כלום ווייד ואני רואה פה את הקוד של הבדיקה אוקיי בוא נחפש מה קורה בבדיקה זה מה שאנחנו רוצים לראות נכון אני רואה פה את הקוד מה הוא עושה הוא מכריז על משתנה סטרינג רק משתנה אובג' מסוג סטרינג זה אומר משתנה אובג' שמקבל את

  25. 07:05

    הטקסט כנראה מכאן. הנה מה שאני מקיש כאן ה-1234 נכנס לאובג' הזה. אתם רואים לקחת מ-resources-edit-text-get-text יפה.

  26. 07:17

    אחרי זה הוא יוצר דיאלוג שזה אומר החלון הקופץ הזה הוא יוצר את החלון הקופץ במשתנה create ולתוך המשתנה קריאט הזה הוא מכניס טייטל סקסס או כישלון זאת אומרת שהוא מתחיל למלא את החלון הזה

לקורס המלא: קורס האקינג לאנדרואיד אונליין

ההרצאה הקודמת: עקיפה של זיהוי ROOT בקבצי smali

ההרצאה הבאה: עקיפה של הגנת Anti-Debugging עם IDA

הרצאות קשורות מקורסים אחרים

  • מה הם קבצי JAR
  • קבצי BAT
  • הסבר של async ועל await
  • הסבר על Regions ועל AZ ב-AWS

קורסים נוספים במסלול

  • קורס SOC - מיישם הגנת סייבר
  • קורס סייבר למתחילים - Hacking - בדיקות חוסן תשתיתי ופריצה ל-Windows 10/11 - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP
  • קורס פריצה ומבדקי חדירה לתשתית ארגונית - בדיקות חוסן מתקדמות ל-Active Directory - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP
  • קורס פריצה ומבדקי חדירה לאתרי אינטרנט - בדיקות חוסן לאתרים - Web Pentesting - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP