
הטקסט המלא של הדקות הראשונות בהרצאה «דיבאג של קובץ APK בתוך Android Studio ללא קוד מקור» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, בהרצאה הזו אני רוצה להראות לכם איך אפשר לעצור את הקוד בתוך הטלפון באמצע עבודה ולהציץ במה שקורה בתוך הזיכרון של המכשיר לגלות את הערכים הסודיים של המשתנים לראות מה קורה שם באמצע התוכנה, באמצע הביצוע לא לנתח קוד סטטית בלי שהוא רץ, אלא ממש לעצור את הקוד באמצע עבודה
ולראות מה קורה אצלו בזיכרון ולהוציא משם המידע אנחנו דרך זה נפרוץ את האפליקציה זה דומה מאוד לפרידה רק אנחנו לא משכתבים כלום לא כותבים כלום פשוט עוצרים את התוכנה באמצע ומסתכלים מה קורה בזיכרון של המכשיר זה נקרא דיבאגינג לחפש באגים בתוך התוכנה זה הסיבה המקורית שבשביל זה עשו את הדיבאגר
הזה שהמתכנת יוכל לעבור פקודה פקודה ולראות מה קורה בזיכרון של המכשיר נעשה את זה על ידי אנדרואיד סטודיו שזאת סביבת פיתוח הכי פופולרית לאפליקציות היום כותבים כמעט את כל האפליקציות בסביבת פיתוח של אנדרואיד סטודיו, קוראים לה גם AS הרבה פעמים.
עכשיו שימו לב מה אני עושה, אני מפעיל אותה כברירת מחדל והפעלה הראשונה שלה לוקחת קצת זמן. למה הוא צריך להתקין עוד כל מיני רכיבים? אני עושה לו פה נקסט נקסט נקסט על הכל אני עושה נקסט ופיניש.
הנה הוא מתחיל לעשות אנד זיפינג, לוקח לו זמן עד שהוא מתקין את עצמו. אני רוצה להראות לכם, אני הולך לעשות הכל על גלקסי S8. אפשר היה לעשות גם על 11 ו-12.
מה שאסור לעשות זה על 9 ו-10. זאת אומרת, ה-API פה, פה כשאני לוחץ פלוס ומוסיף מכשירים, אז שימו לב, אסור לי שיהיה כתוב פה אנדרואיד 9 או אנדרואיד 10.
אתם רואים? אסור שיהיה כתוב או 10 או 9. למה? כי יש שם איזשהו באג שמפריע לי. אתם יכולים לעשות או על 11 או על 12 או על 8 או על 7 או על 5 אבל לא על 9 ו-10.
בקיצור יש לי פה מכשיר Galaxy S8 שהפעלתי אותו ואנחנו נכנסים פה בגלאקסי S8 ורואים מה כתובת ה-IP שלו.
174, בואו אני אראה לכם איך ידעתי מה הכתובת. אם סוגרים את הכל, פה סוגרים ימינה, מורידים את התריס העליון, לוחצים על Wi-Fi הרבה זמן, יש לנו פה Wi-Fi מחובר, לוחצים עליו ומקבלים את כתובת ה-IP 174 שימו לב כשאני רוצה לסגור אני צריך לעשות ימינה פה רואים ככה סוגרים אז
עוד פעם מלמעלה לוחצים על Wi-Fi ולוחצים על רשת ספציפית ומקבלים עליה את הפרטים כולל ה-IP טוב עד שעשינו את זה מה שקרה שנפתח לנו אנדרואיד סטודיו בפעם הראשונה אני יכול ליצור פרויקט חדש תוכנה חדשה לפתוח תוכנה קיימת אבל אני רוצה more actions ודיבאג APK לעבור שורה שורה ב-APK שזה כן אתם יודעים אנדרואיד אפליקיישן
ואני בוחר כאן את התוכנה שלנו היא נמצאת בתיקיה של היוזר בדאונלואודס פאץ'. למה פאץ'? כי התגברנו על ההגנה של רוט שלא יעצור לנו באמצע ויגיד שהמכשיר פרוץ על זה כבר התגברנו בהרצאות קודמות אני לוקח איזשהו APK עושה אוקיי ומייבא אותו לאנדרואיד סטודיו.
עכשיו השאלה איפה אני רוצה בדיוק לעצור או באיזה שורה, באיזה פקודה. אז יש לנו פה את כל הקלאסים טובים בשפת Smile. Smile זה למעשה האסמבלר של Java.
אנחנו רואים שפת מכונה כביכול. בואו נראה סתם דוגמה, Main Activity, אנחנו רואים פה לא קוד ב-Java, אלא קוד בשפת מכונה, שתרגמו את ה-Java לשפת מכונה.
עכשיו, זה לא כזה נוח, בגלל שזה לא כזה נוח, אבל זה הדבר היחיד שהוא 100% עובד, בגלל זה Visual Studio עובדת איתה.
אנחנו יכולים להיעזר בג'אדקס בשביל לראות פחות או יותר את הקוד בג'אווה. הוא לא 100%, אי אפשר ב-100% לתרגם את השפת מכונה חזרה לשפה עילית, אי אפשר ב-100% לתרגם את הכל ברוורס, אבל זה מספיק טוב לנו.
שימו לב, אנחנו יכולים לבחור כאן בג'אדקס ולראות את הקוד בג'אווה, שזה ממש נוח, ואפשר לראות אותו בשפת מכונה שמאלי.
זה למעשה הקוד האמיתי שכתוב בתוך הקבצים, בתוך ה-APK כביכול, אני אסביר לכם יותר לעומק בהרצאה נפרדת איך זה עובד מאחורי הקלעים זה ה-APK האמיתי, כביכול זה שפת המכונה האמיתית זה הבייטקוד של ג'אווה בייצוג יפה יותר וזה הניסיון שלו לתרגם את זה בחזרה לג'אווה הניסיון הזה טוב אבל לא ב-100% שימו לב אם אני אעשה פה Tools ו-Log Viewer
אני אראה פה למעלה נניח שכל מיני דברים r-class not found כל מיני דברים cannot find r-class יש כל מיני הודעות שגיאה שקורות.
למה זה קורה? כי אי אפשר ב-100% לקחת את הקוד של סמיילי ולתרגם חזרה לשפה עילית. אפשר לנסות לעשות את זה, זה יוצא בערך נכון, אבל לא ב-100%.
אז זה נותן לנו מידע כללי שנדע מה אנחנו מחפשים. ומה אנחנו מחפשים? אנחנו מחפשים את השורה הזאת של Success, This is the correct secret, זוכרים את זה?
ואנחנו רוצים שהפונקציה הזאת תחזיר לנו True. ואז ניכנס לכאן. בואו נראה מה זה הפונקציה הזאת. עושים קונטרול קליק.
אנחנו כבר דיברנו על הקוד הזה, ומצאנו שבסוף היא עושה השוואה בין הסטרינג שנקלט מהיוזר לבין המשתנה שמכיל את הקוד. המשתנה שמכיל את הקוד זה ברר. ואיפה המשתנה הזה שמכיל את הקוד מקבל את הקוד הסודי שאנחנו מנסים לגלות אותו?
בשורה הזאת. אז למעשה אני רוצה לתפוס כאן באמצע העבודה, לעצור את הכל פה באמצע העבודה, שמשהו מהפונקציה הזאת חוזר חזרה ולראות מה קורה בזיכרון של המשתנה הזה.
אז בואו נבין איפה השורה הזאת בסמיילי נמצאת. אני מסתכל פה על הסטרינג הזה, זה לפני כל הסטרינגים, אתם רואים? פה זה אמור להיות איפשהו.
אחרי הטראי ולפני הסטרינגים, בואו נראה. אז גם פה אני רואה, אתם רואים, מתודה a. שימו לב, תפסיקו לפחד מסמיילי, מתודה a, בדיוק כמו פה, אתם רואים פונקציה שקוראים לה a, ויש פונקציה שקוראים לה b, יש פה שתי פונקציות, b ו-a, שתי פונקציות אנחנו רואים, ושתיהן יושבות בתוך קלאס a.
אוקיי, אז יש לנו פה מתודה a ויש לנו פה מתודה b, אתם רואים? מתודה a ומתודה b, זה שני הדברים שיושבים לנו בתוך הקובץ הזה, והקובץ זה קלאס.
אתם רואים? יש לנו קלאס a ובפנים שתי מתודות. טוב, מה אנחנו רוצים לעשות? אנחנו רוצים למצוא איפה השורה הזאת נמצאת פה.
ברר שווה הערך המוחזר מהפונקציה. הפונקציה פתחה את הקוד הסודי והחזירה הכל לברר. אז אנחנו מתחילים פה להסתכל, אנחנו מנסים להבין את הקוד.
לא צריך להיות מתכנתים, צריכים לנסות להבין את הקוד. אז ככה, אני רואה פה שיש פה קריאה. בואו נראה, אנחנו קוראים לפונקציית a. אתם רואים? לפונקציית a ומיישמים ב-arר.
אז תסתכלו, בשפה העילית זה שורה אחת, פה זה הרבה שורות. עכשיו, מה עוזר לי? שזה ישר אחרי הטראי. אז הנה אני רואה פה טראי, אתם רואים פה, יש פה טראי, וכל פקודה בשפה העילית מתרוגמת לכמה פקודות בשפת מכונה, וזה הכי דומה. למה זה הכי דומה? קוראים לפונקציית a,
מעבירים לה שני פרמטרים של b, והם מקבלים חזרה גם b. זאת אומרת, קוראים לפונקציית a, שנמצאת בתוך a, לפונקציית a, מעבירים לה בסוגריים שני פרמטרים, ומקבלים משהו חזרה.
זה בדיוק מה שקורה פה. יש לנו פה פונקציית a שמעבירים לה בסוגריים משהו אחד פסיק משהו שני שם. אתם רואים, מעבירים לה כל מיני דברים בסוגריים.
אז אני חושד שזה פה ואחרי שקוראים לפונקציה הזאת היא מחזירה ערך ואנחנו move result object ל-v0 במשתנה e0 תשב התוצאה. אני רוצה להציץ ל-v0 הזה ושימו לב אחרי הטראי הזה אתם רואים איך שהטראי מסתיים הפקודה שלי מצטיימת בתוך הטראי מתחילה קאץ׳ הבלוק של קאץ׳ אז זה יושב בדיוק בתוך הטראי לנסות משהו ואם יש פה פשלה אז הוא נופל ל-catch
ונותן לו הודעת שגיאה, error message. אבל try catch אומר תנסה, אם אתה מצליח סבבה, אם אתה לא מצליח תבצע את הקוד בתוך ה-catch.
הקוד הזה שבתוך ה-catch יתבצע אם הקוד של ה-try לא הצליח. מה זה לא הצליח? לדוגמה הוא לא הצליח לפתוח את ההצפנה, לא מצא קובץ, משהו נדפק לו באמצע עבודה, לא הצליח לשלוח משהו ברשת.
try זה לנסות ומה לעשות אם יש שגיאה. אז גם פה אנחנו רואים פה try, אנחנו רואים פה שבתוך ה-try הזה יש לנו את הקריאה לפונקציה שלי, ככה אני זיהיתי אותה לפי הקריאה, ו-move result ל-v0.
ואחרי הפקודה הזאת, שימו לב, try ends מסתיים ה-try שלי ומתחיל ה-catch. אז זה הבלוק שחיפשתי, ובתוך הבלוק הזה מצאתי את הפקודה. עכשיו, מה אני רוצה להראות לכם?
שימו לב, בתוך הבלוק אנחנו רואים איזה ארבע פקודות בשפת מכונה, אבל בשפה העילית, מתכנת כתב שורה אחת. זאת אומרת בשפה העילית כותבים שורה אחת נוחה וזה מתורגם לכמה שורות בשפת מכונה, זה הקטע.
בגלל זה לא תמיד אפשר לקחת כמה שורות ולהחזיר אותן חזרה, כי אפשר לבלבל את האלגוריתם, אני יכול לעשות פה כל מיני דברים באמצע, להכניס סתם זבל באמצע, רק בשביל לבלבל את המכונה, ואז אי אפשר יהיה להחזיר ארבע שורות חזרה לכאן, כי הן לא יהיו ארבע שורות ברצף.
אז הרבה פעמים כל שורה בשפה העילית מתורגמת לכמה שורות בשפת מכונה, ואם רוצים אז אפשר להכניס פה עוד פקודות אקסטרה שכביכול שייכות למשהו אחר לחלוטין ואז המחשב כבר לא ידע לתרגם את זה ברוורס.
בגלל זה רוורס אינג'ינירינג הוא לא ב-100%. אוקיי, אז בקיצור אנחנו צריכים לתפוס את הערך הזה פה, V0 אחרי הפקודה הזאת.
איך אנחנו נעשה את זה? בואו נמצא את הקובץ הזה בהרדיסק. אז זה נמצא ב-SG Vantage Point Uncrackable 1.a. אנחנו גם פה הולכים ל-sg-winpoint-uncrackable1.a דרך אגב, למה זה a,b,c?
כי הפעילו תוכנה שעושה מזעור של הקוד פה שימו לב זה קובץ לכל קלאס כל קלאס מקבל קובץ משלו בשפת smile הנה אנחנו רואים פה גם כן פונקציית a פונקציית