No history yet

EX4ファイルの構造

EX4ファイルの構造

MQL4でコンパイルされたプログラム、つまりEX4ファイルは、単なるコードの羅列ではありません。これは、MetaTrader 4 (MT4) のランタイムがプログラムをロードして実行するために必要なすべての情報を含む、高度に構造化されたバイナリコンテナです。

リバースエンジニアリングの第一歩は、この構造を理解することです。バイナリエディタでEX4ファイルを開くと、一見ランダムなバイトの連続に見えますが、そこには明確なパターンとレイアウトが存在します。この構造を解読することで、プログラムの動作を深く理解できます。

ファイルヘッダーの解析

すべてのEX4ファイルは、ファイルの種類と基本情報を定義する固定長のヘッダーから始まります。このヘッダーは、MT4ランタイムがファイルを正しく解釈するためのロードマップとして機能します。

最初の4バイトは「マジックナンバー」またはシグネチャで、これがEX4ファイルであることを示します。具体的には、45 58 34 00 という16進数シーケンスで、これはASCII文字の EX4 とヌル文字 \0 に対応します。

オフセット (16進数)サイズ (バイト)説明
0x004ファイルシグネチャ: "EX4\0"
0x044MQLコンパイラのバージョン
0x0864著作権情報 (ASCII文字列)
0x484コンパイル日時 (Unixタイムスタンプ)
0x4C4プログラムの種類 (インジケーター、EAなど)
0x844セクションテーブルへのオフセット
0x884セクション数

このテーブルはヘッダーのほんの一部です。バージョンやコンパイル日時などの値は、4バイトの整数として格納されています。これらの値を正しく読み取るには、、特にリトルエンディアン形式を理解することが不可欠です。例えば、1A 2B 3C 4D というバイト列は、リトルエンディアンでは 0x4D3C2B1A という数値として解釈されます。

セクション構造

ヘッダーの後には、ファイルの主要なコンテンツを格納する複数の「セクション」が続きます。各セクションには、コンパイル済みコード、リソース、インポート関数リストなど、特定の種類のデータが含まれています。

どのセクションがどこにあるかを知るために、MT4ランタイムはヘッダー内のオフセットが指し示す「セクションテーブル」を参照します。このテーブルには、各セクションの名前、ファイル内での位置(オフセット)、サイズが記録されています。

一般的なセクションには次のようなものがあります。

  • CODE: コンパイルされたMQL4のバイトコード。プログラムのロジック本体です。
  • DATA: グローバル変数や静的変数の初期値を保持します。
  • IMP0: プログラムが外部のDLLから呼び出すインポート関数のリストです。
  • EXP0: プログラムが外部に提供するエクスポート関数のリストです。
  • RES0: 文字列リテラル、画像、音声ファイルなどのリソースデータが格納されます。

関数とリソースの配置

プログラムが他のライブラリの機能を呼び出す場合、その情報は IMP0 セクションに記録されます。ここには、呼び出すDLL名と関数名が文字列として格納されており、MT4ランタイムはプログラムのロード時にこれらの関数を解決(アドレスを特定)します。

同様に、#propertyinput 変数で定義された文字列、プログラム内で直接使用される文字列リテラルは、RES0 または同様のリソースセクションにまとめて格納されます。コード本体からは、これらの文字列へのポインタ(参照)が使われるため、コードとデータを分離できます。

これらの構造を理解することで、バイナリエディタを使うだけで、EX4ファイルがどのDLLに依存しているか、どのような文字列を使用しているか、といった多くの情報を読み取ることが可能になります。これは、プログラムの解析やデバッグ、さらにはセキュリティ分析において非常に強力なスキルとなります。

Quiz Questions 1/5

EX4ファイルの先頭にある、そのファイルがMQL4プログラムであることを示すための最初の4バイトのシーケンス(マジックナンバー)は何ですか?

Quiz Questions 2/5

EX4ファイルは、コード、データ、リソースなどを格納する複数の「セクション」に分かれています。プログラムのロジック本体であるコンパイル済みMQL4バイトコードは、どのセクションに格納されていますか?

これで、EX4ファイルの内部構造についての基本的な理解が得られました。この知識は、単なるプログラミングを超えて、ソフトウェアが実際にどのように動作しているかを解き明かすための鍵となります。