שְׁאֵלָה:
חילוץ מחרוזות ממזבלה של iNES ROM
user3094
2013-11-02 18:42:02 UTC
view on stackexchange narkive permalink

אני רוצה לחלץ את המיתרים ב- Shadowgate עבור NES. רצתי על התמונה קובץ ואז מחרוזות , אין מזל. מצאתי מידע על פורמט קובץ המחסנית NES. המסמכים מזכירים את השימוש ב"טבלאות שם ". האם יש דרך לפרק את הקובץ הזה ולהציג את המיתרים? ניסיתי

  מיתרים -e -T rom.bin  

ניסיתי גם:

  objdump -i rom. סל  

המעבד נראה מעבד M6502 ויש פרקי חלונות זמינים.

אם תקרא את המסמך הזה, תראה של"טבלת השמות "אין שום קשר עם * מחרוזות *. נראה כי זה מתייחס לדרך NES לאחסון * אריחי ספרייט *, המשמשים לגלילת רקעים.
אם אתה אומר זאת - "מחרוזת 0-3" NES ^ Z "נהגה לזהות קבצי NES." למרבה הצער זו הייתה ההתייחסות היחידה ל'מחרוזת 'שיכולתי למצוא במסמך זה. אני לא האקר של iNES - אני מניח שאתה כן? ההגדרה C של מחרוזת היא "abcd \ 0" - זה כשלעצמו לא אומר לנו שום דבר על האופן שבו המחרוזת הולכת להיות מצויירת, נכון? "טבלאות שם" נידונות תחת "זיכרון PPU" וזה מה שאומר: "טבלת שמות דומה מאוד למאגר מסך מצב הטקסט המכיל קודי תווים שיוצגו על המסך." אנא קרא בזהירות "דומה מאוד למאגר המסך במצב טקסט"
האם מחרוזות לא נכתבות למאגר מסך טקסט?
טבלת השם מיועדת למרצפות מהו חיץ הטקסט לטקסט - לכן הם "מאוד * דומים *", אך לא * שווים *. באשר לשאלתך המקורית: 'מחרוזות' מחפש סוג טקסט מאוד ספציפי: טקסט ASCII בלבד. סרקתי את הקובץ שלך אחר מחרוזות שאינן ASCII ולא מצאתי (שימושי או אחר). על המיתרים להיות מוצפנים או דחוסים, וייתכן שיהיה צורך בפירוק כדי למצוא אותם.
זה מה שעמוד האיש עבור מחרוזות אומר: "-e קידוד בחר את קידוד התווים של המחרוזות שנמצאות ... שימושי למציאת מחרוזות תווים רחבות." או מקודד?
-T bfdname ציין פורמט קוד אובייקט שאינו פורמט ברירת המחדל של המערכת שלך.
אחד תשובה:
usr2564301
2013-11-03 04:37:00 UTC
view on stackexchange narkive permalink

ישנן מספר גישות לאיתור מחרוזות בקובץ לא ידוע. כזה שכבר ניסית: מחרוזות . זה מחפש טקסט 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 זקוק למבט מקרוב).
  • מצא עד כמה שניתן מחרוזת מתחילה ורשום את כתובותיהם
  • חפש בינאריות אחר כתובות אלה. אחרי הכל, אם הם 'משמשים', צריכה להיות התייחסות כלשהי אליהם.
  • לפני ואחרי כתובות אלה, יהיו עוד. אלו הן כתובות של מחרוזות שאלגוריתם החיפוש לא מצא , אך עדיין עשוי להיות תקף.
  • בדרך כלל, רשימה מסוג זה היא רציפה (אם כי ייתכן שיש נתונים משויך לכל מחרוזת). סרוק את הבינארי למעלה ולמטה עבור כתובות דומות, עד שתמצא מה שבטוח יהיה ההתחלה והסוף.
  • דלג על הרשימה והראה כל מה שאתה יכול על פי ערכת הפענוח.
  • שב וליהנות מעבודה שנעשתה היטב.
וואו! מגניב! תודה :) זה היה מאוד ברור!
הנה חוסך זמן שאולי תרצה לדעת עליו: קובץ הקלט מורכב ממספר חלקים (אני חושב שזה מחקה את שבבי ה- ROM הפיזיים המקוריים). 16 הבתים הראשונים הם 'כותרת' וניתן להתעלם מהם. לאחר מכן עקוב אחר 65,536 בתים של קוד, והשאר נתונים גרפיים - לא מעניינים למטרתך. אתה צריך רק לסרוק את חלק הקוד.
היי! השתמשת בכלי לביצוע הסריקה ?? אני משתמש בפיתון כדי לתסריט באופן ידני.
מוזר נוסף של ה- ROM: המחצית הראשונה והמחצית השנייה של תמונת 64K מוחלפות! לא פלא שלקח לי 3.00 / לילה למצוא משהו שימושי. אגב, רשימה של קיזוזי מחרוזת שימושיים היא ב- '0x8000' (לאחר תיקון קובץ התמונה של ה- ROM); למשל, בקיזוז A182: "האם ידעת? תביא ^ לי (את) תשובה ל ^ רידל שלי ואני אתן ^ הם יעברו." אה, ואני משתמש ב- C. פשוט שלא השפה חשובה - כל עוד אתה יכול לתפעל זרמי ביט, אתה טוב.
למעשה, שורט קצת על חצאי ה- ROM. העניין כולו * בהחלט * לא בסדר הגיוני, אבל זה לא קל כמו שהבנתי. זה צריך האקר NES-ROM אמיתי כדי להבין את זה. קריעת מחרוזות עדיין עובדת, אך החלק 'קיזוז איתור' אינו יכול אם אינך יכול לקבל כתובות 'אמיתיות'.
נקודה אחרונה: צדקתי בהתחשבותי בקידוד 5 סיביות: אחד מקודי 5 הסיביות מייצג 'השתמש ב * הבא * 8 סיביות' (מה שמעיד על טבלת בדיקה נוספת). כך בדרך זו אתה יכול לפענח את כל הטקסטים, באמצעות גישה כוח ברוטה אשר פשוט מנסה * כל * בתים בודדים כנקודת התחלה (וכך הוא מייצר גם זבל רב).


שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...