PracticU

עקיפה עם Frida הגנת Anti-Debug בתוך UnCrackable3

בלי כתוביותעם כתוביות
PracticU › קורס סייבר והאקינג ל-Android - פריצה לטלפונים ואפליקציות אנדרואיד - בודק חוסן - Mobile App Pentesting › עקיפה עם Frida הגנת Anti-Debug בתוך UnCrackable3
מילון מושגים:
דיבאג - תהליך של איתור, הבנה ותיקון תקלות בקוד, לעיתים בעזרת כלי שמאפשר לעצור ולעקוב אחר ריצת התוכנית.
ספרייה - אוסף קוד מוכן, כמו פונקציות ומחלקות, שמפתחים משתמשים בו בתוכניותיהם במקום לכתוב הכול מחדש.
סקריפט - קובץ המכיל רצף פקודות שמבוצעות על ידי מפרש, לרוב כדי להפוך משימות לאוטומטיות.
root - משתמש העל במערכות Linux, בעל הרשאות מלאות לכל פעולה. גם הרמה העליונה בעץ של תיקיות או נתונים.
תהליך - מופע של תוכנה שרצה בזיכרון, עם הקוד, הנתונים והמשאבים שהוקצו לה על ידי מערכת ההפעלה.
XML - שפת סימון לייצוג נתונים מובְנים בעזרת תגיות, המשמשת להחלפת מידע בין מערכות ולקובצי הגדרות.
הצפנה - המרת מידע לצורה בלתי קריאה בעזרת מפתח, כך שרק מי שמחזיק במפתח המתאים יכול לפענח ולקרוא אותו.
פרמטר - ערך שמועבר לפונקציה או לפקודה כקלט, ומשפיע על אופן פעולתן ועל התוצאה שהן מחזירות.

