Decompiler-VB.Net
JP
ログイン
VBReFormer Gen2 エンジンを全面的に書き直し、P-code に完全対応。オンラインスタジオはパブリックベータ公開中。 発表を読む
ドキュメント
VBReFormer Desktop

VBReFormer Desktop マニュアル

VBReFormer Desktop のユーザーマニュアル:インストール、ライセンスの有効化、7 つのビューの読み方、バイナリの解析、IDE で再読み込みできる VB6 プロジェクトのエクスポート。

更新日:2026/09/2014 章

Windows PC にインストールして使うアプリケーションです。Visual Basic 5 および 6 の実行ファイルを開き、そのソースコードを再構築して、VB6 IDE で再び開けるプロジェクトを返します。バイト、リソース、デザイナー、グラフ、相互参照、バイナリパッチといった作業道具一式を備えています。

翻訳についての注記。 デスクトップアプリケーションのインターフェースは英語、フランス語、スペイン語で提供されています。このマニュアルでは、メニューやビューの名称をアプリケーションに表示される英語のまま記載します。

1. インストール

VBReFormer Desktop はインターフェース言語ごとに 1 つの MSI インストーラー として配布されます。パッケージは自己完結型で、必要なものをすべて同梱しており、事前にフレームワークをインストールする必要はありません。

要件
システム Windows 10 バージョン 1607 以降、または Windows 11
アーキテクチャ x64
フレームワーク 不要 — パッケージは自己完結型
接続 逆コンパイルとライセンス検証に必要
インターフェース言語 英語、フランス語、スペイン語

Windows XP、Vista、7、8 はサポートされません。 アプリケーションは最低でも Windows 10 を必要とするプラットフォーム上に構築されています。お使いの PC がそれより古い場合は、VBReFormer Online がどのブラウザー、どのシステムでも動作します。その場合はこちらが推奨される方法です。

エンジンはどこで動くか

アプリケーションはローカルで動作しますが、コードの再構築は当社のサーバーで実行されます。これがエディション名 Desktop + Cloud の意味です。ファイルから読み取るもの(形式、バイト、逆アセンブル、リソース)はすべてお使いの PC 上で計算され、再構築するものはすべてサービスを経由します。

Help ▸ About ダイアログには、接続されているエンジンのバージョン、契約のバージョン、そして提供されている機能Capabilities served)の一覧が常に表示されます。ある機能が見当たらないときに役立ちます。その一覧にない機能は、インターフェースが拒否しているのではありません。

2. ライセンスを有効にする

ライセンスがなくてもアプリケーションは開いて動作します。バイナリを探索し、逆アセンブル全体、バイト、リソース、デザイナーを読むことができます。ライセンスが開くのは VB6 コードの再構築プロジェクトのエクスポートです。

同時に 1 台

VBReFormer のライセンスは同時に 1 台のワークステーションで使えます。すでに別の場所で使用中の場合、アプリケーションはそのことをはっきり伝え、2 つの選択肢を示します。アカウントからこの PC にライセンスを移すか、シートを追加するかです。

これは穏やかな拒否です。お客様は支払い済みで、何も不足していません。技術的なエラーを返す代わりに、メッセージはそのように伝えます。

VBReFormer Online を開いているブラウザーも 1 台として数えられます。Web スタジオとデスクトップアプリケーションは同じライセンスを消費します。

3. ウィンドウ

  1. バイナリを開きます。 File ▸ Open a VB6 binaryCtrl+O)。受け付ける形式は .exe.dll.ocx.scr です。ステータスバーに解析の進行状況が表示され、続いてファイル名とコンパイル形式(ネイティブコードまたは P-code)が表示されます。
  2. PROJECT パネルを見て回ります。 左側に、VB6 が見ていたとおりにバイナリが表示されます。フォーム、クラス、モジュール、そしてそれらのプロシージャです。ツリーは必要に応じて展開されます。ノードを開くとその子が要求され、事前には何も計算されないため、大きな実行ファイルでも開くのは速いままです。
  3. プロシージャを選択します。 そのノードのビューが右側に表示されます。ノードに提供されるビューがない場合は、空のパネルではなく、その理由が画面に書かれます。

下部のパネル

