פרויקט מנתח PE וספרייה יציבה¶
נבנה כלי שמנתח קובץ PE כנתונים, וספריית DLL שמספקת את ליבת הניתוח לשני לקוחות. הפרויקט אינו טוען את הקובץ הנבדק ואינו מפעיל את הקוד שבתוכו. המטרה היא לחבר קריאת פורמט לא מהימן, ABI, טעינת תלויות ותהליך הפצה שניתן לחקור.
התוצר הראשון הוא חוזה¶
הספרייה מקבלת טווח bytes שאינו בבעלותה, מחזירה כותרת מסוכמת ומאפשרת לקרוא section לפי מספר. הממשק משתמש בטיפוסים בעלי רוחב קבוע ובקודי שגיאה, ואינו מעביר חריגות או מכולות C++ דרך הגבול.
החוזה צריך להגדיר את גודל מבנה הפלט ואת הגרסה הנתמכת. כשל אינו משנה את הפלט. טווח הקלט חייב להישאר חי במהלך הקריאה; הספרייה אינה שומרת אותו. הלקוח אחראי לקריאה מהקובץ, והספרייה אחראית לפענוח מבוקר בלבד.
היכולות שנדרשות¶
הכלי מציג Machine, סוג optional header, entry RVA, מספר sections, ImageBase וגדלי image ו־headers. לכל section הוא מציג שם מוגבל לשמונה בתים, RVA, גודל וירטואלי, raw offset, raw size והרשאות.
המרת RVA להיסט קובץ מתבצעת רק אם כל הטווח מגובה בבתים בקובץ. אזור מאופס בזיכרון אינו הופך לנתוני קובץ. הטיפול בכותרות וב־sections חופפים צריך להיות מפורש.
החקירה המלווה משתמשת ב־dumpbin כדי להציג imports ו־base relocation blocks של תוצרים מוכרים. מחשבים ידנית המרת RVA אחת ומפרשים relocation אחד. בניתוח exports מזהים גם forwarder ומסבירים מדוע אינו קוד רגיל. אין דרישה לממש parser עצמאי לכל directories בפרויקט הזה.
שני לקוחות ושתי תצורות¶
הלקוח הראשון מקושר באמצעות import library וקורא קובץ מהדיסק. הלקוח השני טוען את הספרייה במפורש עם מדיניות חיפוש, בודק גרסה ומפעיל בדיקות על מערכי bytes בזיכרון. בונים את הספרייה ב־debug וב־release ושומרים סמלים תואמים לכל גרסה.
שומרים לקוח בינארי ישן ומחליפים רק את ה־DLL לאחר הוספת יכולת חדשה. השינוי אינו רשאי לשנות חתימות קיימות או משמעות של קודי שגיאה שכבר הוגדרו.
ניסויי הכשל¶
צרו קלטים קטועים בכל גבול מבני: כותרת DOS, חתימת NT, optional header, וטבלת sections. הוסיפו ערכים שגורמים לגלישה, raw range מעבר לסוף, RVA בזנב מאופס ושם section בן שמונה בתים ללא null, שאותו יש להציג בלי קריאה מעבר לשדה.
כל כשל צריך להחזיר שגיאה מסודרת ולשמר את הפלט הקודם. הפעילו כלי ניתוח סטטי ו־sanitizer נתמך, ושמרו את הקלט הקטן ביותר שמפעיל כל פגם שנמצא.
תנאי קבלה¶
ההגשה כוללת קוד, הוראות בנייה, שני לקוחות, corpus של קלטים, manifest של תוצרים ודוח שמשווה לפחות שלושה קבצים ל־dumpbin. הדוח מסביר הבדל אחד בין bytes בדיסק לבין image בזיכרון.
הקבלה מחייבת שלא יהיו קריאות מחוץ לטווח בקלטים שנבדקו, שכל חישוב כתובת יהיה מוצדק ושאפשר יהיה לבנות את החבילה בתיקייה נקייה. אין להציג את הכלי כאימות מלא של כל כללי הטוען; יש להצהיר בדיוק אילו מבנים הוא מאמת ואילו פרטים הוא רק מציג.