Decompiler-VB.Net
IL
התחברות
VBReFormer Gen2 מנוע שנכתב מחדש מאפס, P-Code מלא, והסטודיו המקוון בבטא ציבורית. לקריאת ההודעה →
תיעוד
VBReFormer Desktop

מדריך VBReFormer Desktop

מדריך למשתמש של VBReFormer Desktop: התקנה, הפעלת הרישיון, קריאת שבע התצוגות, ניתוח קובץ בינארי וייצוא פרויקט VB6 שניתן לטעון מחדש ב-IDE.

עודכן ב-20.9.202614 פרקים

האפליקציה המותקנת על מחשב ה-Windows שלכם. היא פותחת את קובצי ההפעלה של Visual Basic 5 ו-6, משחזרת את קוד המקור שלהם ומחזירה לכם פרויקט ש-IDE של VB6 יכול לפתוח מחדש — עם ארגז הכלים המלא: בייטים, משאבים, מעצב, גרפים, הפניות צולבות ותיקוני בינארי.

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

1. התקנה

VBReFormer Desktop מופץ כמתקין MSI, אחד לכל שפת ממשק. החבילה עצמאית (self-contained): היא מכילה את כל מה שהיא צריכה, ואין צורך להתקין פריימוורק מראש.

דרישה
מערכת Windows 10 גרסה 1607 ומעלה, או Windows 11
ארכיטקטורה x64
פריימוורק אין — החבילה עצמאית
חיבור נדרש לדקומפילציה ולאימות הרישיון
שפות ממשק אנגלית, צרפתית, ספרדית

Windows XP, Vista, 7 ו-8 אינם נתמכים. האפליקציה מבוססת על פלטפורמה הדורשת לפחות Windows 10. אם המחשב שלכם ישן יותר, VBReFormer Online פועל בכל דפדפן ובכל מערכת — זו הדרך המומלצת במקרה כזה.

היכן פועל המנוע

האפליקציה מקומית; שחזור הקוד, לעומת זאת, מתבצע בשרתים שלנו. זו משמעות שם המהדורה — Desktop + Cloud. כל מה שנקרא מהקובץ (הפורמט, הבייטים, הדיסאסמבלי, המשאבים) מחושב במחשב שלכם; כל מה שמשוחזר עובר דרך השירות.

תיבת Help ▸ About (עזרה ▸ אודות) מציגה בכל עת את גרסת המנוע המחובר, את גרסת החוזה ואת רשימת היכולות המסופקות (Capabilities served) — שימושי כשתכונה כלשהי אינה מופיעה: אם היא אינה ברשימה הזו, לא הממשק הוא שמסרב לה.

2. הפעלת הרישיון

ללא רישיון, האפליקציה נפתחת ופועלת: ניתן לחקור קובץ בינארי, לקרוא את הדיסאסמבלי במלואו, את הבייטים, את המשאבים ואת המעצב. מה שהרישיון פותח הוא שחזור קוד ה-VB6 וייצוא הפרויקט.

תחנת עבודה אחת בכל פעם

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

זהו סירוב רך: שילמתם, שום דבר לא חסר. ההודעה אומרת זאת כך במקום להחזיר שגיאה טכנית.

גם דפדפן פתוח על VBReFormer Online נחשב כמקום: סטודיו האינטרנט ואפליקציית שולחן העבודה צורכים את אותו הרישיון.

3. החלון

  1. פתחו קובץ בינארי. File ▸ Open a VB6 binary (קובץ ▸ פתח קובץ בינארי של VB6) (Ctrl+O). הפורמטים המקובלים הם .exe, .dll, .ocx ו-.scr. שורת המצב מציגה את הניתוח המתבצע, ואחריו את שם הקובץ ואת צורת הקומפילציה שלו — קוד נייטיב (Native Code) או P-code.
  2. עיינו בפאנל PROJECT (פרויקט). משמאל, הקובץ הבינארי מוצג כפי ש-VB6 ראה אותו: טפסים, מחלקות, מודולים והפרוצדורות שלהם. העץ מתמלא לפי דרישה — הרחבת צומת מבקשת את הילדים שלו; שום דבר אינו מחושב מראש, וכך הפתיחה נשארת מהירה גם בקובץ הפעלה גדול.
  3. בחרו פרוצדורה. התצוגות של הצומת הזה מופיעות מימין. אם לא מסופקת תצוגה לצומת כלשהו, הסיבה נכתבת על המסך במקום פאנל ריק.