タブ 用途
Output 操作のログ。インターフェース言語を変更しても、各行が書かれた言語をそのまま保持します。ログは記録であり、表示ではありません
Diagnostics エンジンが実行を拒否したものと、その理由。 結果に驚いたときに真っ先に見るべき場所です。
Analyser 相互参照:プロシージャの呼び出し元、シンボルの出現箇所。結果はクリックできます。

メンバーの可視性

ツリーの各メンバーには、バイナリが宣言しているとおりの可視性が付きます。(Public)(Private)(Friend) です。これらは VB6 のキーワードであり、翻訳されません。可視性を読み取れなかったメンバーには何も付きません。分からないことは書かないからです。

4. 7 つのビュー

ビューは 3 つのファミリーに分かれており、この区分は、読んでいるものがどこから来たかを教えてくれます。これが理解すべき最も重要な点です。

「Code」ファミリー — 解析によって再構築

ビュー 表示内容 見るべきとき
Visual Basic 6 構造化された再構築ソース 既定 — これが求めているものです
IR 中間表現 エンジンが何を理解したかを見るとき
Disassembly x86 機械語命令 プロセッサが何を実行するかを見るとき
P-code VB6 仮想マシンのオペコード P-code バイナリのみ

この一覧を下るほど、機械に近づきます。ある行について迷ったら、Visual Basic 6 は意図を、Disassembly は事実を語ります。

「Project files」ファミリー — 推論ではなく読み取り

Designer (.frm)Project (.vbp)Structure。ここにあるものはコードの再構築を経ていません。すべてバイナリ内のテーブルから読み取られたもので、読み取れなかったものは補完されず、そのことが明記されます。製品の中で最も信頼できるファミリーであり、いかなる推論にも依存しません。

「リソース」ファミリー

第 9 章を参照してください。

5. コンパイルが残すもの、捨てるもの

この章では、コードの一部がほぼそのまま戻ってくる一方で、他の部分が技術的な名前で戻ってくる理由を説明します。規則は単純です。

Visual Basic が実行時に必要とするものはファイルに書き込まれており、VBReFormer はそれを見つけ出します。コンパイル後に不要になったものは捨てられており、誰にも取り戻せません。

残るもの: フォーム、クラス、モジュールの名前 · コントロールの名前 · イベントハンドラー · クラスのパブリックメンバー · すべてのインターフェースプロパティ · VB ランタイムの呼び出し(635 関数) · Win32 API(15,680 シグネチャ) · コードの構造 · 文字列。

ファイルにないもの: コメント · ローカル変数の名前 · パラメーターの名前 · 値に置き換えられた名前付き定数 · .bas モジュールのプロシージャ名 · 元のインデント · Option ExplicitEnum

実際の帰結。 フォームは非常に読みやすく戻ってきます。.bas モジュールは正しく戻ってきますが、技術的な名前(proc_42C506)になります。そのために Rename 機能(F2)があり、新しい名前はプロジェクト内のすべての呼び出し箇所に伝播します。第 7 章を参照してください。

検証できる 2 つの例

以下の抜粋は、Visual Basic 6 に付属するインストールウィザード SETUP1.EXE からのものです。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

論理は一行ずつ同一です。 RightTrimLenRTrim$ には名前が付き、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_18arg_8 ローカル変数またはパラメーター 用途を読み取ってから名前を変更する
vtbl_3C 解決されていない仮想テーブル経由の呼び出し Object Browser がどのライブラリかを教えてくれることが多い
? 確定できなかった値 同じ箇所を Disassembly ビューで確認する

? を含むファイルは VB6 IDE に拒否されます。マーカーはお客様が判断するためにあるのであって、そのまま再コンパイルするためのものではありません。

6. 解析ツール

デスクトップ版が最も際立つのはここです。Web スタジオが読む・逆コンパイルする・エクスポートするに集中するのに対し、デスクトップ版は完全な作業台を提供します。

