דיסאסמבלר – הבדלי גרסאות

מתוך ויקיפדיה, האנציקלופדיה החופשית
תוכן שנמחק תוכן שנוסף
Shevna (שיחה | תרומות)
מ הגהה
Harel (שיחה | תרומות)
מ קטגוריה (יש למישהו רעיון טוב יותר?), בינוויקי
שורה 98: שורה 98:
== הערות שוליים ==
== הערות שוליים ==
{{הערות שוליים}}
{{הערות שוליים}}
[[קטגוריה:תכנות]]

[[קטגוריה:ויקיפדיה: ערכים של משתמשים חדשים|11 2012]]
[[קטגוריה:ויקיפדיה: ערכים של משתמשים חדשים|11 2012]]
[[en:Disassembler]]

גרסה מ־17:45, 21 בנובמבר 2012

דיסאסמבלר הינה תוכנית מחשב אשר מתרגמת תוכנית בשפת מכונה לתוכנית בשפת סף (Assembly), ולמעשה, מבצעת את הפעולה ההפוכה לפעולת האסמבלר.

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

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

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

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

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

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

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

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

בעיות בבניית דיסאסמבלר

זיהוי פקודות

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

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

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

זיהוי גודלם של משתנים

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

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

mov ax, [90]

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

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

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

זיהוי מיבני תוכנה

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

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

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

שימושים נפוצים

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

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

כלים

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

רוב הדיבאגרים מכילים גם דיסאסמבלר בתוכם.

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

ראו גם

לקריאה נוספת

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

קישורים חיצוניים

הערות שוליים