MT4EAを実際にデコンパイルしてみて、対策を考える

     

公開日: : 中級者EA開発 ,

逆コンパイルとは

逆コンパイルというのは実行ファイルからソースコードファイルを復元することで、デコンパイルとかデコードとかリバースエンジニアリングとかって言われたります。

 

高値で取引されるソフトウェアではこの逆コンパイル対策が必須で、EAも例外ではありません。

今はあまり聞かなくなりましたが、2014年2月のbuild610アップデート以前は、MT4のコンパイラのシンプルさ故に逆コンパイルソフトが存在していたようです。

MQLはもともとCをベースに開発されているため、Cの逆コンパイラーがそのまま通ってしまっていたそうですね。今回は実際に逆コンパイルされるとどうなるのか、その対策について紹介します。

実際に逆コンパイルしてみる

では、実際のこの流れをやってみましょう。

 

逆コンパイル前のサンプルソースコード

 

これはMT4にデフォルトで入っているサンプルのMACDのEAです。

これを逆コンパイルします。

逆コンパイル後のサンプルソースコード

 

逆コンパイルされるとどうなるか

まずは、実際に逆コンパイルされたコードを見てみてください。

...
int Gi_236 = 90;
int Gi_240 = 13;
int Gi_244 = 45;
int Gi_248 = 23;
int Gi_276 = 20;
int Gi_280 = 0;
int Gi_284 = 0;
int Gi_288 = 2;
int Gi_292 = 3;
...

int year_160 = Year();
   int Li_unused_164 = 0;
   if (year_160 <= Gi_512 && year_160 >= Gi_516) Li_unused_164 = 1;
   else Li_unused_164 = 0;
   if (OrdersTotal() > 0) {
      for (G_pos_420 = 0; G_pos_420 <= OrdersTotal(); G_pos_420++) {
         OrderSelect(G_pos_420, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC && OrderCloseTime() == 0) {
            if (OrderType() == OP_BUY) {
               G_datetime_316 = OrderOpenTime();
               if (Gi_172) G_order_open_price_332 = OrderOpenPrice();
            }
            if (OrderType() == OP_SELL) {
               G_datetime_320 = OrderOpenTime();
               if (Gi_172) G_order_open_price_340 = OrderOpenPrice();
            }
         }
      }
   }


これはコードの一部ですが、基本的にはこのように変数名とコメントが失われます。

このまま再コンパイルしても多くの場合通るので、改良・編集したり新たに口座縛りをかけたりすることが可能になってしまいます。

また、アタッカーはいろんな理由で中身のトレードロジックを読み解こうとします。

つまり、

...
int MaxMinute_PositionHolding = 90;
int Time_13 = 13;
int Minute_45 = 45;
int Time_23 = 23;
int Minute_45_ = 45;
int Hour_20_ = 20;
int Minute_0_ = 0;
int Time_0 = 0;
int Time_2 = 2;
...
int Year_Now = Year();
   int Is_Year_OK = 0;
   if (Year_Now <= Year_from && Year_Now >= Year_to) Is_Year_OK = 1;
   else Is_Year_OK = 0;

   //Check Holding Position---------------------------------------------------------------------------------------------------------
   if (OrdersTotal() > 0) {
      for (OrdersTotal_i = 0; OrdersTotal_i <= OrdersTotal(); OrdersTotal_i++) {
         ReturnOfOrderSelect = OrderSelect(OrdersTotal_i, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC && OrderCloseTime() == 0) {
            if (OrderType() == OP_BUY) {
               OrderOpenTime_buy = OrderOpenTime();
               if (Gi_172) OrderOpenPrice_Buy = OrderOpenPrice();
            }
            if (OrderType() == OP_SELL) {
               OrderOpenTime_sell = OrderOpenTime();
               if (Gi_172) OrderOpenPrice_Sell = OrderOpenPrice();
            }
         }
      }
   }