עקיפה עם Frida הגנת Anti-Debug בתוך UnCrackable3
בשיעור זה אנו מתגברים על הגנת האנטי דיבאגינג של האפליקציה, שמונעת מאיתנו להתחבר אליה עם דיבאגר. אנו מאתרים בספרייה החיצונית את הפונקציה שמבצעת את ההגנה, מגלים שהיא אינה מיוצאת החוצה ושהספרייה נטענת רק בזמן ריצה, ופותרים את הבעיה בעזרת התלבשות על פקודת טעינת הספריות בג'אווה והחלפת הפונקציה ברגע הטעינה, עוד לפני שהקוד המגן מספיק לרוץ.
נושאי הסיכום המוצגים בשיעור:
1. הבעיה: הסקריפט שלנו כבר מתגבר על זיהוי ה-ROOT ועל זיהוי ה-FRIDA והאפליקציה עובדת, אבל קיים טריק ישן שמונע התחברות עם דיבאגר.
2. מנגנון ההגנה: ברשימת התהליכים רואים שהאפליקציה מופיעה פעמיים, כי התהליך הראשי יצר תהליך בן שמתחבר אליו חזרה בתור דיבאגר. בקובץ הסטטוס של התהליך אפשר לראות את מזהה התהליך שהתחבר, וכל עוד הוא מחובר הוא חוסם דיבאגרים אחרים.
3. חילוץ הספרייה מה-APK: פותחים את קובץ ה-APK בכלי דחיסה רגיל בלי פענוח, כי קבצי ה-XML אכן יוצגו כג'יבריש בלי הכלי המיוחד שעושה גם דחיסה וגם פענוח, אבל קבצי הספריות והתמונות במשאבים אינם נוגעים על ידו ומספיק לחלץ אותם רגיל.
4. איתור פקודת ה-P-Trace: פותחים את קובץ הספרייה בכלי הפענוח ומחפשים את הפקודה שמתחברת כדיבאגר לתהליך. בעזרת רשימת ההפניות הצולבות רואים ששתי פונקציות מפנות אליה, ונכנסים לראשונה שבהן.
5. פענוח וזיהוי הפונקציה: בעזרת פקודת הפענוח לשפת C מקבלים קוד קריא, מסנכרנים בין חלון שפת המכונה לחלון השפה המפוענחת, ומזהים שמדובר בפונקציית האנטי דיבאג. היא קרויה לפי הכתובת שלה בזיכרון, ומשנים לה שם משמעותי ושומרים את בסיס הנתונים של הניתוח כדי לא לחזור על העבודה.
6. בעיה עם חיפוש לפי שם: את הפונקציה אי אפשר למצוא בעזרת חיפוש ייצוא לפי שם, כי היא פונקציה פנימית שאינה מיוצאת החוצה מהספרייה ולכן אין לה שם אלא רק מספר כתובת.
7. שרשרת ההפעלה: בעקבות ההפניות מגלים שפונקציית האתחול של הספרייה קוראת לפונקציית האנטי דיבאג, ואותה אתחול קוראים אליו מהפעילות הראשית בג'אווה כבר ביצירת המסך, תוך העברת מפתח ההצפנה, והפרמטר הראשון הוא סביבת ה-JNI.
8. חיפוש לפי כתובת: מחליפים את שיטת החיפוש בחיפוש לפי כתובת: לוקחים את כתובת הבסיס בזיכרון של המודול שנטען ומחברים אליה את ההיסט מתוך הקובץ, שהוא המיקום של הפונקציה ביחס להתחלת הקובץ, וכך מקבלים את הכתובת האמיתית של הפונקציה בזיכרון.
9. החלפת הפונקציה בזיכרון: מבצעים Interceptor Replace על הכתובת שהתקבלה ומחליפים את הקוד בקריאה חדשה שלא מקבלת כלום, לא מחזירה כלום ופשוט לא עושה דבר, ובכך מנטרלים את כל הלוגיקה המגנה.
10. כשל ראשון: בהרצה מתקבלת שגיאה שאי אפשר לחבר על ערך ריק, כי כתובת הבסיס של הספרייה לא נמצאה.
11. גילוי הסיבה: כשמריצים את הסקריפט במצב שמעצור מיד אחרי הטעינה ובודקים אילו מודולים טעונים בזיכרון, מגלים שהספרייה שלנו עדיין לא נטענה. היא נטענת רק אחרי שהפקודה המתאימה בג'אווה מתחילה להתבצע, ואנחנו עצרנו עוד לפני שבוצעה פקודה כלשהי, ולכן אי אפשר למצוא אותה בזיכרון ולהחליף אותה.
12. ניסיון המתנה ומגבלתו: פתרון ביניים אפשרי הוא המתנה של עשירית שנייה בעזרת טיימר, ואכן אחרי ההמתנה הספרייה כבר נטענת. אבל הפתרון הזה אינו טוב, כי בזמן ההמתנה האפליקציה מספיקה להריץ את קוד האתחול ולהפעיל את ההגנה, ולא ניתן לדעת בדיוק כמה זמן לחכות. הניסוי רק מוכיח שהבעיה קיימת ולא פותר אותה.
13. הפתרון האמיתי: צריך לתפוס את הרגע שבו פקודת טעינת הספרייה בג'אווה מתבצעת, להתלבש על הפונקציה הזאת, וברגע שהיא טוענת את הספרייה שלנו לבצע את ההחלפה עוד לפני שקוד האתחול מתחיל לרוץ.
14. עקיפת פקודת הטעינה: משתמשים בקוד מוכן מהאינטרנט שעוקף את פקודת טעינת הספריות בג'אווה במימוש חדש: המימוש טוען בעצמו את הספרייה שהתקבלה בפרמטר, ומיד אחרי הטעינה, עוד לפני החזרה לתוכנה הראשית, רצה הלוגיקה שלנו.
15. הלוגיקה בתוך העקיפה: הקוד בודק אם הספרייה שנטענת ברגע זה היא הספרייה שלנו. אם כן, מאתרים את כתובת הבסיס, מוסיפים את ההיסט, מדפיסים את הכתובות לבדיקה ומבצעים את ההחלפה בקוד ריק שלא עושה כלום.
16. הצלחה ואימות: בהרצה מודפס שהספרייה קיבלה כתובת והכל עובד. בבדיקה חוזרת של רשימת התהליכים מופיע רק תהליך אחד ובקובץ הסטטוס אין זיהוי של תהליך מעקב, כלומר הצלחנו להחליף את קוד האנטי דיבאגינג בפונקציה ריקה לפני שהוא הספיק לרוץ.
בשיעור הבא נעסוק בנושא ניתוח סטטי של UnCrackable3 עם IDA.
בסוף השיעור הבנו את מנגנון ההגנה מדיבאגינג, למדנו לעבוד עם פונקציות פנימיות שאינן מיוצאות ועם היסטים בזיכרון, ופתרנו את בעיית הטעינה המאוחרת של הספרייה בעזרת התלבשות על פקודת הטעינה בג'אווה והחלפת ההגנה ברגע הטעינה.
SR12605HE

