ישנן מספר גישות לאיתור מחרוזות בקובץ לא ידוע. כזה שכבר ניסית: מחרוזות
. זה מחפש טקסט ASCII רגיל ולא מקודד:
מחרוזות מחפש מחרוזות ASCII בקובץ בינארי [..] מחרוזת היא כל רצף של 4 (ברירת המחדל) תווי הדפסה ומעלה המסתיימים בתו קו חדש או אפס. ( מחרוזות אדם
)
אך ישנן סיבות רבות לכך שגישה נאיבית זו עלולה להיכשל. ראשית: לא כל טקסט בעולם מקודד ל- ASCII. למעשה, בחינת הקובץ שלך עם עורך בינארי, תוכל למצוא תמונות גרפיות עבור הגופן המשמש במשחק בקיזוז 0x20010 - מפות סיביות מונוכרומיות של 8x16 פיקסלים. אם אתה מניח שהתו הראשון ('0') ממוספר באפס, אז 'A' נמצא במיקום 31 - בהחלט לא ASCII טקסט. כמובן, יתכן ששגרת ציור הטקסט יודעת זאת, ומזמינה מחדש הדפסת תווים על פי תוכנית זו; אבל, לאור הגיל של המשחק המסוים הזה (1987), סביר יותר שהנתונים הטקסטואליים נשמרים על פי קידוד מוזר זה.
כשלעצמו, זה לא אמור להיות תהיה בעיה.
חיפוש Google למשחק זה מספק מספר צילומי מסך, ותוכל לקרוא כמה מהטקסטים שעשויים להופיע - "הדבר האחרון שאתה זוכר", "דבר המסע ההיסטורי שלך" וכו '-, ונקודה ראויה לציון היא שנראה כי כל הטקסט נמצא ב- CAPS.
איך זה עוזר? ובכן, אם הקידוד הוא מרחוק 'רגיל', קוד התווים של 'A' עשוי להיות כל דבר, אך אתה יכול להניח בבטחה ש- code + 1
הוא 'B' , code + 2
הוא 'C' וכן הלאה. עכשיו נניח שהטקסט "THE" מופיע בכל מקום (הנחה בטוחה). הפחת את 'T' מהבית הראשון בנתונים וציין את ההבדל. הפחת את ההבדל מהבית הבא ובדוק אם הוא 'H'; אם כן, בדוק את אותו ההבדל בתוסף הבא ובדוק אם זה 'E'. שלוש פעמים זה קסם (במקרה זה), ומכיוון שהמחרוזת "THE" אמורה לעלות תכופות מאוד, אתה אמור לראות הרבה להיטים עם אותו הבדל. אז אתה יכול לכתוב שגרה מותאמת אישית ל'מרת ' כל בתים הנתונים על פי תוכנית זו, ולבדוק שוב אם אתה מוצא מחרוזות שימושיות.
זה לא עבד עבור Shadowgate.
אפשרות נוספת היא שהטקסט הוטשטש בכוונה. אפשרות פופולרית (משום ש מהירה ) הייתה XOR טקסט עם קבוע. באופן זה הטקסט לא נראה בקלות כאשר נבדק עם מציג hex, ובכל זאת ניתן היה להציגו בקלות. אז עשיתי אותו דבר כמו לעיל, רק עכשיו עם פעולת XOR במקום חיסור מתמיד. גם זה לא עבד.
הבא: בהתחשב בכך ש- SG הוא הרפתקה של טקסט, יש לכך סיבה שהכותבים ניסו להכניס כמה שיותר טקסט בזיכרון ה- NES המסכן. . למצוא דחיסה מהעולם האמיתי (ZIP, LZW) במשחק ישן כל כך הוא די נדיר, תוכניות הדחיסה נטו להיות די פשוטות. אחרי הכל, לא רק זיכרון RAM היה מוגבל אלא גם מהירות המעבד. מה אם כל תו מאוחסן כרצף של 5 סיביות? זה יחסוך זיכרון רב - כל שמונה תווים של טקסט יכולים להיות מאוחסנים בחמישה בתים בלבד, שיעור דחיסה של 62.5%.
מדוע "5 סיביות"? אנחנו מדברים כאן על טקסט באנגלית, בתוספת קומץ תווי פיסוק, פלוס ספרות (אולי) '0' עד '9'. אורך האלף-בית עצמו הוא 26 תווים, מה שמשאיר עוד 6 ערכים לכל דבר אחר - והיי, אחד מהקודים הנוספים עשוי להיות "עבור התו הבא השתמש בכל 8 הסיביות".
בדיקה כל 5 סיביות כנגד מחרוזת הבדיקה שלי (שבקריפטוגרפיה מכונה "עריסה"), מצאתי את הדברים הבאים:
מועמד בשעה 0570, דלתא היא 41 H_A \ THE [TROLL [מועמד בשעה 0670, דלתא הוא 41 _H \ ʻATHE [TROLL [מועמד בשעה 0878, דלתא הוא 41 ′ AN`QTHE [TROLL [מועמד בשעה 09E3, דלתא הוא 41 מ- ^ ה [DEPTHS מועמד בגיל 1380, דלתא הוא 41 E ] BX_ATHE [GLASS [מועמד ב- 230D, דלתא הוא 41 ID_A [השלט ^ [מועמד ב- 2375, delta הוא 41 S [ON [THEM_A \ ʻAB מועמד ב- 2390, delta הוא 41 LOW [THE ^ VISCOU מועמד ב- 2528, delta הוא 41 F ] PX_THE [STONE [מועמד ב- 25E6, דלתא הוא 36 @ CP = KTHE @? OFHBS מועמד ב- 27F8, דלתא הוא 41 YDP] ATH E [BARK [מועמד ב- 2B1E, delta הוא 41 D_H \] ה- [WATER [
.. ורבים נוספים. אתה יכול לראות שזה עובד, כי פענחתי גם כמה בתים לפני ואחרי מחרוזת הבדיקה, וזה ניתן לזהות גם כ'משהו '. 'הדלתא' המוצג הוא ההבדל בין קוד חמש-סיביות (0..31) ל- ASCII, ואתה יכול לראות שהוא 41
עבור רוב המיתרים (החריג היחיד נראה חיובי כוזב) .
כדי להבטיח ש זה נכון , ניסיתי עם עריסה אחרת: KING
(זה משחק פנטזיה):
מועמד בשעה 0661, דלתא הוא 41 Y [מסתכל [SPEAR מועמד ב- 23B4, delta הוא 41 [DRINKING [TAR_Acandidate at 2B5D, delta is 41 [DRINKING_A \ 'A מועמד ב- 8E1B, delta הוא 43 \ XVFDKINGDHEEVE מועמד ב- 146F9, delta הוא JL54HKING48A4: D
נראה שגם זה מסתדר: לא 'המלך' שציפיתי לו, אבל בכל זאת תוצאות טובות עם דלתא של 41, דברים אקראיים עם דלתא אחרת.
אבל למצוא מחרוזות שימושיות בדרך זו די בר מזל, כי כמובן אין שום ערובה שקריאה של כל 5 סיביות החל מהבית הראשון אמורה להציג משהו שימושי. יתכן שיש הרבה מיתרים אחרים בין אלה המוצגים, אך הם לא התחילו במקרה על מכפלה של 5 * 8 סיביות. נניח שלא היה טקסט בעמדה # 0, אך היה היה במיקום מס '1, אז אני לא יכול לראות את זה:
סיביות עבור בית 0,1 0000.0000 TTTT. T000 (T = סיביות תו טקסט) --- קריאה 1 סיביות 1111.1 ??? ????. ???? שני 5 ביטים - הלא נכונים! .... .111 11 ??. ????
כדי לפענח כראוי את כל המחרוזות היית עובר בדרך הבאה:
- רשימת התוצאות שלי מכילה טקסט קריא, אבל גם זבל. גלה מהו 'האשפה' (נראה כי
[
הוא שטח פשוט, אך THEM_A \ 'AB
זקוק למבט מקרוב). - מצא עד כמה שניתן מחרוזת מתחילה ורשום את כתובותיהם
- חפש בינאריות אחר כתובות אלה. אחרי הכל, אם הם 'משמשים', צריכה להיות התייחסות כלשהי אליהם.
- לפני ואחרי כתובות אלה, יהיו עוד. אלו הן כתובות של מחרוזות שאלגוריתם החיפוש לא מצא , אך עדיין עשוי להיות תקף.
- בדרך כלל, רשימה מסוג זה היא רציפה (אם כי ייתכן שיש נתונים משויך לכל מחרוזת). סרוק את הבינארי למעלה ולמטה עבור כתובות דומות, עד שתמצא מה שבטוח יהיה ההתחלה והסוף.
- דלג על הרשימה והראה כל מה שאתה יכול על פי ערכת הפענוח.
- שב וליהנות מעבודה שנעשתה היטב.