こんな感じで経験と勘と努力で変数の意味を解読していく訳です。
組み込みの関数は逆コンパイル時に喪失しないので、MQL開発者であればfor文とオーダーの価格の取得から建玉の確認をしているということは容易に推察されてしまいます。

 

また無理して意味を読み解かなくても制限解除とかができればOKな場合も多いと考えられるので、口座縛りの個所だけ読み解かれたらそれで終わりのケースも多いのではないかと思います。

 

逆コンパイル後の特徴

・コメント情報が消える

・変数名が連番になる(変数名の意味合い情報が失われる)

・組み込み変数・関数は保持される

 

傾向と対策

問題は、こういったリバースエンジニアリングをさせないためにどういった対策を行うか、ということです。

変数名が失われているので、「変数名がxxじゃなかったら動かない」のようにプログラミングしたいところではありますが、MQLにはnameof演算子がないので変数名を取得することができません。

 

難読化処理

また一つの手として、改行を消して難読化処理をする手があります。
bandicam 2017-12-17 13-01-55-647
JavascriptやJqueryなんかで良く行われている方法で、改行が失われることで純粋に”読みにくく”なります。

ただし、コード中に//でコメントアウトしている場所がある場合は、そこで以降のコードが一気にコメントアウトされてしまうので、/**/でコメントにした方が難読化処理が捗ります。

(逆に言うと、やたら/**/でコメントしている人はそれを意識している可能性が高いのかも)

 

ダミー変数を作る

他には、ダミーの変数を作る方法です。

変数名が失われたコードを解読する際には、変数にどの値を代入したかを追っていく作業があります。そのときに、意味が分かっていない変数が何個も出てきてそれが複合的に演算されると追跡作業が困難になるという性質があります。

そのため、実際には意味のない変数をいくつか作っておき、それを変なタイミングで使うと、”多少”対策になります。

 

巨大な数は…

ちなみに、「極端に巨大な数は逆コンパイルされたときに区別がつかずに同じ数字になってしまう」という性質を使った方法もなくはないですが、

必ずしもうまくいかなかったり、逆に逆コンパイルしていない状態でもバグになったりするのでおすすめはしません。
(あとパッと見で分かるので、そこだけ削除されて終わりだと思います)

 

WEB経由のコピートレードシステムを使う

最終的に最強の手としては、”そもそもex4ファイルにトレード手法を記載しない”ことなんじゃないかと思います。

これはもちろんDLLやライブラリにコードの一部を格納するということでもあるのですが、そっちもデコードされる危険性はある訳です。

 

究極的にはトレードの演算は別のところ(サーバー)でやって、トレードタイミングになったらフラグ(シグナル)をEAに送る、というのが最強だと考えられます。要するにWEBサーバーを使ったコピートレードシステム型の認証EAです。

 

なにせ、逆コンパイルされたとしても受信機能が見られるだけなので、超安心です。

 

WEBサーバーを経由するコピートレードシステムの作り方はこちら

 

関連記事

保護中: [MT4EA]完全無敗 勝率100%のバックテストを生成するEA[ソースコードあり]

今回はバックテストで完璧な成績を出すEAを作成しました。 意味は...ありません。ただの道楽です。

記事を読む

2chのスレをテキストマイニングするやり方

よく「大衆の逆をいけば勝てる」みたいなことが相場の世界では言われますよね。今回は2chの市況版の住民

記事を読む

(MQL4)WEBサイトの情報を取得するやり方[EA]WebRequest

MT4のチャート上にWEBサイトの情報を参照する方法について紹介します。   背景

記事を読む

利用可能なトレード系金融APIまとめ FIX API,REST API,OPEN API

今まで当たり前のようにMT4/MT5/TradeStationで開発をしてきましたが、そういえばAP

記事を読む

OANDAのAPIの始め方と使い方とレート比較

オアンダのAPIやります。   金融業界、とりわけFX業界ではFIX APIが機関投資

記事を読む

 

上に戻る