דיסאסמבלר

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה לניווט קפיצה לחיפוש

דִּיסְאָסֶמְבְּלֶראנגלית: Disassembler) היא תוכנית מחשב אשר מתרגמת תוכנית בשפת מכונה לתוכנית בשפת סף (Assembly), ולמעשה, מבצעת את הפעולה ההפוכה לפעולת האסמבלר.

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

מבנה תוכנית שפת מכונה[עריכת קוד מקור | עריכה]

תוכנית בשפת מכונה מכילה:

  • פקודות שפת מכונה (קוד בינארי)
  • ערכי אתחול למשתנים
  • (אופציונאלית) מידע בעבור מערכת ההפעלה לצורך הרצת התוכנית
  • (אופציונאלית) "מידע ניפוי שגיאות" (debug information) נוסף לצורך תיקון שגיאות תוכנה

פעולת הדיסאסמבלר[עריכת קוד מקור | עריכה]

פעולות הדיסאסמבלר:

הפלט של הדיסאסמבלר הוא ייצוג של התוכנית בשפת סף.

פלט זה ניתן, תאורטית, להדר, בעזרת אסמבלר, חזרה לשפת מכונה .

בעיות בבניית דיסאסמבלר[עריכת קוד מקור | עריכה]

זיהוי פקודות[עריכת קוד מקור | עריכה]

לא תמיד ניתן להבדיל בין פקודות (code) לבין מידע (data).

במקרים מסוימים, לא ניתן לפענח פקודות כהלכה, אפילו כאשר ידוע שהן פקודות. בארכיטקטורת ARM, לדוגמה, ישנן שתי קבוצות של פקודות שפת מכונה, אחת בגודל של שני בתים, ואחת בגודל של ארבעה בתים[1]. לפעמים, כדי להבחין ביניהם, נדרש מידע אשר קיים רק בזמן ריצת התוכנית.

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

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

זיהוי גודלם של משתנים[עריכת קוד מקור | עריכה]

גודל המשתנים לרוב אינו מוגדר ישירות בתוך תוכנית שפת המכונה. הדיסאסמבלר מנסה להסיק את גודל המשתנים מפקודות הגישה אליהן.

למשל, במעבדי x86 של אינטל, ניתן אולי להסיק מהפקודה

mov ax, [90]

שקיים משתנה בגודל של שני בתים בכתובת 90, מכיוון שהאוגר AX, הוא אוגר בגודל של שני בתים.

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

כמו כן, לפעמים גודלו של המשתנה אינו קבוע, והוא משתנה לפי ההקשר, למשל, בשפת C משתנה כזה מוגדר על ידי מילת המפתח Union[2]. גם מקרה זה מקשה על הדיסאסמבלר לזהות נכונה את טיפוס המשתנה.

זיהוי מיבני תוכנה[עריכת קוד מקור | עריכה]

מכיוון שאחת ממטרות הדיסאסמבלר היא להקל על הבנת התוכנית, רוב הדיסאסמבלרים מנסים לזהות מיבני תוכנה, למשל, זיהוי מבנה של טבלת קפיצה (branch table). למיבני תוכנה, אין יצוג אחיד בשפת מכונה, ומכאן הבעיה לזהותם.

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

גם זיהוי זה נעשה על ידי הדיסאסמבלר באופן היוריסטי.

תוכנה המשנה את עצמה[עריכת קוד מקור | עריכה]

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

דוגמה רווחת לתוכנה המשנה את עצמה היא כאשר, חלקים מהתוכנה מוצפנים, וחלק אחר של התוכנה, שאינו מוצפן, יסיר את ההצפנה, ויריץ את חלקי התוכנה אשר היו מוצפנים.

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

הסתרה מכוונת[עריכת קוד מקור | עריכה]

מתפתחות שיטות להסתרת תוכנה. בחלקן, השיטות מבוססות על החרפת הבעיות שהוזכרו לעיל, והכנסתן באופן מכוון לתוכנה במקומות רבים.

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

שימושים נפוצים[עריכת קוד מקור | עריכה]

הדיסאסמבלר משמש ככלי לביצוע הנדסה הפוכה לתוכנה.

כלים[עריכת קוד מקור | עריכה]

הכלי הנפוץ ביותר לצורך דיסאסמבלי הוא IDA Pro.

רוב כלי ניפוי השגיאות (Debuggers) מכילים גם דיסאסמבלר בתוכם.

שם הכלי מטרה עיקרית אינטראקטיבי רישיון
IDA Pro דיסאסמבלר כן רישיון מסחרי (קיימת גרסת חינם)
objdump דיסאסמבלר לא GPL
windbg דיבאגר כן רישיון מסחרי (קיימת גרסת חינם)
ollydbg דיבאגר כן תוכנה שיתופית

ראו גם[עריכת קוד מקור | עריכה]

לקריאה נוספת[עריכת קוד מקור | עריכה]

  • אלדד עילם, Reversing: Secrets of reverse engineering, וואלי, אפריל 2005

קישורים חיצוניים[עריכת קוד מקור | עריכה]

הערות שוליים[עריכת קוד מקור | עריכה]