
הטקסט המלא של הדקות הראשונות בהרצאה «הסבר על JNI ועל קבצי SO» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, בהרצאה הזו אנחנו רוצים לגלות את הסטרינג הסודי, את הסיסמה הסודית של Uncrackable Level 2, של אפליקציה שנועדה כדי שנפרוץ אותה ונגלה את הסטרינג הסודי.
בואו נראה מה הם מחביאים, 1, 2, 3, 4, הם אומרים שזה לא טוב הסטרינג הזה, תחפש משהו אחר. השאלה היא, מה מסתתר, מה הוא בודק? בואו ניקח את התיקייה שלנו, את ה-APK שלנו שהוא אחרי הפייץ', נפתח אותו בעזרת ג'אדאקס ונציץ מה קורה פה כשלוחצים על כפתור של וריפיי.
אני פותח את ה-APK, את האפליקציה בעזרת ג'אדאקס ורואה את קוד ג'אווה המקורי שלה. איך אנחנו מתחילים להסתכל אם אתם רוצים ממש מההתחלה לראות?
אנחנו נכנסים לקובץ XML של אנדרואיד מניפסט XML שזה קובץ חובה ב-APK. רואים פה איפה שיש לנו מיין ולנצ'ר, איפה שיש שתי שורות האלו?
זה אומר שהאקטיביטי הזה זה המסך הראשון שמופעל. איזה מסך זה? SG Vantage Point Uncrackable Main Activity זה המסך הראשון שמופעל.
אז אני הולך פה SG Vantage Point Uncrackable 2 Main Activity וזה החלון שלנו. בתוך החלון הזה יש פה פונקציות שונות. קודם כל מה אני רואה? אני רואה פה שיש לנו פה לורד ליבררי, הוא טוען ספרייה חיצונית.
מה זה אומר הספרייה החיצונית? זה בדיוק קוד עזר שכתוב ב-C או C++ ולמעשה זאת ספריית עזר עם קוד חיצוני שכתוב בשפת מכונה. אנחנו יכולים לראות את זה פה ב-Libraries, נניח ב-X86, ליפ פו, אתם רואים ספריית עזר שנקראת פו?
הנה היא נמצאת כאן. ושימו לב, בגלל שהיא כתובה בשפת מכונה, יש לה גרסה ל-ARM 64-Bit ויש לה גרסה ל-ARM כללית. ויש לה ל-64 ביט x86 לפי סוג המעבד.
שימו לב כמה גרסאות שונות יש לספריית העזר הזאתי, לליברירי, ספרייה דינמית שנטענת. אוקיי, אז שמנו לב שיש פה ליברירי. דרך אגב, אם אני רוצה להפעיל איזושהי פונקציה מהליברירי הזה, אנחנו נראה איך עושים את זה עוד מעט, תכף נדבר על זה לעומק.
אז תראו שיש פה טעינה חיצונית. אוקיי, אבל לא בשביל זה באנו, סתם שמתי לב שיש לנו פה טעינה חיצונית. היינו בלנתח את הקובץ אז התחלנו מזה שיש לנו את האנדרואיד מניפסט קובץ מניפסט xml שהוא חייב להיות פה בפנים כתוב את מי להפעיל קודם וכתוב את מיין אקטיביטי הולך למיין אקטיביטי במיין אקטיביטי יש
פונקציית a אתם רואים פונקציית a פונקציית init דרך אגב פונקציית init כתובה עם מילת native מה זה אומר מילת native לפני שם של הפונקציה זה אומר שהיא נמצאת כאן בתוך הליבררי בתוך אחד הליבריז האלו כאשר זה אותו קוד שמקומפל כמה פעמים בצורות שונות והמעבד מטעין אותו לפי מה שהוא צריך לפי סוג המעבד.
אז במקרה שלנו אנחנו נראה שמה שנטען זה ליב פו x86 תכף אני אראה לכם איך יודעים את זה. בקיצור מילת נייטיב אומרת שפונקציית אינית נמצאת כאן ולכן אנחנו רואים לדוגמה פה שם של פונקציית a בסוגריים משהו ואז את הקוד שלה אתם רואים זה הקוד של הפונקציה.
כאן הכרזה על פונקציה וישר נקודה פסיק אין לה קוד למה אין לה קוד כי הקוד שלה נמצא בתוך נייטיב כאן אנחנו רק מכריזים שקיימת פונקציה כזאת שג'אווה עידה כשהוא רואה מילת נייטיב הוא מחפש את הקוד שלה בתוך הליבריז שמתם לב הנה הכרזה פרייבט ווייד הכרזה על פונקציה והקוד שלה ההכרזה ממה היא מורכבת מפרייבט איזה ערך מוחזר עוד פעם פרייבט זה למי יש גישה
האם יש גישה מבחוץ או אין גישה מבחוץ לפונקציה הזאת? האם זאת פונקציה פנימית או חיצונית? public זה אומר היא חיצונית, זה אומר שמקלאס אחר אפשר לגשת לפונקציה הזאת.
כל הפונקציות הן בתוך קלאס. אתם רואים? כל הפונקציות הן בתוך קלאס. אז private אומר שהפונקציה הזאת נגישה רק מתוך הקלאס הזה. אי אפשר מקלאס חיצוני לגשת אליה.
void זה אומר שהיא לא מחזירה כלום למי שקרא לה. אחרי זה הולך שם פונקציה, ואחרי זה בסוגריים מה היא מקבלת ואחרי זה הקוד שלה.
הדבר הזה זה המימוש וזה נקרא חתימה של פונקציה. חתימה זה מה היא מקבלת ומה היא מחזירה. אותו דבר כאן, יש חתימה של פונקציה אבל בלי המימוש שלה.
למה אין את המימוש שלה? כי המימוש נמצא בתוך נייטיב, בתוך הליברריז, בתוך הספרייה החיצונית. יפה. אז ראינו שיש לנו פה את הספרייה ה-init החיצונית, יש לנו פונקציה onCreate וזאת הפונקציה שמופעלת אוטומט דבר ראשון ופה מתבצעת קודם כל פונקציית init אחרי זה בדיקה שזה לא root אחרי זה עוד משהו מתבצע בקיצור כל זה עובד כאן הנה יש פה בדיקה שזה דבאגר האם
אנחנו מחוברים עם דבאגר והוא מנסה לצאת אם אנחנו מתחברים עם דבאגר להציץ פנימה ויש פונקציית verify עכשיו אני חושד שהverify הזה קשור לכפתור הזה של verify אבל איך אני יכול להיות בטוח שהכפתור הזה מקושר לפונקציה הזאת אני חושד אבל לא בטוח.
שימו לב פה, יש לי פה פונקציית onCreate שמופעלת אוטומט תמיד. בסוף של פונקציית onCreate שהיא מופעלת אוטומט כשהקלאס הזאת מופעלת, יש פה Set Content View.
Content View זה אומר תצייר לי על המסך מה שכתוב פה בפנים. מה כתוב פה בפנים? ללכת ל-Ressources, בתוך ה-Ressources ללכת ל-Layout, בתוך ה-Layout לחפש Main Activity.
בתוך ה-Layout, אקטיביטי מיין, סליחה. אקטיביטי, כף תחתון, מיין. הנה זה זה. זאת אומרת, פונקציית און קריאייט אומרת להציג את המידע הגרפי של מה שכתוב ב-XML הזה.
בואו נראה מה כתוב פה ב-XML, הנה יש לנו פה בטון, ובתוך הבטון כתוב לנו און קליק פונקציית וריפיי. ככה אני יודע שבאמת מופעלת פונקציית וריפיי ולא משהו אחר, ואני יכול ללכת למיין אקטיביטי, לקלאס, ולחפש את הפונקציית וריפיי במקום לחפש אותה עדנית אני יכול לעשות פה פלוס ולראות את כל
המשתנים ואת כל הפונקציות הנה יש לי פונקציית וריפיי פונקציית און קריאייט שמופעלת ראשונה ולא מחזירה כלום פונקציית וריפיי שלא מחזירה כלום ווייד ואני רואה פה את הקוד של הבדיקה אוקיי בוא נחפש מה קורה בבדיקה זה מה שאנחנו רוצים לראות נכון אני רואה פה את הקוד מה הוא עושה הוא מכריז על משתנה סטרינג רק משתנה אובג' מסוג סטרינג זה אומר משתנה אובג' שמקבל את
הטקסט כנראה מכאן. הנה מה שאני מקיש כאן ה-1234 נכנס לאובג' הזה. אתם רואים לקחת מ-resources-edit-text-get-text יפה.
אחרי זה הוא יוצר דיאלוג שזה אומר החלון הקופץ הזה הוא יוצר את החלון הקופץ במשתנה create ולתוך המשתנה קריאט הזה הוא מכניס טייטל סקסס או כישלון זאת אומרת שהוא מתחיל למלא את החלון הזה