
הטקסט המלא של הדקות הראשונות בהרצאה «הסבר על Frida Interceptor Replace» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם בהרצאות קודמות למדנו איך להתחבר לפונקציה מובנית בתוך dll בתוך ספריית עזר עכשיו אני רוצה ללמד אתכם לא איך לעשות לה attach ולתפוס את זה או בכניסה לפונקציה או ביציאה ממנה אלא ממש להחליף את התוכן של פונקציה בתוך ליבררי בתוך ספרייה דינמית ספריית עזר לקובץ apk מה שנקרא native השאלה זה איך לא לעשות attach
ולתפוס לפני ואחרי אלא ממש להחליף את הבפנו אוכו וזה הולך להיות מאוד מעניין ומאוד חשוב שתדעו לעשות כי לפעמים אנחנו ממש רוצים להחליף את הקוד וזה אפשרי אז ככה איך אנחנו מתחילים אנחנו מתחילים מזה שמתחברים לטלפון שלנו ב-adb connect כתובת ה-ip והתחברנו אליו אחרי שאנחנו מתחברים אנחנו כותבים את הסקריפט שלנו ומריצים
אותו עכשיו שימו לב מה היה לנו היה לנו כאן בתוך עאידה בעיה שהוא זיהה את הפרידה ומה עשינו לו אמרנו לו בכניסה תבדוק האם יש מילת פרידה ואם יש ביציאה תחליף אותה זה מה שעשינו מה אני אגיד לכם שאני יכול להחליף את כל הקוד של הפונקציה הזאת את כל הקוד בפנים זאת טכניקה שאתם חייבים להכיר אז מה אני עושה אני לוקח את כל מה שעשינו לפני כן וסוגר בהערה שם את
זה ככה ועושה ctrl k קונטרול K וכותב את זה שזה סולושן 1 הסולושן הראשון אוקיי זה סולושן ראשון של רוט דטקשן פרובלם בוא נעבור עכשיו לסולושן השני איך אנחנו עושים את זה דבר ראשון אני צריך למצוא בזיכרון איפה הפונקציה הזאת נמצאת אני עושה לה find export by name תמצא את האקספורט מתוך הDLL
מתוך הליבררי קובץ SO עכשיו אני לא יודע איזה קובץ זה אז אני עושה לו נעל ואומר לו תחפש את הפונקציה הזאת והוא מוצא אותה בזיכרון ועושה פוינטר. מה זה פוינטר? זה למעשה מצביע לאיפה שהיא נמצאת.
בתוך המשתנה הזאת תישמר הכתובת של המיקום שלה. עכשיו, אני הולך להחליף את המקום הזה שמסתכל לשם לפונקציה חדשה משלי. תכף תבינו, אל תדאגו.
בגלל שאני הולך להחליף קוד ולשים קוד משלי, מה שאני צריך זה לעשות ראפר מעין פונקציית עזר עוטפת שמצביעה ל-Original לקוד המקורי שהולך להיעלם.
זאת אומרת, אני עושה New Native Function, מייצר אובייקט חדש, עושה פונקציה חדשה, שמה שהיא תפעיל בפנים זה יהיה בעצם את הפונקציה המקורית.
למעשה, אני עושה כלי עזר בשביל להגיע לפונקציה המקורית, כי את הפונקציה המקורית אני הולך להחליף עוד שנייה בקוד משלי, כולם פונים לכאן לכתובת המקורית ואני הולך להחליף אותה.
ואיך אני מחליף אותה? כמו שעשינו פה interceptor attach, הפעם אני אעשה interceptor replace. אני אומר לו תעשה פה replace והוא מחליף את מה שנמצא בזיכרון בכתובת הזאת ל-new native callback.
ו-new native callback הזה במקרה שלי הוא צריך לקבל שני דברים. למה? כי זה מה שקורה כאן בפונקציה, היא מקבלת שני דברים, אם תעשו פה דאבל קליק, אתם תראו שהיא מקבלת פה לפני הפסיק משהו אחד ואחרי הפסיק את החלק השני.
אוקיי, היא מקבלת שני סטרינגים. אז זה מה שהיא מקבלת ואני ישר כאן גם סוגר את הסוגריים. אז עשיתי דבר כזה ש-interceptor.replace אני אומר לו מה להחליף ו-new.native.callback.
למעשה אני מייצר פונקציה חדשה, אובייקט חדש, new, אובייקט חדש שמחליף את הפונקציה המקורית. יהיה מיי ניו קוד אוקיי זה הולך להיות הקוד החדש שלי אוקיי רק כשאני סוגר את הסוגריים לא סתם סוגרים אותם צריך פה לכתוב את החתימה זה אומר מה מחזירים חזרה הפונקציה הזאתי ניו הפונקציה הזאתי צריכה להחזיר אינט ולקבל שני פוינטרים
שזה זה וזה היא מקבלת שני פוינטרים ומחזירה ואסור לשכוח בגלל שאנחנו צריכים להחזיר פה משהו אני אעשה פה משתנה עזר אני אקרא למשתנה עזר שלי var result שווה 0 תוצאה שווה 0 ובסוף בסוף פה אני עושה return result כדי להחזיר את התוצאה.
אוקיי, ופה אני אכתוב את הקוד שלי מה שאני רוצה. אוקיי, ומה אני רוצה? אני רוצה דבר פשוט, אני רוצה לקרוא לפונקציה מקורית אבל רק אם אין מילת פרידה, נכון?
שהוא לא יזהה שזה בעצם טלפון עם פרידה כי יש לו הגנה נגד פרידה. אני עושה if פוינטר אחד, אם פוינטר אחד אני קורא את מה שיש לו read utf-8-string includes frida אם זה כולל frida אז אני לא עושה כלום אבל