Decompiler-VB.Net
PL
Zaloguj się
VBReFormer Gen2 Silnik napisany od nowa, pełna obsługa P-code i studio online w publicznej wersji beta. Przeczytaj zapowiedź
Dokumentacja
VBReFormer Desktop

Podręcznik VBReFormer Desktop

Podręcznik użytkownika VBReFormer Desktop: instalacja, aktywacja licencji, siedem widoków, analiza binarium, eksport projektu VB6 do ponownego wczytania w IDE.

Zaktualizowano 20.09.202614 rozdziałów

Aplikacja instalowana na komputerze z Windows. Otwiera pliki wykonywalne Visual Basic 5 i 6, odtwarza ich kod źródłowy i zwraca projekt, który IDE VB6 ponownie otwiera — z pełnym warsztatem: bajty, zasoby, projektant, grafy, odwołania krzyżowe i łatki binarne.

Uwaga o tłumaczeniu. Interfejs aplikacji desktopowej istnieje po angielsku, francusku i hiszpańsku. Ten podręcznik podaje nazwy menu i widoków po angielsku, tak jak pojawiają się w aplikacji.

1. Instalacja

VBReFormer Desktop jest dostarczany jako instalator MSI, jeden na każdy język interfejsu. Pakiet jest samodzielny: zawiera wszystko, czego potrzebuje, nie trzeba wcześniej instalować żadnego frameworka.

wymaganie
System Windows 10 w wersji 1607 lub nowszej, albo Windows 11
Architektura x64
Framework brak — pakiet jest samodzielny
Połączenie wymagane do dekompilacji i weryfikacji licencji
Języki interfejsu angielski, francuski, hiszpański

Windows XP, Vista, 7 i 8 nie są obsługiwane. Aplikacja opiera się na platformie wymagającej co najmniej Windows 10. Jeśli komputer jest starszy, VBReFormer Online działa w dowolnej przeglądarce, na dowolnym systemie — w takim przypadku to zalecana droga.

Gdzie pracuje silnik

Aplikacja jest lokalna; odtwarzanie kodu natomiast działa na naszych serwerach. To właśnie oznacza nazwa edycji — Desktop + Cloud. Wszystko, co jest odczytywane z pliku (format, bajty, deasemblacja, zasoby), jest obliczane na Twoim komputerze; wszystko, co jest odtwarzane, przechodzi przez usługę.

Okno Help ▸ About w każdej chwili podaje wersję podłączonego silnika, wersję kontraktu oraz listę udostępnianych możliwości (Capabilities served) — przydatne, gdy jakaś funkcja się nie pojawia: jeśli nie ma jej na tej liście, to nie interfejs jej odmawia.

2. Aktywacja licencji

Bez licencji aplikacja otwiera się i pracuje: możesz badać binarium, czytać całą deasemblację, bajty, zasoby i projektanta. Licencja otwiera odtwarzanie kodu VB6 i eksport projektu.

Jedno stanowisko naraz

Licencja VBReFormer otwiera jedno stanowisko pracy naraz. Jeśli używasz jej już gdzie indziej, aplikacja mówi to wprost i proponuje dwa wyjścia: przeniesienie licencji na ten komputer z Twojego konta albo dodanie stanowiska.

To łagodna odmowa: zapłaciłeś, niczego Ci nie brakuje. Komunikat mówi to w ten sposób zamiast zwracać błąd techniczny.

Przeglądarka otwarta na VBReFormer Online również liczy się jako stanowisko: studio internetowe i aplikacja desktopowa zużywają tę samą licencję.

3. Okno

  1. Otwórz binarium. File ▸ Open a VB6 binary (Ctrl+O). Akceptowane formaty to .exe, .dll, .ocx i .scr. Pasek stanu pokazuje trwającą analizę, a potem nazwę pliku i jego formę kompilacji — kod natywny lub P-code.
  2. Przejrzyj panel PROJECT. Po lewej binarium jest przedstawione tak, jak widział je VB6: formularze, klasy, moduły i ich procedury. Drzewo wypełnia się na żądanie — rozwinięcie węzła pobiera jego dzieci; nic nie jest liczone z góry, dzięki czemu otwieranie pozostaje szybkie nawet przy dużym pliku wykonywalnym.
  3. Wybierz procedurę. Widoki tego węzła pojawiają się po prawej. Jeśli dla węzła nie jest udostępniony żaden widok, powód jest wypisany na ekranie zamiast pustego panelu.

