ברוב המקרים, לא ניתן ליצור דיסאסמבלר מושלם, ונאלצים להסתפק בדיסאסמבלר היוריסטי.
מזהה טיפוסי משתנים ואת ערכי האתחול שלהם, אם אכן ישנם ערכים כאלה.
הפלט של הדיסאסמבלר הוא ייצוג של התוכנית בשפת סף.
פלט זה ניתן, תאורטית, להדר, בעזרת אסמבלר, חזרה לשפת מכונה .
לא תמיד ניתן להבדיל בין פקודות (code) לבין מידע (data).
במקרים מסוימים, לא ניתן לפענח פקודות כהלכה, אפילו כאשר ידוע שהן פקודות. בארכיטקטורת ARM, לדוגמה, ישנן שתי קבוצות של פקודות שפת מכונה, אחת בגודל של שני בתים, ואחת בגודל של ארבעה בתים. לפעמים, כדי להבחין ביניהם, נדרש מידע אשר קיים רק בזמן ריצת התוכנית.
דרך התמודדות עם הבעיות לעיל, בדיסאסמבלרים מודרניים, היא ניסיון לעקוב אחרי בקרת הזרימה (control flow) של התוכנית, החל מהפקודה הראשונה לביצוע של התוכנית. פתרון זה אינו מושלם, מכיוון שלא תמיד ניתן לעקוב אחרי זרימת התוכנית, לדוגמה, כאשר נעשה שימוש בפולימורפיזם.
ישנם מקרים, במיוחד במערכות משובצות מחשב (embedded systems), בהם לא ניתן לדעת מהי הפקודה הראשונה לביצוע. במקרה זה, בעיית זיהוי הפקודות גדולה עוד יותר.
גודל המשתנים לרוב אינו מוגדר ישירות בתוך תוכנית שפת המכונה. הדיסאסמבלר מנסה להסיק את גודל המשתנים מפקודות הגישה אליהן.
שקיים משתנה בגודל של שני בתים בכתובת 90, מכיוון שהאוגר AX, הוא אוגר בגודל של שני בתים.
לעיתים קרובות, הגישה למשתנה היא באופן עקיף על ידי מצביע, במקרים אלה, הדיסאסמבלר מתקשה לזהות את משתנה היעד, ומידע לגבי גודלו הולך לאיבוד.
כמו כן, לפעמים גודלו של המשתנה אינו קבוע, והוא משתנה לפי ההקשר, למשל, בשפת C משתנה כזה מוגדר על ידי מילת המפתח Union. גם מקרה זה מקשה על הדיסאסמבלר לזהות נכונה את טיפוס המשתנה.
מכיוון שאחת ממטרות הדיסאסמבלר היא להקל על הבנת התוכנית, רוב הדיסאסמבלרים מנסים לזהות מיבני תוכנה, למשל, זיהוי מבנה של טבלת קפיצה (branch table). למיבני תוכנה, אין יצוג אחיד בשפת מכונה, ומכאן הבעיה לזהותם.
הבעיה גדלה כאשר נעשה שימוש ביכולות האופטימזיציה של המהדר, מכיוון שנוצר יצוג אחר, יעיל יותר, לאותו מבנה תוכנה.
גם זיהוי זה נעשה על ידי הדיסאסמבלר באופן היוריסטי.
תוכנה יכולה להתייחס לעצמה, בכך שתכיל פקודות אשר משנות את תאי הזיכרון אשר מכילים את פקודות התוכנה עצמה.
דוגמה רווחת לתוכנה המשנה את עצמה היא כאשר, חלקים מהתוכנה מוצפנים, וחלק אחר של התוכנה, שאינו מוצפן, יסיר את ההצפנה, ויריץ את חלקי התוכנה אשר היו מוצפנים.
במקרה כזה, הדיסאסמבלר יוכל לפענח את החלקים אשר מסירים את ההצפנה, אך לא את החלקים המוצפנים.
מתפתחות שיטות להסתרת תוכנה. בחלקן, השיטות מבוססות על החרפת הבעיות שהוזכרו לעיל, והכנסתן באופן מכוון לתוכנה במקומות רבים.
הדיסאסמבלר, בהיותו כלי חשוב בביצוע הנדסה הפוכה, הוא "יעד התקפה" עבור מסתירי התוכנה, ומטרתם היא לנסות לגרום לו לשגות בניתוח ההיוריסטי של התוכנה.
הדיסאסמבלר משמש ככלי לביצוע הנדסה הפוכה לתוכנה.
חוקרי אבטחת מידע עושים שימוש בדיסאסמבלר לצורך מחקר ואיתור באגים ופרצות אבטחה ביישומי מחשב.
חברות אנטי וירוס עושות שימוש בדיסאסמבלר לצורך ניתוח תוכנות זדוניות כמו סוסים טרויאנים, וירוסי מחשב, תוכנות רוגלה וכדומה.
גורמי פיתוח תוכנה עושים שימוש בדיסאסמבלר לצורך ניתוח טכנולוגיות מסוימות והתאמתן לפלטפורמות אחרות. כדוגמה, פרויקט ההנדסה ההפוכה של מנגנון ניהול הקבצים NTFS שבמערכת ההפעלה חלונות, לצורך הוספת תמיכה בטכנולוגיה זו במערכת ההפעלה לינוקס.
קראקרים עושים שימוש בדיסאסמבלר לצורך פריצת משחקי מחשב ותוכנות המוגנים מפני שימוש לא חוקי. התוצר העיקרי הוא קראקים ליישומים.
חברות מסחריות עושות שימוש בדיסאסמבלר לצורך העתקה של טכנולוגיות ומוצרים.
ארגוני ביון עושים שימוש בדיסאסמבלר לצורך גילוי פרצות אבטחה על מנת לנצלם לצורכי ביון.
הכלי הנפוץ ביותר לצורך דיסאסמבלי הוא IDA Pro.
רוב כלי ניפוי השגיאות (Debuggers) מכילים גם דיסאסמבלר בתוכם.
אוחזר מתוך "https://he.wikipedia.org/w/index.php?title=דיסאסמבלר&oldid=28026900"