הפאנלים התחתונים

לשונית למה היא משמשת
Output (פלט) יומן הפעולות. הוא שומר את השפה שבה נכתבה כל שורה, גם אם משנים את שפת הממשק — יומן הוא תיעוד, לא תצוגה.
Diagnostics (אבחון) מה המנוע סירב לעשות, ולמה. הרפלקס שכדאי לאמץ ברגע שתוצאה מפתיעה אתכם.
Analyser (מנתח) הפניות צולבות: הקוראים לפרוצדורה, מופעים של סימבול. התוצאה ניתנת ללחיצה.

נראות החברים

כל חבר בעץ נושא את הנראות שלו כפי שהקובץ הבינארי מצהיר עליה — (Public), (Private), (Friend). אלו מילות מפתח של VB6: הן אינן מתורגמות. חבר שלא ניתן היה לקרוא את הנראות שלו אינו נושא סימון: איננו כותבים את מה שאיננו יודעים.

4. שבע התצוגות

הן מסודרות בשלוש משפחות, וההפרדה הזו אומרת לכם מאין מגיע מה שאתם קוראים. זה הדבר השימושי ביותר להבין.

משפחת "Code" (קוד) — משוחזרת על ידי ניתוח

תצוגה מה היא מציגה מתי להסתכל עליה
Visual Basic 6 המקור המשוחזר והמובנה כברירת מחדל — זה מה שאתם מחפשים
IR הייצוג הביניים כדי לראות מה המנוע הבין
Disassembly (דיסאסמבלי) הוראות המכונה של x86 כדי לראות מה המעבד מבצע
P-code קודי הפעולה (opcodes) של המכונה הווירטואלית של VB6 קובצי P-code בלבד

לרדת ברשימה הזו פירושו להתקרב למכונה. כשיש ספק לגבי שורה: Visual Basic 6 אומר את הכוונה, Disassembly אומר את העובדה.

משפחת "Project files" (קובצי פרויקט) — נקראת, לא מוסקת

Designer (.frm) (מעצב), Project (.vbp) (פרויקט) ו-Structure (מבנה). שום דבר כאן אינו עובר שחזור קוד: הכול נקרא מטבלאות בקובץ הבינארי, ומה שלא ניתן היה לקרוא נכתב במילים מפורשות במקום להיות מושלם. זו המשפחה האמינה ביותר במוצר, וזו שאינה תלויה בשום הסקה.

משפחת "Resources" (משאבים)

ראו פרק 9.

5. מה הקומפילציה שומרת, ומה היא זורקת

פרק זה מסביר מדוע חלקים מסוימים בקוד שלכם חוזרים כמעט שלמים ואחרים חוזרים עם שמות טכניים. הכלל פשוט:

את מה ש-Visual Basic צריך בזמן ריצה, הוא כתב לקובץ: VBReFormer מוצא זאת שוב. את מה שכבר לא היה נחוץ לו אחרי הקומפילציה, הוא זרק — ואיש אינו יכול לשחזר זאת.

מה שורד: שמות של טפסים, מחלקות ומודולים · שמות של פקדים · מטפלי אירועים · חברים ציבוריים של מחלקות · כל מאפיין ממשק · קריאות ל-runtime של VB (635 פונקציות) · Win32 API (15,680 חתימות) · מבנה הקוד · המחרוזות.

מה לא נמצא בקובץ: הערות · שמות של משתנים מקומיים · שמות של פרמטרים · קבועים בעלי שם, שהוחלפו בערכם · שמות של פרוצדורות במודולי .bas · ההזחה המקורית · Option Explicit ו-Enum.

