プラグイン API リファレンス

カスタムネイティブプラグイン用の共有コールバックインターフェース。

DE DecompilerはVB Decompilerと共通のプラグインABIを使用します。エクスポート名のVBDecompilerPluginという接頭辞は変更しません。共通のコンパイラ識別子や従来のVB/FRXコマンド名はAPI上の識別子であり、製品が対応する入力形式を定義するものではありません。各操作では、現在のDE Decompilerプロジェクトで利用できるデータを確認してください。

このドキュメントは、VB DecompilerとDE Decompilerで共有されるプラグインインターフェースについて説明しています。プラグインシステムにより、共有ライブラリ(DLL)を介して、アプリケーションの逆コンパイルされたコードおよび内部構造の解析、変更、または拡張が可能になります。
1. アーキテクチャ概要
プラグインシステムはコールバックモデルで動作します:
  • ホスト逆コンパイラがDLLプラグインをロードします。
  • プラグインの名前と著者情報を取得するためにエクスポートされた関数を呼び出します。
  • 次に、 VBDecompilerPluginLoadを呼び出し、内部の コールバックエンジン.
  • へのポインタを渡します。vlType vlType
定数)を使用して、このエンジン関数を呼び出すことで、プラグインはホストと対話します。2. エクスポートされた関数
DLLは以下の関数をエクスポートする必要があります。 stdcall 関数:
VBDecompilerPluginName
ホストによって呼び出され、プラグインの表示名を取得します。
void __stdcall VBDecompilerPluginName( HWND VBDecompilerHWND, // メインウィンドウのハンドル HWND RichTextBoxHWND, // コードエディタウィンドウのハンドル char* Buffer, // 対象バッファ (100 バイト、ANSI) int Reserved // 予約済み );
使用方法: プラグイン名を含む標準ASCII文字列(最大 100 文字)を Buffer.
VBDecompilerPluginAuthor
著者の連絡先情報を取得するために呼び出されます。
void __stdcall VBDecompilerPluginAuthor( HWND VBDecompilerHWND, HWND RichTextBoxHWND, char* Buffer, // 対象バッファ (ANSI) int Reserved );
使用方法: 次のような文字列を "Author Name, email@domain.com" にコピーします。 Buffer.
VBDecompilerPluginLoad
プラグインのロジックが実行されるメインのエントリポイント。
void __stdcall VBDecompilerPluginLoad( HWND VBDecompilerHWND, HWND RichTextBoxHWND, char* Buffer, // 予約済み/バッファ void* PluginEngine // <--- コールバック関数へのポインタ );
使用方法: この PluginEngine ポインタを保存してください。これを使用して呼び出します。 GetValue / SetValue コマンド(以下の「コールバックエンジン」を参照)。
3。コールバックエンジン
ホストとの通信は、で提供される単一のコールバック関数ポインタを通じて処理されます。 PluginEngine.
関数のシグネチャ:
typedef wchar_t* (__stdcall *TVBDPluginEngine)( int vlType, // コマンドID(アクション) int vlNumber, // 主インデックス(フォーム/モジュールID) int vlFnNumber, // 副インデックス(関数ID) char* vlNewValue // 設定する値(ANSI文字列)、Get系コマンドの場合はNULL );
注記: エンジンは入力に対してANSI文字列(char*)を受け取りますが、結果としてUnicode文字列(wchar_t*)を返します。
4。コマンドリファレンス(vlType)
以下の定数は、特定のアクションを実行するための vlType 引数として使用されます。
グローバルプロジェクトコマンド
プロジェクトファイルまたはグローバル設定に関連する操作。 vlNumber および vlFnNumber 通常は0です。
ID定数概要
1GetVBProject逆コンパイルされたプロジェクトファイルの全文を取得します。
2SetVBProjectプロジェクトファイルの内容を置き換えます。
3GetFileName解析対象のファイルのフルパスを取得します。
4IsNativeCompilationターゲットがネイティブコードにコンパイルされている場合は "1" を、P-Code の場合は "0" を返します。
5ClearAllBuffers内部の逆コンパイラ構造体をクリアします。プラグインで新しい言語用の完全なカスタム逆コンパイラを実装している場合に使用してください。
6GetCompilerコンパイラの種類を返します: 1=VB, 2=.NET, 3=Delphi, 4=不明。
7IsPackedファイルがパッキング/圧縮されている場合は "1" を、それ以外の場合は "0" を返します。
56GetVBDecompilerPathDE Decompiler の実行ファイルへのパスを返します。
100UpdateAll変更をコミットし、GUIを更新します。 必須 値を設定した後に適用し、ユーザーが変更内容を確認できるようにします。
64GetProductNameオプションの読み込み済みホストID。検査対象のコンパイラとは独立しています。SDKに関する詳細は以下の26.6を参照してください。
UI コントロール
DE Decompiler インターフェースのコントロール要素。
ID定数概要
8SetStackCheckBoxValue設定 スタックパラメータの解析 (Parse stack parameters) チェックボックスの状態。「1」= チェック済み、「0」= 未チェック。
9SetAnalyzerCheckBoxValue設定 プロシージャアナライザとオプティマイザ (Procedure analyzer and optimizer) チェックボックスの状態。「1」= チェック済み、「0」= 未チェック。
50GetActiveTextアクティブなコードウィンドウに表示されているテキストを取得します。
51SetActiveTextアクティブなコードウィンドウのテキストを設定します。
52GetActiveDisasmText逆アセンブラウィンドウの生逆アセンブリテキストを取得します。
53SetActiveDisasmText逆アセンブラウィンドウに生逆アセンブリテキストを設定します。
54SetActiveTextLineスクロールまたは指定された行番号(vlNewValue で文字列として渡される)にジャンプします。
55GetActiveModuleCoordinatsアクティブなビューの ID を取得します。使用前に返された値を検証してください。
58SetStatusBarTextアプリケーションのステータスバーにカスタムメッセージを表示します。
フォーム
復元されたフォームに対する操作。 vlNumber: フォームインデックス (0 ベース)。
ID定数概要
10GetVBFormNameフォームの名前を取得します。
11SetVBFormNameフォームの名前を変更します。
12GetVBFormフォームの逆コンパイルされたプロパティを取得します。
13SetVBFormフォームのプロパティを設定します。
14GetVBFormCountプロジェクト内のフォームの総数を返します。
モジュール
標準モジュール (.bas) またはクラスモジュール (.cls) に対する操作。 vlNumber: モジュールインデックス (0 ベース)。
ID定数概要
30GetModuleNameモジュール名を取得します。
31SetModuleNameモジュールの名前を変更します。
32GetModuleモジュールの逆コンパイルされた宣言ヘッダーを取得します。
33SetModuleモジュールの逆コンパイルされた宣言ヘッダーを設定します。
34GetModuleStringReferencesこのモジュールで使用されている文字列参照のリストを取得します。
35SetModuleStringReferences文字列参照を設定します。
36GetModuleCountモジュールの総数を返します。
プロシージャー / 関数
モジュール内の特定の関数に対する操作。
vlNumber: モジュールインデックス。
vlFnNumber: そのモジュール内の関数インデックス (0ベース)。
ID定数概要
20GetSubMainエントリポイント(Sub Main)のコードを取得します。(引数のインデックスは無視されます)。
21SetSubMainエントリポイントのコードを設定します。
40GetModuleFunctionName特定の関数の名前を取得します。
41SetModuleFunctionName関数名を変更します。
42GetModuleFunctionAddress関数のメモリアドレス(VA)を取得します。
43SetModuleFunctionAddress関数アドレスを設定します。
44GetModuleFunction関数の逆コンパイル済みコードを取得します。
45SetModuleFunction関数のコードを設定します。
46GetModuleFunctionStrRefこの関数固有の文字列参照を取得します。
47SetModuleFunctionStrRefこの関数の文字列参照を設定します。
48GetModuleFunctionCount指定されたモジュール内の関数数を返します。
57GetModuleFunctionCode"高速逆コンパイル"モードで関数のコードを取得します(この関数が現在処理されていない場合)。
70GetModuleFunctionDisasm関数の逆アセンブル(ASM)を取得します。
71SetModuleFunctionDisasm関数の逆アセンブルを設定します。
リソース (FRX)
バイナリ形式のリソース(アイコン/画像)へのアクセス。 vlNumber: アイコンインデックス。
ID定数概要
60GetFrxIconCountネイティブ ImageList ビットマップシートを含む、登録された元のピクチャの数(ゼロベースのインデックス)。
61GetFrxIconOffsetレガシー調整済みオフセット: 実際のピクチャオフセットから 8 を引いた値。読み取り前に 8 を加算してください。
62GetFrxIconSizeレガシー調整済みサイズ: 実際のピクチャバイト数に 8 を加えた値。読み取り前に 8 を減算してください。
63GetFrxImageListInfo登録されたネイティブ DFM ImageList カラービットマップのオプションの IL1 メタデータ; 以下の SDK 26.6 を参照してください。
5. ネイティブ画像およびオプションの SDK 26.6 コマンド
この共有 SDK リビジョンは以下によって実装されています VB Decompiler 26.6 および DE Decompiler 26.6. コマンド 63 および 64 はオプションの読み取り専用ゲッターです。コールバックのシグネチャ、エクスポートされたシンボル、および既存のコマンド番号は変更されていません。ホストアプリケーションのメインスレッドでコールバックを呼び出してください。
登録済み画像:コマンド 60~62
インデックスはゼロベースです。 GetFrxIconCount ImageLists 内の論理アイコンの数を返すのではなく、登録済みの元の画像の数を返し、実行ファイルまたは DLL から元のバイトを読み取ります。 GetFileName (コマンド 3)。
実際のファイルオフセットにある画像の場合 P 実際のバイト数 N、コマンド 61 は P - 8 を返し、コマンド 62 は N + 8を返します。返されたオフセットに 8 を加算し、返されたサイズから 8 を減算します:
Offset := GetInteger(GetFrxIconOffset, ImageIndex);
Size := GetInteger(GetFrxIconSize, ImageIndex);
FileStream.Position := Offset + 8;
ImageStream.CopyFrom(FileStream, Size - 8);
読み取り前にインデックス、調整された範囲、およびペイロードの署名を検証してください。これらのレガシーな調整は、Delphi 実行ファイル内に物理的な FRX ヘッダーが存在することを意味するものではありません。結果として得られるペイロードは、BMP、PNG、JPEG、GIF、ICO、または CUR の署名で始まります。DFM プロパティのプレフィックスと ImageList コンテナのヘッダーは除外されます。
DE Decompiler はバイナリ DFM フォーム値をデコードする際に画像を登録します。独立してエンコードされたコレクション画像には個別のエントリがあります。ネイティブな ImageList の元のカラービットマップとオプションのマスクは通常のビットマップエントリとして扱われるため、既存のプラグインは完全なシートを表示またはエクスポートし続けることができます。
63 — GetFrxImageListInfo
既存の画像インデックスを vlNumberに渡し、 vlFnNumber にはゼロと null 入力ポインタを渡します。認識されたネイティブ DFM ImageList のカラービットマップの場合、現在の応答は次の通りです:
IL1;<Count>;<Width>;<Height>;<Flags>;<MaskOffset>;<MaskSize>
フィールド意味
Count予備容量を除く論理画像の数。
Width, Heightピクセル単位のセル寸法。
Flags元の ImageList フラグ。ビット 0 はマスクを示します;カラーフォーマット $20 示す ILC_COLOR32.
MaskOffsetマスク BMP シグネチャの実際のファイルオフセット。8 を追加しないでください。
MaskSize実際のマスク BMP バイト数。8 を減算しないでください。
数値フィールドは 10 進数で、セミコロンで区切られます。マスクが存在しない場合、両方のマスク フィールドはゼロになります。カラー データはコマンド 61–62 およびそのレガシー調整を引き続き使用します。コマンド 63 はメタデータのみの返却を行います:インデックスを変更せず、セルをラスタライズせず、ホスト内の画像データも複製しません。
現在の IL1 実装は、BMP シートを備えたネイティブ ストリーム バージョン $0101 に対応しています。通常の画像、非対応のストリーム、または古いホストでは空文字列が返される場合があります。無効なインデックスの場合は Errorが返されます。空文字列、エラー、不正な形式、および不明なバージョンの応答は非対応として扱い、元の画像エントリが利用可能な箇所では全体画像処理を維持してください。
セル インデックス Kに対しては、論理的な左上座標を使用します:
Columns := ColorBitmap.Width div CellWidth;
X := (K mod Columns) * CellWidth;
Y := (K div Columns) * CellHeight;
必須 0 <= K < Countです。ジオメトリとファイル範囲を検証し、下から上への DIB スキャンラインを考慮してください。対応する 1 ビット マスクまたはプリマルチプライド アルファを適用してください。古い 32 ビットのリストには、アルファ チャンネルが完全にゼロであるものが含まれる場合があります。その場合、マスクはフォールバックとして機能します。
提供された shared/PluginSDK.pas および shared/modFrxImageList.pas は、更新されたビューアで使用されるゲッター、パーサー、および ImageList リーダーを提供します。以下の抜粋では、 FileStream が解析対象ファイルに対して開かれていることを前提としています:
InfoText := GetString(GetFrxImageListInfo, ImageIndex);
if ParseFrxImageListInfo(InfoText, Info) then begin
  ColorOffset := GetInteger(GetFrxIconOffset, ImageIndex) + 8;
  ColorSize := GetInteger(GetFrxIconSize, ImageIndex) - 8;
  Images := TFrxImageList.Create(FileStream, ColorOffset, ColorSize, Info);
  try
    Icon := Images.Icon(0);
    try
      Icon.SaveToFile('Image_0.ico');
    finally
      Icon.Free;
    end;
  finally
    Images.Free;
  end;
end;
リーダーは範囲とジオメトリを検証し、Windows コモン コントロールを使用してネイティブ リストをデコードします。認識された各リストを一度だけ列挙してください。マスクの実際のオフセットを、各画像の調整済みオフセットに 8 を加えた値と比較することで、個別のマスク エントリを抑制します。エクスポートされたセル ICO ファイルは、リストのマスク/アルファを含む派生画像です。スタンドアロンの画像は元のペイロードを保持します。
64 — GetProductName
両方のインデックスにゼロ、入力ポインターに null を渡します。結果は VB Decompiler または DE Decompilerであり、これは検査対象ファイルのコンパイラとは無関係に、読み込まれたホストのアイデンティティから取得されます。
返却されたすべての UTF-16 文字列は直ちにコピーしてください:ポインターはホストに属しており、次のコールバックまでしか有効ではありません。提供された DecompilerProductName ヘルパーがレスポンスを検証し、フォールバック先は VB Decompiler です。古いホスト上では、従来のSDKエクスポート、レジストリパス、およびローカライズキーを変更しないでください。
互換性とダウンロード
  • 既存のプラグインは、変更なしでコマンド 60–62 を引き続き使用します。
  • 更新されたビューアは、古いホストとの間で全体像の動作を維持します。
  • 認識されたネイティブDFMリストでは、個々のセルプレビューとICOエクスポートにコマンド 63 が使用されます。独立してエンコードされたコレクション画像は通常の項目として扱われます。
  • VB5/6 および .NET グラフィックスは、既存の抽出パスを維持します。
  • これらの新しいゲッターは、入力ファイル、復元されたコード、フォーム、または現在の選択状態を変更しません。
共有SDKをダウンロードするには、オプションコマンドリファレンスとDelphiヘルパーを含みます。 提供されるSDK 26.6 の追加機能をお読みください。ユーザーワークフローについては FRX Image Viewer を参照してください。

SDK 26.6:表示中の項目、マーク、完全なアドレス

DE Decompiler 26.6では、既存のPluginEngineコールバックを使って次のオプションコマンドを利用できます。APIはメインスレッドから呼び出してください。返されたUTF-16文字列は次の呼び出しまでにコピーします。入力文字列には従来どおり、ヌル終端のANSI文字列を使います。

ID定数引数と戻り値
65GetDisplayedTreeItem引数なし。選択中のツリーノードではなく、表示中の内容をTREE1;kind;module;function;formで返します。有効な項目がなければ空文字列です。
66GetModuleFunctionMarkモジュールと関数のインデックス。0または1を返し、現在のツリーに関数がなければ空文字列です。
67SetModuleFunctionMarkモジュールと関数のインデックス、入力は0または1。成功時は1、現在のツリーに関数がなければ空文字列です。
68FindModuleFunctionByVA入力は16進アドレス。モジュール引数には0始まりの一致番号を渡します。完全一致するmodule,functionを返し、一致がなければ空文字列です。
69GetModuleFunctionVAモジュールと関数のインデックス。x64のPE ImageBaseを含む完全な符号なし仮想アドレスを10進文字列で返します。

TREE1の種類はfunction、module、unit、form、usercontrol、otherform、submain、root、otherです。使わないインデックスは-1で、Delphiのユニットをモジュールインデックスとして返しません。コマンド55は従来どおり最後のアクティブなプロシージャ座標を返し、フォーム表示中も値を保持する場合があります。

関数マークはSpaceキー操作と同じ表示を使います。マークの取得・変更は、関数の表示やデコード、選択やキャレットの移動を行いません。ツリーの再構築でマークが失われる場合があり、これらのコマンドによってVDDへの永続保存が追加されるわけではありません。

入力アドレスは数字だけの場合も16進数として扱い、0xと$の接頭辞も使えます。完全一致で検索し、同一アドレスを共有する関数を列挙できます。x64では完全なVAと互換モデルのVAの両方を受け付けます。コマンド42の符号付き32ビットの戻り値は変更していません。これらはネイティブコードのアドレスであり、メタデータトークンではありません。

古いホストでは未知のコマンドに空文字列を返します。無効なインデックスや入力、メインスレッド以外からの拒否された呼び出し、許可されない書き込みはErrorを返します。完全なx64アドレスを取得できない場合もErrorです。空文字列とErrorを明示的に処理し、従来の代替動作を維持してください。

Current := GetString(GetDisplayedTreeItem);
Coords := FindFunctionByVA('0x89CB90');
State := GetString(GetModuleFunctionMark, 4, 51);
Reply := SetStringResult(SetModuleFunctionMark, '1', 4, 51);
FullVA := GetString(GetModuleFunctionVA, 4, 51);