Dolne panele

karta do czego służy
Output dziennik operacji. Zachowuje język, w którym zapisano każdą linię, nawet po zmianie języka interfejsu — dziennik jest zapisem, nie wyświetlaczem.
Diagnostics to, czego silnik odmówił zrobić, i dlaczego. Odruch, jaki warto mieć, gdy tylko wynik zaskakuje.
Analyser odwołania krzyżowe: wywołujący daną procedurę, wystąpienia symbolu. Wynik jest klikalny.

Widoczność składowych

Każda składowa drzewa nosi swoją widoczność tak, jak deklaruje ją binarium — (Public), (Private), (Friend). To słowa kluczowe VB6: nie są tłumaczone. Składowa, której widoczności nie udało się odczytać, nie ma żadnego oznaczenia: nie piszemy tego, czego nie wiemy.

4. Siedem widoków

Są podzielone na trzy rodziny, a ten podział mówi, skąd pochodzi to, co czytasz. To najważniejsza rzecz do zrozumienia.

Rodzina „Code” — odtworzona przez analizę

widok co pokazuje kiedy do niego zaglądać
Visual Basic 6 odtworzone, ustrukturyzowane źródło domyślnie — tego szukasz
IR reprezentacja pośrednia aby zobaczyć, co silnik zrozumiał
Disassembly instrukcje maszynowe x86 aby zobaczyć, co procesor wykonuje
P-code opkody maszyny wirtualnej VB6 tylko binaria P-code

Schodzenie w dół tej listy to zbliżanie się do maszyny. W razie wątpliwości co do linii: Visual Basic 6 mówi o zamiarze, Disassembly o fakcie.

Rodzina „Project files” — odczytana, nie wywnioskowana

Designer (.frm), Project (.vbp) i Structure. Nic tutaj nie przechodzi przez odtwarzanie kodu: wszystko zostało odczytane z tabel binarium, a to, czego nie dało się odczytać, jest napisane wprost zamiast uzupełnione. To najbardziej wiarygodna rodzina produktu i jedyna, która nie zależy od żadnego wnioskowania.

Rodzina „Zasoby”

Zob. rozdział 9.

5. Co kompilacja zachowuje, a co wyrzuca

Ten rozdział wyjaśnia, dlaczego niektóre części Twojego kodu wracają niemal nietknięte, a inne z nazwami technicznymi. Reguła jest prosta:

To, czego Visual Basic potrzebuje w czasie wykonania, zapisał w pliku: VBReFormer to odnajduje. To, czego nie potrzebował już po kompilacji, wyrzucił — i nikt nie może tego odzyskać.

Co przetrwa: nazwy formularzy, klas i modułów · nazwy kontrolek · procedury obsługi zdarzeń · publiczne składowe klas · wszystkie właściwości interfejsu · wywołania runtime VB (635 funkcji) · API Win32 (15 680 sygnatur) · struktura kodu · łańcuchy znaków.

Czego nie ma w pliku: komentarze · nazwy zmiennych lokalnych · nazwy parametrów · stałe nazwane, zastąpione swoją wartością · nazwy procedur w modułach .bas · pierwotne wcięcia · Option Explicit i Enum.

Praktyczna konsekwencja. Twoje formularze wracają bardzo czytelne. Twoje moduły .bas wracają poprawne, ale z nazwami technicznymi (proc_42C506). Funkcja Rename (F2) istnieje właśnie po to i propaguje nową nazwę do wszystkich miejsc wywołania w projekcie — zob. rozdział 7.

Dwa sprawdzalne przykłady

Poniższe fragmenty pochodzą z SETUP1.EXE, kreatora instalacji dostarczanego z Visual Basic 6. Microsoft rozpowszechnia jego kod źródłowy w tym samym folderze — możesz więc sam powtórzyć porównanie.

Procedura modułu .bas

Oryginalne źródło, 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

Wynik 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

Identyczna logika, linia po linii. Right, Trim, Len, RTrim$ mają nazwy; przekazanie ByRef jest poprawnie wywnioskowane. Natomiast nazwa procedury i nazwa parametru są utracone, a stałe pojawiają się jako swoja wartość — zastąpił je kompilator, nie VBReFormer.

Procedura obsługi zdarzenia

Oryginalne źródło, BEGIN.FRM:

