MT4EAを実際にデコンパイルしてみて、対策を考える
目次/もくじ
逆コンパイルとは
逆コンパイルというのは実行ファイルからソースコードファイルを復元することで、デコンパイルとかデコードとかリバースエンジニアリングとかって言われたります。
高値で取引されるソフトウェアではこの逆コンパイル対策が必須で、EAも例外ではありません。
今はあまり聞かなくなりましたが、2014年2月のbuild610アップデート以前は、MT4のコンパイラのシンプルさ故に逆コンパイルソフトが存在していたようです。
MQLはもともとCをベースに開発されているため、Cの逆コンパイラーがそのまま通ってしまっていたそうですね。今回は実際に逆コンパイルされるとどうなるのか、その対策について紹介します。
実際に逆コンパイルしてみる
では、実際のこの流れをやってみましょう。
これはMT4にデフォルトで入っているサンプルのMACDのEAです。
これを逆コンパイルします。
逆コンパイルされるとどうなるか
まずは、実際に逆コンパイルされたコードを見てみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
... 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(); } } } } |
これはコードの一部ですが、基本的にはこのように変数名とコメントが失われます。
このまま再コンパイルしても多くの場合通るので、改良・編集したり新たに口座縛りをかけたりすることが可能になってしまいます。
また、アタッカーはいろんな理由で中身のトレードロジックを読み解こうとします。
つまり、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
... 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演算子がないので変数名を取得することができません。
難読化処理
また一つの手として、改行を消して難読化処理をする手があります。
JavascriptやJqueryなんかで良く行われている方法で、改行が失われることで純粋に”読みにくく”なります。
ただし、コード中に//でコメントアウトしている場所がある場合は、そこで以降のコードが一気にコメントアウトされてしまうので、/**/でコメントにした方が難読化処理が捗ります。
(逆に言うと、やたら/**/でコメントしている人はそれを意識している可能性が高いのかも)
ダミー変数を作る
他には、ダミーの変数を作る方法です。
変数名が失われたコードを解読する際には、変数にどの値を代入したかを追っていく作業があります。そのときに、意味が分かっていない変数が何個も出てきてそれが複合的に演算されると追跡作業が困難になるという性質があります。
そのため、実際には意味のない変数をいくつか作っておき、それを変なタイミングで使うと、”多少”対策になります。
巨大な数は…
ちなみに、「極端に巨大な数は逆コンパイルされたときに区別がつかずに同じ数字になってしまう」という性質を使った方法もなくはないですが、
必ずしもうまくいかなかったり、逆に逆コンパイルしていない状態でもバグになったりするのでおすすめはしません。
(あとパッと見で分かるので、そこだけ削除されて終わりだと思います)
WEB経由のコピートレードシステムを使う
最終的に最強の手としては、”そもそもex4ファイルにトレード手法を記載しない”ことなんじゃないかと思います。
これはもちろんDLLやライブラリにコードの一部を格納するということでもあるのですが、そっちもデコードされる危険性はある訳です。
究極的にはトレードの演算は別のところ(サーバー)でやって、トレードタイミングになったらフラグ(シグナル)をEAに送る、というのが最強だと考えられます。要するにWEBサーバーを使ったコピートレードシステム型の認証EAです。
なにせ、逆コンパイルされたとしても受信機能が見られるだけなので、超安心です。
WEBサーバーを経由するコピートレードシステムの作り方はこちら
関連記事
-
[MT4]チャートを分析して、一番多いパターンが来たらトレードするEA
パターン分析トレードとは 今回はMT4のファイル関数を使って、パターン分析トレードシステムを作成し
-
プログラマ向け自動売買開発アイディア
「MQL4/MQL5は扱えるようになったけど、プログラミングのアイディアがない」というプログラマは比
-
[MT4]EAに口座縛り/期間限定縛りをかける種類と方法(MT5)
良いEAができた場合、身内で配布したい場合があります。しかし、知らない間に自分のEAが出回っていた場
-
[MQL4]MT4でマルチタスク/マルチスレッド処理
MT4/MT5は基本的にC言語ベースなのでマルチスレッドはできません。 しかし、複数のチャート上で
-
OANDAのAPIの始め方と使い方とレート比較
オアンダのAPIやります。 金融業界、とりわけFX業界ではFIX APIが機関投資