PracticU

הסבר על Frida Interceptor Replace

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

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

פרקי ההרצאה: הסבר על Frida Interceptor Replace

  1. 00:00

    Attach מול החלפת קוד

  2. 00:57

    התחברות לטלפון

  3. 01:59

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

  4. 02:52

    החלפת הפונקציה המקורית

  5. 03:45

    חתימת הפונקציה החדשה

  6. 04:46

    כתיבת התנאי בקוד החדש

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

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

  1. 00:02

    שלום לכולם בהרצאות קודמות למדנו איך להתחבר לפונקציה מובנית בתוך dll בתוך ספריית עזר עכשיו אני רוצה ללמד אתכם לא איך לעשות לה attach ולתפוס את זה או בכניסה לפונקציה או ביציאה ממנה אלא ממש להחליף את התוכן של פונקציה בתוך ליבררי בתוך ספרייה דינמית ספריית עזר לקובץ apk מה שנקרא native השאלה זה איך לא לעשות attach

  2. 00:32

    ולתפוס לפני ואחרי אלא ממש להחליף את הבפנו אוכו וזה הולך להיות מאוד מעניין ומאוד חשוב שתדעו לעשות כי לפעמים אנחנו ממש רוצים להחליף את הקוד וזה אפשרי אז ככה איך אנחנו מתחילים אנחנו מתחילים מזה שמתחברים לטלפון שלנו ב-adb connect כתובת ה-ip והתחברנו אליו אחרי שאנחנו מתחברים אנחנו כותבים את הסקריפט שלנו ומריצים

  3. 00:59

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

  4. 01:30

    זה ככה ועושה ctrl k קונטרול K וכותב את זה שזה סולושן 1 הסולושן הראשון אוקיי זה סולושן ראשון של רוט דטקשן פרובלם בוא נעבור עכשיו לסולושן השני איך אנחנו עושים את זה דבר ראשון אני צריך למצוא בזיכרון איפה הפונקציה הזאת נמצאת אני עושה לה find export by name תמצא את האקספורט מתוך הDLL

  5. 01:59

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

  6. 02:14

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

  7. 02:27

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

  8. 02:41

    זאת אומרת, אני עושה New Native Function, מייצר אובייקט חדש, עושה פונקציה חדשה, שמה שהיא תפעיל בפנים זה יהיה בעצם את הפונקציה המקורית.

  9. 02:52

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

  10. 03:05

    ואיך אני מחליף אותה? כמו שעשינו פה interceptor attach, הפעם אני אעשה interceptor replace. אני אומר לו תעשה פה replace והוא מחליף את מה שנמצא בזיכרון בכתובת הזאת ל-new native callback.

  11. 03:22

    ו-new native callback הזה במקרה שלי הוא צריך לקבל שני דברים. למה? כי זה מה שקורה כאן בפונקציה, היא מקבלת שני דברים, אם תעשו פה דאבל קליק, אתם תראו שהיא מקבלת פה לפני הפסיק משהו אחד ואחרי הפסיק את החלק השני.

  12. 03:38

    אוקיי, היא מקבלת שני סטרינגים. אז זה מה שהיא מקבלת ואני ישר כאן גם סוגר את הסוגריים. אז עשיתי דבר כזה ש-interceptor.replace אני אומר לו מה להחליף ו-new.native.callback.

  13. 03:52

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

  14. 04:21

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

  15. 04:42

    אוקיי, ופה אני אכתוב את הקוד שלי מה שאני רוצה. אוקיי, ומה אני רוצה? אני רוצה דבר פשוט, אני רוצה לקרוא לפונקציה מקורית אבל רק אם אין מילת פרידה, נכון?

  16. 04:54

    שהוא לא יזהה שזה בעצם טלפון עם פרידה כי יש לו הגנה נגד פרידה. אני עושה if פוינטר אחד, אם פוינטר אחד אני קורא את מה שיש לו read utf-8-string includes frida אם זה כולל frida אז אני לא עושה כלום אבל

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

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

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

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

  • שליחת JWT דרך Interceptor - ריאקט
  • יצירת Interceptor - עבור מסד הנתונים

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

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