Private Sub cmdExit_Click()
    ExitSetup Me, gintRET_EXIT
End Sub

Wynik VBReFormer:

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

Nazwa formularza, przycisku i procedury obsługi są nietknięte; Me jest rozpoznane; wywoływany moduł ma nazwę, co mówi, dokąd iść. Tylko wywoływana procedura, która żyje w .bas, zachowuje nazwę adresową.

Znaczniki

VBReFormer nigdy nie zgaduje. Wartość, której nie da się ustalić, jest oznaczana zamiast wymyślana — wartość prawdopodobna i fałszywa to najgorszy wynik, jaki dekompilator może wyprodukować.

znacznik znaczenie co zrobić
proc_42C506 procedura oznaczona swoim adresem zmienić jej nazwę (F2)
var_18, arg_8 zmienna lokalna lub parametr odczytać jej użycie, potem zmienić nazwę
vtbl_3C nierozwiązane wywołanie przez tablicę wirtualną Object Browser często mówi, o którą bibliotekę chodzi
? wartość nieustalona zajrzeć do widoku Disassembly w tym samym miejscu

Plik zawierający ? zostanie odrzucony przez IDE VB6. Znacznik jest po to, abyś zdecydował, a nie po to, by kompilować go ponownie bez zmian.

6. Narzędzia analizy

Tutaj edycja desktopowa wyróżnia się najbardziej: oferuje pełny warsztat, podczas gdy studio internetowe skupia się na czytaniu, dekompilacji i eksporcie.

narzędzie skrót co daje
Analyse references Shift+F12 wywołujący daną procedurę, wystąpienia symbolu — klikalny wynik, a pokrycie jest policzone: to, czego analiza nie widzi, jest zliczone, nie przemilczane
Symbol list Ctrl+Shift+S pełny spis, filtrowany według rodzaju i zakresu — odróżnia nazwy odczytane od zsyntetyzowanych
Call graph Ctrl+Shift+A kto wywołuje co, w trzech skalach, z filtrami wywołujący / wywoływani
Control-flow graph Ctrl+Shift+G kształt procedury: bloki, pętle, krawędzie wsteczne, bloki nieosiągalne
Object Browser Ctrl+Shift+B „gdzie to jest zdefiniowane?”, gdy odpowiedź leży poza binarium
API Browser Ctrl+Shift+P prototypy, aliasy i notatki deklaracji Win32
Cited libraries Ctrl+K od czego zależy binarium
Find VB programs Ctrl+L odnalezienie plików wykonywalnych VB w folderze
Find Ctrl+Shift+F wyszukiwanie tekstu w udostępnionych widokach
Zakładki Ctrl+F2 oznaczanie miejsc, powrót do nich (F8 / Shift+F8)
Nawigacja wstecz / dalej Alt+← Alt+→ jak w przeglądarce

Dlaczego pokrycie jest policzone. Natywny graf wywołań widzi wywołania bezpośrednie; nie widzi wywołań przez tablicę wirtualną ani wskaźników do funkcji. Zamiast przedstawiać częściową listę jako pełną, VBReFormer pokazuje to, co pomija, zliczone. Wiesz więc, do jakiego stopnia ufać wynikowi.

7. Zmiana nazwy

To centralny gest pracy nad binarium: dekompilator oddaje Ci logikę, Ty oddajesz mu nazwy. F2 na symbolu albo z listy symboli.

Okno pokazuje trzy rzeczy, które dekompilatory zwykle ukrywają:

  • pochodzenie bieżącej nazwy — nadana przez Ciebie, wywnioskowana przez dekompilator albo odtworzona;
  • propozycje dekompilatora, każda ze swoim priorytetem i źródłem, z którego pochodzi;
  • pierwotną nazwę, do której zawsze można wrócić.

Zmiana nazwy jest globalna. Zmień nazwę procedury raz, a miejsca wywołania w innych modułach podążą za nią — także w tych, których jeszcze nie otworzyłeś.

Odrzucona zmiana nazwy jest zawsze odrzucona z podaniem powodu. Dwa częste przypadki: silnik nie zgłasza możliwości zmiany nazwy dla tego dokumentu albo bieżący widok zawiera tylko fragmenty leksykalne — wystarczające, by pokolorować tekst, ale nie by wskazać encję. W obu przypadkach komunikat to mówi, zamiast nic nie robić.

8. Bajty i łatki binarne

