
מפתח ImHex מסביר כיצד להנדס לאחור פורמט קובץ לא מוכר
מפתח עורך ה-hex בקוד פתוח ImHex פרסם מדריך להנדסה לאחור של פורמטים בינאריים, עם קובץ השמירה של FEZ כדוגמה — מבייטים גולמיים להגדרה מלאה. בסוף המאמר הוא מכליל את השיטה לכל פורמט לא מוכר.
WerWolv, מפתח עורך ה-hex ImHex בקוד פתוח, פרסם מדריך צעד-אחר-צעד להנדסה לאחור של פורמט קובץ בינארי לא מוכר. הדוגמה היא קובץ השמירה של המשחק FEZ מ-2012 — מבייטים גולמיים ועד הגדרה מלאה בשפת ה-Pattern של ImHex. ImHex חינמי, בקוד פתוח, זמין לכל מערכת הפעלה ולמשתמשי דפדפן.
מדקומפילציה לפונקציה הנכונה
נתוני השמירה של FEZ אינם דחוסים ואינם מוצפנים ואין להם חתימת קסם, כך ששום דבר לא מזהה אותם ממבט ראשון. כיוון שהמשחק כתוב ב-C#, כלים כמו JetBrains Rider מפרקים את הבינארים בחזרה למשהו שדומה לקוד המקור. ההרכבות המעניינות התבררו כ-FEZ.exe, FezEngine.dll, Common.dll, ContentSerialization.dll ו-EasyStorage.dll. במחלקה PCSaveDevice נבנה שם הקובץ מ-"SaveSlot" ומאינדקס, והמתודה Save() ממלאת מאגר של 40,960 בייטים (0xA000): תחילה הזמן הנוכחי בפורמט FILETIME של Windows, אחר כך נתוני השמירה, כשקבצים קצרים מרופדים באפסים וגדולים מדי זורקים חריגה. בהמשך השרשרת, ב-SaveFileOperations.Write, נחשפים כל השדות: מספר גרסה שהקורא דורש שיהיה 6, חותמות זמן ודגלי New Game Plus. המחבר מציין שחלק מהתכונות שבהן השתמש קיימות רק בגרסת Nightly ולא במהדורה רשמית, ומזהיר שהמאמר מלא ספוילרים ל-FEZ.
בניית ה-pattern ב-ImHex
בשפת ה-Pattern המחבר מציב struct בהיסט 0, מוסיף כינויים לטיפוסים כדי שהקוד ידמה למימוש האמיתי, ומייבא מספריית התקן את הטיפוס FILETIME כדי להציג את חותמת הזמן כתאריך קריא. המחרוזות התבררו כבעלות קידומת אורך בקידוד 7-ביט: הוא מממש לולאה שקוראת בייטים עד שהביט המסמן המשך מתאפס, ומוסיף מאפייני format ו-transform להצגת הערך בממשק. אובייקטים מודלים כעטיפות nullable עם דגל בוליאני לפני ערך אופציונלי, רשימות הן מערכים עם קידומת ספירה, וה-enums עוברים מ-C# כמעט ללא שינוי. בסוף כל בייט בקובץ פרט לריפוד דקודד, ואת הערכים אפשר לבדוק ואף לערוך ישירות מהממשק.
מתכון כללי לפורמטים לא מוכרים
בסיום מכליל המחבר את התהליך: ראשית בדקו אם הפורמט מוכר — זיהוי הקסם של ImHex וכלים כמו binwalk יעזרו, ולפורמטים מתועדים אולי כבר קיימים מפרסרים. לאחר מכן מצאו את הקוד שקורא או כותב את הקובץ: עשו דקומפילציה בכלי שמתאים לשפה — Rider ל-.NET, Ghidra, IDA או Binary Ninja לקוד מקומי, Recaf לשפות JVM — וחפשו קריאות לקלט/פלט קבצים או מחרוזות עם שם הקובץ. אחר כך זהו את אבני הבניין — מספרים שלמים, ערכים בוליאניים, מחרוזות ומבני נתונים — וכתבו קובץ pattern שמתעד ומאמת את הממצאים.
לא כל תוכנית תהיה קלה לניתוח כמו FEZ, מודה המחבר, אך הגישה נשארת בעינה. ה-pattern המלא מפורסם עם הפוסט, ושאלות מתקבלות בשרת ה-Discord של ImHex.
SiTech — פיתוח אתרים בכוח ה-AI
אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.