ツール ショートカット 得られるもの
Analyse references Shift+F12 プロシージャの呼び出し元、シンボルの出現箇所。結果はクリック可能で、カバレッジが数値化されます。解析が見ていないものは隠されず、数えられます
Symbol list Ctrl+Shift+S 完全な一覧。種類とスコープで絞り込め、読み取った名前と合成した名前を区別します
Call graph Ctrl+Shift+A 何が何を呼ぶか。3 段階のスケール、呼び出し元/呼び出し先のフィルター付き
Control-flow graph Ctrl+Shift+G プロシージャの形:ブロック、ループ、後方エッジ、到達不能ブロック
Object Browser Ctrl+Shift+B 答えがバイナリのにあるときの「これはどこで定義されているか」
API Browser Ctrl+Shift+P Win32 宣言のプロトタイプ、エイリアス、注記
Cited libraries Ctrl+K バイナリが依存しているもの
Find VB programs Ctrl+L フォルダー内の VB 実行ファイルを探す
Find Ctrl+Shift+F 提供されているビュー内のテキスト検索
ブックマーク Ctrl+F2 場所に印を付け、戻る(F8 / Shift+F8
戻る/進む Alt+← Alt+→ ブラウザーと同じ

カバレッジが数値化される理由。 ネイティブの呼び出しグラフは直接呼び出しを見ますが、仮想テーブル経由の呼び出しや関数ポインターは見えません。部分的な一覧を完全なものとして提示する代わりに、VBReFormer は省略したものを数えて表示します。これにより、結果をどこまで信頼できるかが分かります。

7. 名前の変更

バイナリに取り組む上での中心的な操作です。逆コンパイラは論理を返し、お客様は名前を返します。シンボル上で F2、またはシンボル一覧から行います。

ダイアログには、逆コンパイラが通常は隠している 3 つのことが表示されます。

  • 現在の名前の由来 — お客様が付けたのか、逆コンパイラが推論したのか、再構築されたのか。
  • 逆コンパイラの提案。それぞれに優先度と出所が付いています。
  • 元の名前。いつでも戻せます。

名前の変更はグローバルです。 プロシージャの名前を一度変更すれば、他のモジュール内の呼び出し箇所も追従します。まだ開いていないモジュールも含めてです。

名前の変更が拒否されるときは、必ず理由付きです。よくある 2 つのケース:エンジンがこのドキュメントに対して名前変更機能を提供していない場合と、現在のビューが字句的な断片しか持っていない場合(テキストに色を付けるには十分でも、エンティティを指し示すには不十分)です。どちらの場合も、何もしないのではなく、メッセージがそのことを伝えます。

8. バイトとバイナリパッチ

Navigate ▸ Show bytesCtrl+Shift+H)は注釈付きの 16 進ビューを開きます。バイトを表示するだけでなく、各領域が何を表しているかを示します。Go to addressCtrl+G)で直接その場所へ移動できます。

実行ファイルを変更する

「raw」モードでは、バイトを書き込んで変更済みの実行ファイルを生成できます。これは 4 つの拒否によって枠付けされており、それぞれが何かを守っています。

拒否 理由
解析中のファイルが書き込み先になることはない エンジンはそのファイルを書き込み用に開かず、インターフェースもこの保証を破りません
既存ファイルの上書きは確認を求める 「元に戻せません」
Authenticode 署名は削除される 事前に同意が求められます。ご自身の証明書で再署名できます
拒否されたパッチは何も書き込まない 書きかけのファイルは残りません

Web スタジオはバイナリパッチと 16 進ビューを提供しません。この 2 つはデスクトップ版固有の機能です。

9. リソースとデザイナー

バイナリのリソース

アイコン、カーソル、ビットマップ、文字列テーブル、バージョン情報:.res ファイルが持っていたはずのものすべてです。各エントリには種類、サイズ、扱える操作が表示され、エントリ単位でも一括でも抽出できます。

製品が描画できないリソースも一覧に残り、バイトとして表示されます。隠されることはありません。ディレクトリのエントリをたどれなかった場合は警告が表示され、一覧がバイナリの実際の内容より短いことが分かります。

フォームデザイナー

フォームの画面は、バイナリから読み取ったプロパティに基づき、正しい描画順序で、VB6 が表示したであろうとおりに描画されます。フォームの画像はエクスポートできます(Ctrl+I)。

プロパティは読み取り専用です。VBReFormer はフォームの画面を読み取ることはできますが、コンパイル済み実行ファイルに書き戻すことはまだできません。第 13 章を参照してください。