המשמעות המעשית. הטפסים שלכם חוזרים קריאים מאוד. מודולי ה-.bas שלכם חוזרים נכונים, אבל עם שמות טכניים (proc_42C506). פונקציית Rename (שינוי שם) (F2) קיימת בדיוק לשם כך, והיא מפיצה את השם החדש לכל אתר קריאה בפרויקט — ראו פרק 7.

שתי דוגמאות שניתן לאמת

הקטעים שלהלן לקוחים מ-SETUP1.EXE, אשף ההתקנה המצורף ל-Visual Basic 6. Microsoft מפיצה את קוד המקור שלו באותה תיקייה — כך שתוכלו לחזור על ההשוואה בעצמכם.

פרוצדורה במודול .bas

קוד המקור המקורי, COMMON.BAS:

Sub AddDirSep(strPathName As String)
    If Right(Trim(strPathName), Len(gstrSEP_URLDIR)) <> gstrSEP_URLDIR And _
       Right(Trim(strPathName), Len(gstrSEP_DIR)) <> gstrSEP_DIR Then
        strPathName = RTrim$(strPathName) & gstrSEP_DIR
    End If
End Sub

כפי שמוצג על ידי VBReFormer:

Public Sub proc_42C506(ByRef arg_8 As String)
    If ((Right(Trim(arg_8), Len("/")) <> "/") And (Right(Trim(arg_8), Len("\")) <> "\")) <> 0 Then
        arg_8 = (RTrim$(arg_8) & "\")
    End If
End Sub

לוגיקה זהה, שורה אחר שורה. Right, Trim, Len, RTrim$ נושאות שם; העברת ה-ByRef הוסקה נכון. לעומת זאת, שם הפרוצדורה ושם הפרמטר אבדו, והקבועים מופיעים כערכם — הקומפיילר החליף אותם, לא VBReFormer.

מטפל אירועים

קוד המקור המקורי, BEGIN.FRM:

Private Sub cmdExit_Click()
    ExitSetup Me, gintRET_EXIT
End Sub

כפי שמוצג על ידי VBReFormer:

Private Sub cmdExit_Click()
    Set var_18 = Me
    basSetup1.proc_41CE2D var_18, var_1C
End Sub

שם הטופס, שם הכפתור ושם המטפל שלמים; Me מזוהה; המודול הנקרא נושא שם, וזה אומר לכם לאן ללכת. רק הפרוצדורה הנקראת, השוכנת ב-.bas, שומרת על שם הכתובת שלה.

הסמנים

VBReFormer לעולם אינו מנחש. ערך שלא ניתן לקבוע מסומן במקום להיות מומצא — ערך סביר ושגוי הוא התוצאה הגרועה ביותר שדקומפיילר יכול להפיק.

סמן משמעות מה לעשות
proc_42C506 פרוצדורה המזוהה לפי כתובתה לשנות את שמה (F2)
var_18, arg_8 משתנה מקומי או פרמטר לקרוא את השימוש בו, ואז לשנות את שמו
vtbl_3C קריאה דרך טבלה וירטואלית שלא נפתרה ה-Object Browser (דפדפן האובייקטים) אומר לעיתים קרובות באיזו ספרייה מדובר
? ערך שלא נקבע להסתכל בתצוגת Disassembly באותו מקום

קובץ המכיל ? יידחה על ידי ה-IDE של VB6. הסמן נמצא שם כדי שאתם תחליטו, לא כדי שיקומפל מחדש כמות שהוא.

6. כלי הניתוח

כאן מהדורת שולחן העבודה שונה ביותר: היא מציעה שולחן עבודה מלא, בעוד סטודיו האינטרנט מתרכז בקריאה, בדקומפילציה ובייצוא.

כלי קיצור מה הוא נותן לכם
Analyse references (ניתוח הפניות) Shift+F12 הקוראים לפרוצדורה, מופעים של סימבול — תוצאה ניתנת ללחיצה, והכיסוי מכומת: מה שהניתוח אינו רואה נספר, לא מושתק
Symbol list (רשימת סימבולים) Ctrl+Shift+S המלאי המלא, ניתן לסינון לפי סוג ולפי טווח — היא מבחינה בין שמות שנקראו לשמות שסונתזו
Call graph (גרף קריאות) Ctrl+Shift+A מי קורא למה, בשלושה קני מידה, עם מסנני קוראים / נקראים
Control-flow graph (גרף זרימת בקרה) Ctrl+Shift+G צורת הפרוצדורה: בלוקים, לולאות, קשתות אחוריות, בלוקים בלתי נגישים
Object Browser (דפדפן האובייקטים) Ctrl+Shift+B "איפה זה מוגדר?" כשהתשובה נמצאת מחוץ לקובץ הבינארי
API Browser (דפדפן ה-API) Ctrl+Shift+P אבות-טיפוס, כינויים והערות של הצהרות ה-Win32
Cited libraries (ספריות מצוטטות) Ctrl+K במה תלוי הקובץ הבינארי
Find VB programs (חיפוש תוכניות VB) Ctrl+L מציאת קובצי ההפעלה של VB בתיקייה
Find (חיפוש) Ctrl+Shift+F חיפוש טקסט בכל התצוגות המסופקות
Bookmarks (סימניות) Ctrl+F2 לסמן מקומות ולחזור אליהם (F8 / Shift+F8)
Back / forward navigation (ניווט אחורה / קדימה) Alt+← Alt+→ כמו בדפדפן

מדוע הכיסוי מכומת. גרף הקריאות של קוד נייטיב רואה קריאות ישירות; הוא אינו רואה קריאות דרך טבלאות וירטואליות ולא מצביעים לפונקציות. במקום להציג רשימה חלקית כמלאה, VBReFormer מציג את מה שהוא משמיט, ספור. כך אתם יודעים עד כמה לסמוך על התוצאה.

7. שינוי שם

זו הפעולה המרכזית בעבודה על קובץ בינארי: הדקומפיילר מחזיר לכם את הלוגיקה, אתם מחזירים לו את השמות. F2 על סימבול, או מרשימת הסימבולים.

התיבה מציגה שלושה דברים שדקומפיילרים בדרך כלל מסתירים:

  • מקור השם הנוכחי — ניתן על ידכם, הוסק על ידי הדקומפיילר, או שוחזר;
  • הצעות הדקומפיילר, כל אחת עם העדיפות שלה והמקור שממנו היא מגיעה;
  • השם המקורי, שאליו תמיד ניתן לחזור.

שינוי השם גלובלי. שנו את שם הפרוצדורה פעם אחת, ואתרי הקריאה במודולים האחרים יעקבו — כולל אלה שעדיין לא פתחתם.

שינוי שם שנדחה נדחה תמיד עם הסיבה שלו. שני מקרים נפוצים: המנוע אינו מכריז על יכולת שינוי השם במסמך הזה, או שהתצוגה הנוכחית נושאת רק מקטעים לקסיקליים — מספיק כדי לצבוע את הטקסט, לא מספיק כדי להצביע על ישות. בשני המקרים ההודעה אומרת זאת, במקום לא לעשות דבר.

8. בייטים ותיקוני בינארי

Navigate ▸ Show bytes (ניווט ▸ הצג בייטים) (Ctrl+Shift+H) פותח את תצוגת ה-hex המוערת: היא לא רק מציגה בייטים, היא אומרת מה כל אזור מייצג. Go to address (עבור לכתובת) (Ctrl+G) מביא אתכם לשם ישירות.

שינוי קובץ ההפעלה

מצב "raw" מאפשר לכתוב בייטים ולהפיק קובץ הפעלה ששונה. הוא תחום בארבעה סירובים, וכל אחד מהם מגן על משהו:

סירוב למה
הקובץ המנותח לעולם אינו היעד המנוע לעולם אינו פותח אותו לכתיבה; הממשק אינו מבטל את הערובה הזו
דריסת קובץ קיים דורשת אישור "לא ניתן לבטל פעולה זו"
חתימת ה-Authenticode תוסר הסכמתכם מתבקשת מראש; תוכלו לחתום מחדש באישור משלכם
תיקון שנדחה אינו כותב דבר אין קובץ כתוב למחצה

סטודיו האינטרנט אינו מציע תיקוני בינארי או את תצוגת ה-hex: אלו שתי פונקציות ייחודיות למהדורת שולחן העבודה.

9. משאבים ומעצב

משאבי הקובץ הבינארי

סמלים, סמנים, מפות סיביות, טבלאות מחרוזות, פרטי גרסה: כל מה שקובץ .res היה נושא. כל רשומה מציגה את סוגה, את גודלה ואת מה שניתן לעשות איתה, וחילוץ אפשרי רשומה אחר רשומה או בבת אחת.

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

מעצב הטפסים

משטח הטופס מצויר כפי ש-VB6 היה מציג אותו, מתוך המאפיינים שנקראו בקובץ הבינארי, בסדר הציור הנכון. ניתן לייצא את תמונת הטופס (Ctrl+I).

המאפיינים הם לקריאה בלבד: VBReFormer יודע לקרוא את משטח הטופס, הוא עדיין אינו יודע לכתוב אותו מחדש לתוך קובץ ההפעלה המקומפל. ראו פרק 13.

10. ייצוא הפרויקט

  1. בדקו תחילה את פאנל Diagnostics. הוא אומר מה לא ניתן היה לעשות. קריאתו לפני הייצוא חוסכת לכם לחפש אחר כך מדוע רכיב חסר.
  2. File ▸ Export the VB6 project (קובץ ▸ ייצא את פרויקט ה-VB6). בחרו תיקיית יעד ריקה.
  3. קראו את הערות הייצוא. VBReFormer כותב מה לא הצליח לשחזר, ולמה. מידע מסוים — הפניות חיצוניות, אפשרויות קומפילציה, מצב ההפעלה — אינו נמצא בשום מבנה של הקובץ הבינארי: הוא לא נמחק, הוא מעולם לא היה שם. הוא מסומן במקום להיות מומצא.
  4. פתחו את ה-.vbp ב-Visual Basic 6. הכותרות שה-IDE דורש (VERSION, Attribute VB_Name) נכתבות. אם הפניה חסרה, הוסיפו אותה דרך Project ▸ References (פרויקט ▸ הפניות).

שני סירובי כתיבה שמגנים עליכם. קובצי VB6 נכתבים ב-ANSI 1252. VBReFormer מסרב לכתוב אם ערכת התווים הזו אינה זמינה במחשב — כתיבה בערכה אחרת הייתה מפיקה קובץ שגוי בשקט — או אם תו בקוד שלכם אינו קיים בה, ובמקרה כזה הוא אומר לכם איזה תו ומהי נקודת הקוד שלו.

11. האפשרויות

הגדרה מה היא עושה
Indentation width (רוחב הזחה) חלה רק על הקוד המשוחזר: הדיסאסמבלי, ה-IR, ה-P-code, בלוק המעצב וה-.vbp אינם מעוצבים על ידי עורך זה.
Code page (designer) (דף קוד (מעצב)) הדף שבו נקראים הכיתובים והטקסטים של המעצב. קובץ בינארי של VB6 אינו מצהיר על הדף שלו בשום מקום — נמדד על 236 קבצים בינאריים. אם תוויות הטופס מוצגות כתווים לא עקביים, זו ההגדרה שיש לשנות.
Group under With…End With (קיבוץ תחת With…End With) כבוי כברירת מחדל. הפלט מוסמך במלואו (Frame1.Caption), מפני שהקומפיילר מפרק את בלוקי ה-With ובנייתם מחדש הייתה ניחוש. הפעילו אותו אם אתם מעדיפים קריאות על פני נאמנות מילולית.
Syntax colouring (צביעת תחביר) תפקיד אחד, צבע אחד — התפקידים מגיעים מהמנוע, שאומר מהו כל מקטע. סימון #RRGGBB; פלטה לא תקינה אינה מוחלת למחצה.
Interface language (שפת ממשק) אנגלית, צרפתית, ספרדית — השינוי מיידי.

הגדרות העיבוד נשלחות עם כל בקשת תצוגה; הן לעולם אינן נקבעות כמצב של הסשן. לכן שינוי ההזחה אינו מנתח דבר מחדש.

12. קיצורי מקלדת

קיצור פעולה
Ctrl+O פתיחת קובץ בינארי של VB6
F2 שינוי שם הסימבול שתחת הסמן
Shift+F12 ניתוח הפניות
Ctrl+Shift+F חיפוש בפרויקט
Ctrl+G מעבר לכתובת
Ctrl+Shift+H הצגת בייטים
Ctrl+Shift+S רשימת סימבולים
Ctrl+Shift+B Object Browser
Ctrl+Shift+P API Browser
Ctrl+Shift+G גרף זרימת בקרה
Ctrl+Shift+A גרף קריאות
Ctrl+K ספריות מצוטטות
Ctrl+L תוכניות VB בתיקייה
Ctrl+F2 הפעלה/ביטול של סימנייה
F8 / Shift+F8 סימנייה הבאה / הקודמת
Ctrl+Shift+F2 רשימת סימניות
Alt+← / Alt+→ ניווט אחורה / קדימה
Ctrl+I שמירת תמונת הטופס

13. מגבלות ידועות

שינוי הממשק של קובץ הפעלה מקומפל

VBReFormer קורא את משטח הטופס ואת כל מאפייניו — הוא עדיין אינו יודע לכתוב אותם מחדש לתוך קובץ ההפעלה. החלפת משאב מוטמע והוספת מאפיין מוסתר ללא קומפילציה מחדש אינן זמינות. תיקוני בינארי — כתיבת בייטים בכתובת — זמינים (פרק 8).

משאבי .ctx של UserControl

שום קובץ .ctx אינו נכתב בייצוא. אם הפרויקט שלכם מכיל UserControl עם משאבים שנשמרו, את החלק הזה יש לבנות מחדש.

Windows לפני 10

השתמשו ב-VBReFormer Online: דפדפן מספיק, תהא המערכת אשר תהא.

מה ששום דקומפיילר אינו עובר

הערות, שמות של משתנים מקומיים, קבועים בעלי שם: הם אינם בקובץ. ראו פרק 5.

14. שאלות נפוצות

פונקציה בתפריט אינה מגיבה. למה? פתחו את Help ▸ About והסתכלו ברשימת היכולות המסופקות. אם הפונקציה אינה שם, לא הממשק הוא שמסרב: המנוע אינו מספק אותה למסמך הזה. גם הודעות האפליקציה אומרות זאת במפורש.

האם הקוד המיוצא מתקמפל מחדש כמות שהוא? לעיתים קרובות: במערך בדיקה של 149 פרויקטים, 121 מתקמפלים מחדש ללא נגיעה. האחרים דורשים הוספת הפניה או טיפול בכמה סמנים.

התוויות בטופס שלי אינן קריאות. זה דף הקוד. קובץ בינארי של VB6 אינו מצהיר בשום מקום על הדף של טקסטי המעצב שלו — הגדירו אותו באפשרויות (פרק 11).

מדוע הטפסים שלי קריאים יותר מהמודולים שלי? מפני ש-VB6 שומר את שמות הפקדים והאירועים כדי לפעול, בעוד שהוא פותר פרוצדורות של מודולים לכתובות פשוטות. ראו פרק 5.

קובץ ההפעלה שלי ארוז (packed). האם זו בעיה? כן: יש לפרוק אותו תחילה, אחרת מבני ה-VB6 אינם נראים בקובץ.

האם ניתן לבצע דקומפילציה ל-.ocx או ל-.dll של ActiveX? כן, ומלאי החברים הציבוריים בדרך כלל עשיר יותר שם, מכיוון ש-COM דורש לתת להם שמות.

האם הקובץ הבינארי שלי נשלח לאנשהו? קריאת הפורמט, הבייטים, הדיסאסמבלי והמשאבים מעובדים במחשב שלכם. שחזור הקוד מתבצע בשרתים שלנו — זו משמעות מהדורת Desktop + Cloud.

האם זה חוקי? זה תלוי בתחום השיפוט שלכם ובזכויותיכם על הקובץ הבינארי. השימוש המיועד הוא שחזור הקוד שלכם, או קוד שיש לכם עליו זכויות או הרשאה.