
הטקסט המלא של הדקות הראשונות בהרצאה «עקיפה עם Frida הגנת Anti-Debug בתוך UnCrackable3» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, בהרצאה הזו אני רוצה להתגבר על הגנה של אנטי דיבאגינג ב-uncrackable 3 אני רוצה להראות לכם מה מקור הבעיה, אני מפעיל את הסקריפט שלנו הוא מתגבר על רוט דטקשן ועל פרידה דטקשן ואנחנו יכולים לעשות 1, 2, 3, 4 ולבדוק את הקוד, האפליקציה עובדת אבל יש להם טריק ישן שאני לא יכול להתחבר עם דיבאגר
ואתם כבר ראיתם את הטריק הזה, אני רק מזכיר לכם בקצרה אנחנו עושים ps-a לראות את כל התהליכים במחשב שמתחילים ב-uncrackable ואנחנו רואים ש-uncrackable 3 מופיע פעמיים למה? כי פרוצס ראשי שבמקרה הזה זה 7344 הוא בעצמו יצר עוד בן זה למעשה הבן שלו וזה האבא של הפרוצס אז ה-7344 יצר את הבן הזה בשביל מה הוא יצר
את הבן? בשביל שהבן הזה יתחבר אליו חזרה וישחק אותה דבאגר. אם אנחנו ניכנס לתיקיית פרוק, שזה כמו Task Manager, לקובץ סטטוס ונחפש שם טרייס, אנחנו נראה ש-Trace Process ID, מי שהתחבר לתהליך 7.3.4.4 זה 7.3.70, הוא התחבר אליו ולא נותן לדבאגרים אחרים.
איך אנחנו פותרים את הבעיה הזאת? מה אפשר לעשות? בואו נסגור את הכל, אני רוצה להתחיל איתכם מחדש שתראו מה אנחנו יכולים לעשות וללמד אתכם משהו חדש.
אנחנו יכולים לקחת את הקובץ של APK ואפילו לעשות לו Unzip הכי פשוט בעולם. זאת אומרת, אני יכול לבוא לקובץ Uncrackable 3 APK המקורי ולפתוח אותו עם 7-Zip, עם ווין-זיפ.
זה 7-Zip רגיל לגמרי. אני לוקח, פותח אותו, אבל לא עושה דקומפילציה. מה זה אומר לא עושה דקומפילציה? זה אומר שלעשות אנזיפ לקובץ XML זה לא טוב.
אני לא הצליח לראות אותו, תראו. אני אעשה פה ככה, אני אראה פה ג'יבריש. אתם תראו תכף המון המון המון ג'יבריש. הוא לא באמת ייפתח לנו. אנחנו לא נראה את הטקסט.
ויו אולי. הנה, תראו. אתם רואים? XML הזה הוא לא קארי. למה הוא לא קארי? כי צריך גם לעשות זיפ וגם דקומפייל.
זה מה שעושה APK-Tool. אבל קבצי ליב, ליברירי וקבצי תמונות ברסורסים, תמונות וליברירי זה הוא לא נוגע ולכן ליברירי אני יכול לקחת לחלץ לכאן וזה מספיק טוב לי אני לא צריך לעשות apk-tool d אוקיי בוא ניקח את הקובץ הזה ונפתח אותו בעזרת עאידה את הספריית
עזר ואני רוצה לחפש שם את הדבאגר את הדבר הזה שעושה דיבאג אני עושה ctrl f לחפש ואנחנו יודעים שזה נקרא p-trace כבר דיברנו על זה p-trace זה למעשה הפקודה שמתחברת כדבאגר לתהליך כלשהו בוא נחפש איפה זה מופיע זה מופיע לי גם פה וגם פה טוב לא משנה בוא נתחיל מהראשון אני עושה רווח אני רואה
שזה בכתובת כזאת וכזאת מתחילה פונקציה כזאת בוא נעשה פה רייט קליק ונחפש את הקרוס רפרנס ליסט קרוס רפרנס 2 זה אומר מי מפנה לפקודת p-trace מי מפנה איזה פונקציה בקוד מחפשת את זה ואני רואה שיש פה שתי פונקציות 1 ו-2, בואו ניכנס לראשונה.
הנה, יש לי פה איזושהי פונקציה שמפנה ל-P-Trace. זה לא נוח לי לקרוא בשפת מכונה, אני לוחץ F5, והוא עושה לי פה Decoding, שזה אומר The Compiler, והופך את זה לשפת C, שזה הרבה יותר ברור לי.
תסתכלו טוב-טוב מה שהוא לקח. הוא לקח את הפקודות האלו של שפת מכונה והפך אותן לשפת C, שזה יותר קריא. אני גם רוצה לסנכרן את שני החלונות, כדי שאם אני עכשיו לוחץ כאן זה זז לכאן טוב אני רואה שיש פה באמת p-trace וזאת באמת פונקציה מעצבנת אותי שכל מה שהיא עושה בעולם הזה היא מונעת ממני לעשות
דיבאגינג ואיך היא נקראת 3250 למה היא נקראת 3250 כי היא נמצאת בכתובת הזאת בזיכרון אז בוא נשנה לה את השם נעשה n לשנות את השם שזה כמו right click n rename לעשות לה rename ונקרא לה anti debug זה השם שאני ממציא סתם, יכלתי להמציא לו כל שם.
יופי, מה אני רוצה לעשות? אני רוצה להחליף את ה"בפנוכו" של הפונקציה הזאת. איך אנחנו יכולים להחליף את ה"בפנוכו"? זוכרים מה עשינו בפעם הקודמת? בפעם הקודמת עשינו interceptor replace.
ומה החלפנו? את מה שמצאנו כאן. ומה מצאנו כאן? המשתנה הזה? מודול find export by name. שימו לב, הוא יודע לחפש by name כי זה אקספורט.
זה פונקציות שספרייה מייצאת החוצה, אז אפשר לחפש אותם לפי שם כמו strsr בוא נראה האם לפונקציה הזאת יש שם ואמרנו לפונקציה הזאתי זה שם שאנחנו נתנו לא באמת יש לה שם למה כי לא היא מיוצאת החוצה מי מיוצא לנו החוצה אנחנו יכולים לעשות פה view sub view exports ולראות שזה הפונקציות שמיוצאות החוצה init באז באר וזה הדברים שיוצאים החוצה כמו
goodby אבל כל שאר הפונקציות שהן לא מיוצאות החוצה אין להם שם כי יש להם רק רק מספר כי זאת פונקציות פנימיות זה קוד פנימי והוא לא אקספורט החוצה אז השם שלו הוא כביכול סודי פנימי דרך אגב אז איך מפעילים את הפונקציה שהיא לא מיוצאת החוצה אם נחזור לכאן לחלון הזה דרך אגב יש לנו גם
פה אקספורט כן אם נחזור לחלון הזה אז איך אנטי דיבאג הזה מופעל מי מפעיל אותו נעמוד כאן נעשה עוד פעם jump to cross reference ונראה שיש לנו פה פונקציית אינית פונקציית אינית הזאת קוראת לאנטי דיבאג שלנו.
ומי קורא לפונקציית האינית הזאת? אתם זוכרים פה בג'אווה, במיין אקטיביטי, אנחנו יכולים לראות ב-onCreate שקוראים לפונקציית אינית ומעבירים לה גם את הקסור קי.
דרך אגב, זה מעניין שמעבירים פה קסור קי. אנחנו נצטרך את זה אחרי זה. פה זה הדבר, זה למעשה הקסור קי. אפשר לקרוא לזה קסור קי, קסור קי מג'אווה שהגיע אלינו.
המשתנה הראשון אנחנו צריכים להגיד לו שזה gni environment שזה זה אני עושה y וכותב שהדבר הזה זה gni environment ואז הוא מבין הרבה יותר טוב מה קורה פה בפנים הנה אתם רואים פתאום נהיה get byte element קסור key טוב אני לא אכנס עכשיו לפענח את הפונקציה כי אני רוצה להתעסק באנטי דיבאג וכל מה שאנחנו עושים כל השינויי שמות שאנחנו עושים
אנחנו רוצים לשמור אז נעשה פייל save as לשמור או save לשמור את זה ואיך אנחנו נשמור את זה? בואו נעשה סייב אז. אני רוצה לשמור את זה בדסקטופ Uncrackable 3. הנה הוא עשה לי פה leapfoo.so.idb.
יצר לי את הקובץ כדי שלא נצטרך לעשות עוד פעם. טוב, מה אנחנו רוצים לעשות, חברים? אנחנו רוצים למצוא את הפונקציה הזאת בזיכרון ולהחליף אותה.
אנחנו לא יכולים להשתמש ב-Find Export by Name, אז מה אנחנו נעשה? אנחנו נעשה Find by Address. בואו נעשה פה אנטי דיבאג.
ואני מפעיל לא find by name, אתם רואים, אלא find by address. עכשיו, זה אי אפשר ישירות למצוא את הכתובת שלה. אנחנו צריכים לקחת את הכתובת הבסיס בזיכרון של המודול שלנו, ולהוסיף לכתובת בזיכרון את הכתובת של הפונקציה, שזה 3250.
אנחנו צריכים לראות לאן הוא הטעין אותה בזיכרון, לאן הוא עשה לזה לואוד, לאן הוא הטעין אותו בזיכרון, ולהוסיף לזה 3250 שזה בעצם ההתחלה של הפונקציה שלנו.
וכך נדע להגיע לכתובת שלה. וזה נקרא אופסט. אופסט זה למעשה ביחס להתחלה. אז אני עושה פה משתנה עזר שקוראים לו אנטי דיבאג אופסט, וזה חייב להתחיל ב-3250 כי זה איפה שהיא נמצאת בזיכרון, כי היא נמצאת באופסט 3250 והוא לוקח את כל הקובץ הזה וטוען אותו לזיכרון בזמן ההפעלה.
אז אני עושה שני דברים, אני מוצא לאן הוא הטעין את כתובת הבסיס של כל הפונקציה, לאן הוא הכניס אותה, ומוסיף לזה 3250. עכשיו, איך אני מוסיף? אני עושה פונקציית add.
אני עושה פה פונקציית add, ואומר הכתובת האמיתית של anti-debug current memory address, זאת אומרת הזיכרון האמיתי זה ה-base הזה, ועוד תיקח את ה-base הזה ותוסיף לו את ה-offset.
הבנתם? זה פשוט פלוס רגיל. ואז אני מקבל את הכתובת הבסיס פלוס ה-offset, זה איפה שמתחילה הפונקציה ואז יש לי פה בתוך המשתנה הזה בדיוק איפה טעונה הפונקציה ואז אני יכול לעשות לו interceptor replace ולהחליף אותה בזיכרון בדיוק כמו שעשינו כאן interceptor replace רק עכשיו במקום להחליף
את str str נחליף את האנטי דיבאג אוקיי אני עושה פה interceptor replace של הכתובת הנוכחית בניו נייטיב callback function ובניו נייטיב callback אני יוצר לו פונקציה חדשה שלא מקבלת כלום ולא מחזירה כלום ולא מקבלת כלום.