10. プロジェクトをエクスポートする

  1. まず Diagnostics パネルを確認します。 できなかったことが書かれています。エクスポートに読んでおけば、後で要素が欠けている理由を探さずに済みます。
  2. File ▸ Export the VB6 project。 空の出力先フォルダーを選びます。
  3. エクスポートノートを読みます。 VBReFormer は復元できなかったものと、その理由を書き出します。外部参照、コンパイルオプション、起動モードといった一部の情報はバイナリのどの構造にも存在しません。消されたのではなく、最初からそこにないのです。それらはでっち上げられず、報告されます。
  4. .vbp を Visual Basic 6 で開きます。 IDE が要求するヘッダー(VERSIONAttribute VB_Name)は書き込まれています。参照が不足していれば、プロジェクト ▸ 参照設定 から追加してください。

お客様を守る 2 つの書き込み拒否。 VB6 のファイルは ANSI 1252 で書き込まれます。この文字セットがマシンで利用できない場合(別の文字セットで書くと静かに誤ったファイルが生成されます)、またはコードの文字がその文字セットに存在しない場合、VBReFormer は書き込みを拒否し、後者ではどの文字か、そのコードポイントを伝えます。

11. オプション

設定 動作
Indentation width 再構築コードにのみ適用されます。逆アセンブル、IR、P-code、デザイナーブロック、.vbp はこのエディターで整形されません。
Code page (designer) デザイナーのキャプションとテキストを読み取るコードページ。VB6 バイナリは自身のコードページをどこにも宣言していません(236 個のバイナリで測定)。フォームのラベルが文字化けして表示される場合、変更すべきはこの設定です。
Group under With…End With 既定ではオフ。 コンパイラは With を解消しており、再構築は推測になるため、出力は完全修飾Frame1.Caption)です。忠実さより読みやすさを優先するならオンにしてください。
Syntax colouring 役割ごとに 1 色。役割はエンジンから来ており、エンジンは断片が何であるかを伝えます。#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 章)。

UserControl の .ctx リソース

エクスポート時に .ctx ファイルは書き出されません。プロジェクトに永続化されたリソースを持つ UserControl が含まれる場合、その部分は再構成が必要です。

Windows 10 より前

VBReFormer Online をお使いください。システムを問わず、ブラウザーがあれば十分です。

どの逆コンパイラも越えられないもの

コメント、ローカル変数名、名前付き定数:これらはファイルにありません。第 5 章を参照してください。

14. よくある質問

メニューの機能が反応しません。なぜですか? Help ▸ About を開き、提供されている機能の一覧を確認してください。そこにない機能は、インターフェースが拒否しているのではなく、エンジンがこのドキュメントに対して提供していないのです。アプリケーションのメッセージもそのことを明示します。

エクスポートしたコードはそのまま再コンパイルできますか? 多くの場合可能です。149 プロジェクトのテストベンチでは 121 が手を加えずに再コンパイルできました。残りは参照の追加か、いくつかのマーカーの処理が必要です。

フォームのラベルが読めません。 コードページの問題です。VB6 バイナリはデザイナーテキストのコードページをどこにも宣言していません。オプションで設定してください(第 11 章)。

なぜフォームはモジュールより読みやすいのですか? VB6 は動作のためにコントロール名とイベント名を保持する一方、モジュールのプロシージャは単なるアドレスに解決するからです。第 5 章を参照してください。

実行ファイルが圧縮(パッカー)されています。問題になりますか? はい。事前に展開する必要があります。そうしないと VB6 の構造がファイル内に見えません。

.ocx や ActiveX の .dll は逆コンパイルできますか? できます。COM はパブリックメンバーに名前を付けることを要求するため、一般にその一覧はより豊富です。

バイナリはどこかへ送信されますか? 形式の読み取り、バイト、逆アセンブル、リソースはお使いの PC 上で処理されます。コードの再構築は当社のサーバーで実行されます。これが Desktop + Cloud エディションの意味です。

合法ですか? お客様の法域と、バイナリに対する権利によります。想定されている用途は、ご自身のコード、または権利や許諾をお持ちのコードの復元です。