דיסאסמבלר

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

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

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

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

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

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

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

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

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

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

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

למשל, במעבדי x86 של אינטל, ניתן אולי להסיק מהפקודה <syntaxhighlight lang="text">
mov ax, [90]
</syntaxhighlight>
שקיים משתנה בגודל של שני בתים בכתובת 90, מכיוון שהאוגר AX, הוא אוגר בגודל של שני בתים.

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

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

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

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

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

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

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

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

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

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

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

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

== כלים ==

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

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

{| class="wikitable"
|-
! שם הכלי !! מטרה עיקרית !! אינטראקטיבי !! רישיון
|-
| IDA Pro || דיסאסמבלר || כן || רישיון מסחרי (קיימת גרסת חינם)
|-
| objdump || דיסאסמבלר || לא || GPL
|-
| windbg || דיבאגר || כן || רישיון מסחרי (קיימת גרסת חינם)
|-
| ollydbg || דיבאגר || כן || תוכנה שיתופית
|-
|cutter
|דיסאסמבלר
|כן
|GPL
|-
|ghidra
|דיסאסמבלר
|כן
|GPL
|}

== ראו גם ==
* אסמבלר
* הנדסה הפוכה
* שפת סף
* שפת מכונה

== לקריאה נוספת ==
* אלדד עילם, Reversing: Secrets of reverse engineering, וואלי, אפריל 2005

== קישורים חיצוניים ==
* רשימת דיסאסמבלרים (אנגלית), באתר WikiBooks
* [http://www.onlinedisassembler.com/odaweb/run_hex דיסאסמבלר מקוון (אנגלית)], באתר Online Disassemblers 
== הערות שוליים ==

קטגוריה:כלי תכנות