פרקי ההרצאה: עקיפה עם Frida הגנת Anti-Debug בתוך UnCrackable3

  1. 00:00

    הבעיה בחיבור הדיבאגר

  2. 00:57

    הסבר על טריק התהליך הכפול

  3. 01:56

    חילוץ ספריית ה-SO

  4. 03:27

    איתור קריאות ל-PTrace

  5. 04:43

    למה אין שם לפונקציה הפנימית

  6. 05:55

    המסלול מ-Java ל-Anti-Debug

  7. 07:25

    איתור פונקציה לפי כתובת

  8. 08:55

    חיבור כתובת הבסיס וה-Offset

תמלול ההרצאה: עקיפה עם Frida הגנת Anti-Debug בתוך UnCrackable3

הטקסט המלא של הדקות הראשונות בהרצאה «עקיפה עם Frida הגנת Anti-Debug בתוך UnCrackable3» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

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

  2. 00:26

    ואתם כבר ראיתם את הטריק הזה, אני רק מזכיר לכם בקצרה אנחנו עושים ps-a לראות את כל התהליכים במחשב שמתחילים ב-uncrackable ואנחנו רואים ש-uncrackable 3 מופיע פעמיים למה? כי פרוצס ראשי שבמקרה הזה זה 7344 הוא בעצמו יצר עוד בן זה למעשה הבן שלו וזה האבא של הפרוצס אז ה-7344 יצר את הבן הזה בשביל מה הוא יצר

  3. 00:56

    את הבן? בשביל שהבן הזה יתחבר אליו חזרה וישחק אותה דבאגר. אם אנחנו ניכנס לתיקיית פרוק, שזה כמו Task Manager, לקובץ סטטוס ונחפש שם טרייס, אנחנו נראה ש-Trace Process ID, מי שהתחבר לתהליך 7.3.4.4 זה 7.3.70, הוא התחבר אליו ולא נותן לדבאגרים אחרים.

  4. 01:22

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

  5. 01:32

    אנחנו יכולים לקחת את הקובץ של APK ואפילו לעשות לו Unzip הכי פשוט בעולם. זאת אומרת, אני יכול לבוא לקובץ Uncrackable 3 APK המקורי ולפתוח אותו עם 7-Zip, עם ווין-זיפ.

  6. 01:48

    זה 7-Zip רגיל לגמרי. אני לוקח, פותח אותו, אבל לא עושה דקומפילציה. מה זה אומר לא עושה דקומפילציה? זה אומר שלעשות אנזיפ לקובץ XML זה לא טוב.

  7. 02:00

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

  8. 02:11

    ויו אולי. הנה, תראו. אתם רואים? XML הזה הוא לא קארי. למה הוא לא קארי? כי צריך גם לעשות זיפ וגם דקומפייל.

  9. 02:19

    זה מה שעושה APK-Tool. אבל קבצי ליב, ליברירי וקבצי תמונות ברסורסים, תמונות וליברירי זה הוא לא נוגע ולכן ליברירי אני יכול לקחת לחלץ לכאן וזה מספיק טוב לי אני לא צריך לעשות apk-tool d אוקיי בוא ניקח את הקובץ הזה ונפתח אותו בעזרת עאידה את הספריית

  10. 02:43

    עזר ואני רוצה לחפש שם את הדבאגר את הדבר הזה שעושה דיבאג אני עושה ctrl f לחפש ואנחנו יודעים שזה נקרא p-trace כבר דיברנו על זה p-trace זה למעשה הפקודה שמתחברת כדבאגר לתהליך כלשהו בוא נחפש איפה זה מופיע זה מופיע לי גם פה וגם פה טוב לא משנה בוא נתחיל מהראשון אני עושה רווח אני רואה

  11. 03:09

    שזה בכתובת כזאת וכזאת מתחילה פונקציה כזאת בוא נעשה פה רייט קליק ונחפש את הקרוס רפרנס ליסט קרוס רפרנס 2 זה אומר מי מפנה לפקודת p-trace מי מפנה איזה פונקציה בקוד מחפשת את זה ואני רואה שיש פה שתי פונקציות 1 ו-2, בואו ניכנס לראשונה.

  12. 03:31

    הנה, יש לי פה איזושהי פונקציה שמפנה ל-P-Trace. זה לא נוח לי לקרוא בשפת מכונה, אני לוחץ F5, והוא עושה לי פה Decoding, שזה אומר The Compiler, והופך את זה לשפת C, שזה הרבה יותר ברור לי.

  13. 03:47

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

  14. 04:10

    דיבאגינג ואיך היא נקראת 3250 למה היא נקראת 3250 כי היא נמצאת בכתובת הזאת בזיכרון אז בוא נשנה לה את השם נעשה n לשנות את השם שזה כמו right click n rename לעשות לה rename ונקרא לה anti debug זה השם שאני ממציא סתם, יכלתי להמציא לו כל שם.

  15. 04:33

    יופי, מה אני רוצה לעשות? אני רוצה להחליף את ה"בפנוכו" של הפונקציה הזאת. איך אנחנו יכולים להחליף את ה"בפנוכו"? זוכרים מה עשינו בפעם הקודמת? בפעם הקודמת עשינו interceptor replace.

  16. 04:46

    ומה החלפנו? את מה שמצאנו כאן. ומה מצאנו כאן? המשתנה הזה? מודול find export by name. שימו לב, הוא יודע לחפש by name כי זה אקספורט.

  17. 04:58

    זה פונקציות שספרייה מייצאת החוצה, אז אפשר לחפש אותם לפי שם כמו strsr בוא נראה האם לפונקציה הזאת יש שם ואמרנו לפונקציה הזאתי זה שם שאנחנו נתנו לא באמת יש לה שם למה כי לא היא מיוצאת החוצה מי מיוצא לנו החוצה אנחנו יכולים לעשות פה view sub view exports ולראות שזה הפונקציות שמיוצאות החוצה init באז באר וזה הדברים שיוצאים החוצה כמו

  18. 05:27

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

  19. 05:49

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

  20. 06:06

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

  21. 06:19

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

  22. 06:33

    המשתנה הראשון אנחנו צריכים להגיד לו שזה gni environment שזה זה אני עושה y וכותב שהדבר הזה זה gni environment ואז הוא מבין הרבה יותר טוב מה קורה פה בפנים הנה אתם רואים פתאום נהיה get byte element קסור key טוב אני לא אכנס עכשיו לפענח את הפונקציה כי אני רוצה להתעסק באנטי דיבאג וכל מה שאנחנו עושים כל השינויי שמות שאנחנו עושים

  23. 06:58

    אנחנו רוצים לשמור אז נעשה פייל save as לשמור או save לשמור את זה ואיך אנחנו נשמור את זה? בואו נעשה סייב אז. אני רוצה לשמור את זה בדסקטופ Uncrackable 3. הנה הוא עשה לי פה leapfoo.so.idb.

  24. 07:15

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

  25. 07:25

    אנחנו לא יכולים להשתמש ב-Find Export by Name, אז מה אנחנו נעשה? אנחנו נעשה Find by Address. בואו נעשה פה אנטי דיבאג.

  26. 07:36

    ואני מפעיל לא find by name, אתם רואים, אלא find by address. עכשיו, זה אי אפשר ישירות למצוא את הכתובת שלה. אנחנו צריכים לקחת את הכתובת הבסיס בזיכרון של המודול שלנו, ולהוסיף לכתובת בזיכרון את הכתובת של הפונקציה, שזה 3250.

  27. 07:59

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

  28. 08:09

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

  29. 08:31

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

  30. 08:42

    אני עושה פה פונקציית add, ואומר הכתובת האמיתית של anti-debug current memory address, זאת אומרת הזיכרון האמיתי זה ה-base הזה, ועוד תיקח את ה-base הזה ותוסיף לו את ה-offset.

  31. 08:58

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

  32. 09:20

    את str str נחליף את האנטי דיבאג אוקיי אני עושה פה interceptor replace של הכתובת הנוכחית בניו נייטיב callback function ובניו נייטיב callback אני יוצר לו פונקציה חדשה שלא מקבלת כלום ולא מחזירה כלום ולא מקבלת כלום.

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

ההרצאה הקודמת: הסבר על Frida Interceptor Replace

ההרצאה הבאה: ניתוח סטטי של UnCrackable3 עם IDA

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

  • Debug View
  • עקיפה של AMSI
  • מצב Debug מצב Release
  • דיבאג בג'אווה - Debug Mode

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

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