Navigate ▸ Show bytes (Ctrl+Shift+H) otwiera adnotowany widok szesnastkowy: nie pokazuje tylko bajtów, lecz mówi, co reprezentuje każdy obszar. Go to address (Ctrl+G) prowadzi tam bezpośrednio.

Modyfikacja pliku wykonywalnego

Tryb „surowy” pozwala zapisywać bajty i tworzyć zmodyfikowany plik wykonywalny. Jest obwarowany czterema odmowami, a każda z nich czegoś chroni:

odmowa dlaczego
Analizowany plik nigdy nie jest miejscem docelowym silnik nigdy nie otwiera go do zapisu; interfejs nie unieważnia tej gwarancji
Nadpisanie istniejącego pliku wymaga potwierdzenia „tego nie da się cofnąć”
Podpis Authenticode zostanie usunięty wcześniej prosimy o zgodę; możesz podpisać ponownie własnym certyfikatem
Odrzucona łatka nie zapisuje niczego żadnego pliku zapisanego do połowy

Studio internetowe nie oferuje łatek binarnych ani widoku szesnastkowego: to dwie funkcje właściwe edycji desktopowej.

9. Zasoby i projektant

Zasoby binarium

Ikony, kursory, bitmapy, tablice łańcuchów, informacje o wersji: wszystko, co zawierałby plik .res. Każdy wpis pokazuje swój typ, rozmiar i to, co można z nim zrobić, a wyodrębnianie jest możliwe wpis po wpisie lub w całości.

Zasób, którego produkt nie potrafi narysować, pozostaje na liście i jest wyświetlany jako bajty: nigdy nie jest ukrywany. A jeśli nie udało się prześledzić wpisów katalogu, mówi o tym ostrzeżenie — wiesz wtedy, że lista jest krótsza niż to, co zawiera binarium.

Projektant formularzy

Powierzchnia formularza jest rysowana tak, jak wyświetliłby ją VB6, na podstawie właściwości odczytanych z binarium, we właściwej kolejności rysowania. Obraz formularza można wyeksportować (Ctrl+I).

Właściwości są tylko do odczytu: VBReFormer potrafi odczytać powierzchnię formularza, nie potrafi jeszcze zapisać jej z powrotem do skompilowanego pliku. Zob. rozdział 13.

10. Eksport projektu

  1. Najpierw sprawdź panel Diagnostics. Mówi, czego nie udało się zrobić. Przeczytanie go przed eksportem oszczędza późniejszego szukania, dlaczego brakuje jakiegoś elementu.
  2. File ▸ Export the VB6 project. Wybierz pusty folder docelowy.
  3. Przeczytaj notatki eksportu. VBReFormer zapisuje, czego nie udało się odzyskać, i dlaczego. Niektóre informacje — odwołania zewnętrzne, opcje kompilacji, tryb uruchomienia — nie znajdują się w żadnej strukturze binarium: nie zostały usunięte, nigdy ich tam nie było. Są sygnalizowane zamiast wymyślane.
  4. Otwórz .vbp w Visual Basic 6. Nagłówki wymagane przez IDE (VERSION, Attribute VB_Name) są zapisane. Jeśli brakuje odwołania, dodaj je przez Projekt ▸ Odwołania.

Dwie odmowy zapisu, które Cię chronią. Pliki VB6 są zapisywane w ANSI 1252. VBReFormer odmawia zapisu, jeśli ten zestaw znaków jest niedostępny na komputerze — zapis w innym dałby po cichu błędny plik — albo jeśli jakiś znak Twojego kodu w nim nie istnieje; wtedy mówi, który i podaje jego punkt kodowy.

11. Opcje

ustawienie co robi
Indentation width dotyczy tylko odtworzonego kodu: deasemblacja, IR, P-code, blok projektanta i .vbp nie są formatowane przez ten edytor.
Code page (designer) strona kodowa, w której odczytywane są podpisy i teksty projektanta. Binarium VB6 nigdzie nie deklaruje swojej — zmierzone na 236 binariach. Jeśli etykiety formularza wyświetlają się jako niespójne znaki, to właśnie to ustawienie trzeba zmienić.
Group under With…End With domyślnie wyłączone. Wyjście jest w pełni kwalifikowane (Frame1.Caption), ponieważ kompilator rozwiązuje bloki With, a ich odbudowa byłaby domysłem. Włącz, jeśli wolisz czytelność od dosłowności.
Syntax colouring jedna rola, jeden kolor — role pochodzą z silnika, który mówi, czym jest każdy fragment. Notacja #RRGGBB; nieprawidłowa paleta nie jest stosowana połowicznie.
Interface language angielski, francuski, hiszpański — zmiana jest natychmiastowa.

