מחפש 16 bit disassembler

  • פותח הנושא m242
  • פורסם בתאריך

m242

New member
מחפש 16 bit disassembler

למישהוא יש מושג איפה להשיג תוכנה שעושה 16 bit disassembler לתוכנית שקומפלה בדוס שדרך אגב ניכתבה בMASM? תודה
 

voguemaster

New member
כן

יש יותר מאחד שיעשה עבורך את העבודה. הראשון הוא w32dasm או בשמו המלא: win32 disassembler. הוא אמור לתמוך ב-EXE הישן של DOS. יכול להיות שגם ollydbg יכול לתת לך את מה שאתה רוצה, לא בדקתי. בנוסף, יש מגוון HEX EDITORS שתומכים ב-disassembly גם עבור EXE של DOS. אחד מהם הוא HIEW. אבל, הטוב מכולם לסביבת DOS הוא לא אחר מאשר SOURCER. הגרסא האחרונה היא 8 עד כמה שידוע לי, אבל גם 7 גרסא מצוינת! ולצורך העניין, זה לא משנה אם התוכנית "קומפלה" ע"י MASM או TASM או NASM או כל אסמבלר אחר. בסופו של דבר זו שפת מכונה
 

m242

New member
האם אני אמור לראות את הסורס של

קוד האסמבלי שהקובץ קומפל בו? אני אסביר בפשטות יש לי קובץ exe שניבנה ע"י אסמבלר , ואני רוצה לראות את הסורס שלו (שזה אסמבלר )
 

selalerer

New member
Assembly זאת לא שפה מקומפלת ממש.

זה בסך הכל מקבילה טקסטואלית לשפת מכונה. הsource הוא בסך הכל דרך שונה להסתכל על אותם נתונים, כל disassember יעשה לך את זה.
 

m242

New member
אני רוצה להבין משהו

האם אני יכול לקבל את הסורס של ה exe בדיסאמבלר זאת אומרת אם exe עצמו ניבנה עם קוד asm?
 

selalerer

New member
אתה לא מבין מה זה assemly.

התרגום שמתבצע בין assembly לשפת מכונה (EXE במילים שלך) זה תרגום אחד לאחד, כלומר לכל פקודת assembly יש קוד מקביל בשפת מכונה וההיפך. כלומר ניתן לתרגם הלוך חזור כמה פעמים שתרצה בלי לאבד מידע או לקבל מידע שונה מהמקור. כל disassembler יוכל להראות לך את הקוד assembly של הEXE, לא בגלל שהוא מקומפל ביחד איתו, אלא פשוט כי המידע ניתן לתירגום באופן חד ערכי חזרה לAssembly (שממנו הוא אולי נוצר [יכול להיות שנוצר בשפות אחרות]).
 

m242

New member
עוד חידוד כי אני לא מבין

האם קוד asm הוא לא אותו קוד שהדיסאמבלר מציג? כי אם אני עושה דיסאמבלר ל exe שנכתב ב asm וקומפל בmasm אני רואה קוד asm אבל הוא לא אחד לאחד הקוד שממנו ניכתב ה אותו exe
 

selalerer

New member
יש כמה פטנטים נוספים שהMASM...

...ואחרים עושים על הקוד, כמו macroים הכרזה על subroutineות, שימוש בפרמטרים ע"פ שם בתוך הsubroutineות וכו'. בתור מתכנת Assemly אתה צריך לדעת מה קורה שם מאחורי הקלעים, וזה בדיוק מה שאתה רואה בקוד שמתורגם לך חזרה ע"י הdisassembler. אם אתה יודע מה הקוד Assembly שנוצר כאשר אתה כותב subroutine בMASM אז לא יהיה לך בעיה לזהות את זה. בעיקרון אתה יכול לכתוב בAssembly בלי שימוש בכל הכלים הנוספים הללו ואז באמת הקוד של הdisassemly יהיה זהה לחלוטין לזה שכתבת. בקיצור, אתה צריך להכיר את הפטנטים של הAssembler בשביל להבין את מה שאתה רואה, או לא להשתמש בפטנטים שלו.
 

tseliot

New member
אוקי, נחדד--

תחשוב שנתנו לך קוד מורס (זה שמאותתים איתו SOS וכדומה, אתה יודע, קווים ונקודות). עכשיו, אתה לא יודע לקרוא מורס אז אתה קורא למתורגמן שהופך כל אות מורס כזה לאות עד שאתה מקבל דף יפה שאתה יכול לקרוא. הקוד שבתוך קובץ הEXE זה המורס, והקוד מקור זה הדף שאתה יכול לקרוא- שניהם מציגים את אותו מידע, רק אחד בצורה שפחות נהירה לבני אדם (בינארית) ואחד בצורה שהרבה יותר קלה לקריאה (אותיות ומילים שמסמלות איזו פעולה מתבצעת עכשיו). אם אתה לא רואה קוד שהוא אחד לאחד זהה למקור, זה יכול להיות בגלל כל מיני אופטימיזציות, או בגלל חוסר יכולת של הDISASSEMBLER לנחש מה היתה כוונת המתכנת...
 