Ustawienia renderowania podróżują z każdym żądaniem wyświetlenia; nigdy nie są zapisywane jako stan sesji. Zmiana wcięcia niczego więc nie analizuje ponownie.

12. Skróty

skrót działanie
Ctrl+O Otwórz binarium VB6
F2 Zmień nazwę symbolu pod kursorem
Shift+F12 Analizuj odwołania
Ctrl+Shift+F Szukaj w projekcie
Ctrl+G Idź do adresu
Ctrl+Shift+H Pokaż bajty
Ctrl+Shift+S Lista symboli
Ctrl+Shift+B Object Browser
Ctrl+Shift+P API Browser
Ctrl+Shift+G Graf przepływu sterowania
Ctrl+Shift+A Graf wywołań
Ctrl+K Cytowane biblioteki
Ctrl+L Programy VB w folderze
Ctrl+F2 Ustaw lub usuń zakładkę
F8 / Shift+F8 Następna / poprzednia zakładka
Ctrl+Shift+F2 Lista zakładek
Alt+← / Alt+→ Nawigacja wstecz / dalej
Ctrl+I Eksportuj obraz formularza

13. Znane ograniczenia

Modyfikacja interfejsu skompilowanego pliku wykonywalnego

VBReFormer odczytuje powierzchnię formularza i wszystkie jego właściwości — nie potrafi jeszcze zapisać ich z powrotem do pliku wykonywalnego. Zastąpienie osadzonego zasobu i dodanie ukrytej właściwości bez rekompilacji nie są dostępne. Łatki binarne — zapis bajtów pod adresem — są dostępne (rozdział 8).

Zasoby .ctx kontrolek UserControl

Przy eksporcie nie jest zapisywany żaden plik .ctx. Jeśli Twój projekt zawiera UserControl z utrwalonymi zasobami, tę część trzeba odtworzyć.

Windows starszy niż 10

Użyj VBReFormer Online: wystarczy przeglądarka, niezależnie od systemu.

Czego żaden dekompilator nie pokona

Komentarze, nazwy zmiennych lokalnych, stałe nazwane: nie ma ich w pliku. Zob. rozdział 5.

14. Najczęstsze pytania

Funkcja menu nie reaguje. Dlaczego? Otwórz Help ▸ About i spójrz na listę udostępnianych możliwości. Jeśli funkcji na niej nie ma, to nie interfejs odmawia: silnik nie udostępnia jej dla tego dokumentu. Komunikaty aplikacji zresztą mówią to wprost.

Czy wyeksportowany kod kompiluje się ponownie bez zmian? Często: na stanowisku testowym ze 149 projektami 121 kompiluje się ponownie bez poprawek. Pozostałe wymagają dodania odwołania albo obsłużenia kilku znaczników.

Etykiety mojego formularza są nieczytelne. To strona kodowa. Binarium VB6 nigdzie nie deklaruje strony kodowej tekstów projektanta — ustaw ją w Opcjach (rozdział 11).

Dlaczego moje formularze są czytelniejsze niż moduły? Ponieważ VB6 zachowuje nazwy kontrolek i zdarzeń, by działać, natomiast procedury modułów rozwiązuje do zwykłych adresów. Zob. rozdział 5.

Mój plik wykonywalny jest spakowany (packer). Czy to problem? Tak: trzeba go najpierw rozpakować, inaczej struktury VB6 nie są widoczne w pliku.

Czy można zdekompilować .ocx lub .dll ActiveX? Tak, a spis publicznych składowych jest tam zwykle bogatszy, ponieważ COM wymaga ich nazwania.

Czy moje binarium jest gdzieś wysyłane? Odczyt formatu, bajty, deasemblacja i zasoby są przetwarzane na Twoim komputerze. Odtwarzanie kodu działa na naszych serwerach — to sens edycji Desktop + Cloud.

Czy to legalne? Zależy od Twojej jurysdykcji i Twoich praw do binarium. Przewidziane zastosowanie to odzyskanie własnego kodu albo kodu, do którego masz prawa lub upoważnienie.