voguemaster

New member
או בגלל 80 מיליון דברים אחרים

אין מיפוי מושלם בחזרה לקוד מקור. גם לא יהיה. יש קוד מקור שהוא "שקול" מבחינת מה שהוא מבצע לקוד המקורי של האפליקציה אבל לא מתקמפל (99 אחוז שלא יתקמפל).
 

tseliot

New member
את האמת, אני לא מבין גדול בASM

כלומר, קראתי את הספר שלומדים ממנו בתיכון עליה, אבל לא ממש תכנתתי בה. לכן קצת קשה לי להבין איך שפה שיש בה יחס של אחד לאחד בין המקור לתוצאה, לא תפיק את אותו הדבר גם לאחר המרה הלוך ושוב (אם נחזור לדוגמא שלי עם המורס, גם אם הוא יתרגם עשרים אלף פעם את ההודעה ממורס לעברית ומעברית למורס, זה עדיין יהיה אותו הדבר).
 

m242

New member
רב תודות לכם עוד שאלה

האם יש מצב להוציא את קוד המקור המקורי של קובץ שעבר דיסאמבלר בהנחה שהקוד בראשיתו היה asm
 

selalerer

New member
עזוב את המורס. מורס זה לא Assembly.

כל הAssemblerים נותנים לך כלים נוספים מעבר לרק לכתוב את הפקודת מכונה בתחביר של Assembly. הכלים האלה מקצרים לך את העבודה בתור מתכנת כי הם יוצרים קוד אוטומאטית וזה הקוד שמשתנה לך בתרגום הלוך וחזור. אבל לו היה Assembler שלא היה מספק לך את הכלים האלה, היית צריך לכתוב ידנית את הקוד שהם עושים אוטומאטית ואז לא היה משתנה דבר בתרגום הלוך וחזור כי לא נוסף לך כלום אוטומאטית. אני אתן דוגמא עם MACRO (למרות שאני לא זוכר את התחביר המדוייק):
MACRO PUT5INAX() MOV AX,5 END MACRO ;... ;code segment: PUT5INAX() MOV BX,7 ;...​
אם כתבת קוד כזה ואז תתרגם אותו לEXE ואז תתרגם חזרה לAssembly, הקוד שיהיה לך הוא זה:
;code segment: MOV AX,5 MOV BX,7​
שזה לא בדיוק אותו דבר כמו מה שאתה כתבת אבל זה כן אותם פקודות שהיית כותב לו היית עושה את העבודה הזו ללא MACRO.
 

m242

New member
ואם אני מקמפל את זה זה יתקמפל?

את התוצאה שהדיסאמבלר עשה
 

selalerer

New member
זה תלוי בdisassembler.

יכול להיות disassembler שמביא לך רק את הcode segment, אז תצטרך ליצור את המבנה הכללי שהassembler מצפה לו ולהכניס בdata segment משתנים בעלי כתובות וגדלים שהקוד מצפה להם ולעשות stack segment מספיק גדול ואולי גם segmentים נוספים שהקוד מצפה להם, אבל בעיקרון (על אף שזאת עבודה קשה ומעצבנת) ניתן לשחזר את כל המידע הזה מהקוד וליצור קוד שייתקמפל. יכול להיות לך גם disassembler יותר משוכלל שנותן לך את כל הsegmentים ואז העבודה שלך יותר קלה. ויכול להיות לך גם disassembler שממש מכניס לך את הכל לתוך שלד של תוכנית שהassembler יכול לקמפל מייד. הכל תלוי בכלי שאתה משתמש בו ומה הוא בדיוק הפלט שלו.
 

tseliot

New member
אבל לפי VOGUEMASTER

יש 80,000 סיבות לזה. על מקרו גם אני חשבתי, אבל הוא טוען שיש עוד הרבה דברים שיכולים לגרום לזה... מה למשל?
 

selalerer

New member
למשל:

.small​
ולמשל כל התחביר של subroutines שבא במקום לכתוב ככה:
sub1: MOV AX,SP+4;parameter... ret​
ואולי העובדה שהוא מקמפל לEXE ולא לa.out גורמת לו גם להוסיף לקוד איזה פקודה או שניים בהתחלה ובסוף.
 

voguemaster

New member
למשל

פונקציות inline, כל מיני invokeים, כל מיני הגדרות של structים (כן אפשר להגדיר באסמבלי מבנים), כל מיני תרגומים של DIRECTIVES לשפת מכונה וכו'. ובנוסף, לא נתעלם מהדבר הכי מעצבן - בדיסאסמבלי לא מקבלים בחזרה את ה-SYMBOLS המקוריים, כלומר שמות משתנים, פונקציות והערות.
 
למעלה