デコンパイルすると動かないコード(?!)

先日みつけた、int 最小値バグを調べていて気づいたのが、表題の「デコンパイルすると動かないコード」です。正確には、「動かない」のではなくて、挙動が変わるだけですが、デコンパイラをお持ちの人は以下のコードを試してみてください。(ちなみに、Purebeamさんは、8/10 にデコンパイラの販売を停止されています..)


↑このコードをex4にコンパイルして実行すると、OK が表示されます。


↑先の ex4 をデコンパイルした結果がこのコードです。
これをコンパイルして実行すると、NG が表示されます。変数に設定した値がビミョーに変化しているのが分かります。



上記は単純な例ですが、デコンパイルで数値が変わる特性を利用して、大量の変数で複雑に分岐すれば、ある種のデコンパイル対策になるかもしれません。^^;

   int a = -2147483648;
   int b = -2147483647;
   int c = -2147483648;
   int d = -2147483647;
   ↓デコンパイル結果 (フラグ情報が失われる)
   int li_0 = -2147483647;
   int li_4 = -2147483647;
   int li_8 = -2147483647;
   int li_12 = -2147483647;



ついでに、過去の記事で、デコンパイル対策に質問があったので回答します。

DLL初心者 (58.138.41.236)
『作ったDLLをただただWinlicenseでプロテクトしています。
ソースコードでマクロを利用するという手法を教えて頂けませんでしょうか?
(可能であれば全国1000万低級MQL使いの為に記事化していただけると尚嬉しいです(笑

ご指導宜しくお願い致します^^;』

ヘルプを読めば解決すると思うので・・・、以下その手順です。



(1)ヘルプを読む。
WinLicense Help から、SecureEngine(R) Macros を調べる。
その中の VM macros , CodeReplace macors , CheckCodeIntegrity macro を調べる。
(他にも有用なマクロがあったと思うけど、DLLからは使えない可能性がある..)


(2)サンプルコードを調べる。
WinLicenseSDK\ExampleSDK の Macro系サンプルフォルダ内の Visual C++ のサンプルコードを見る。


(3)試す。
#include "....\C\WinLicenseSDK.h"
↑ヘッダファイルをインクルードして、
↓処理の前後をマクロ専用の大文字の文字列で囲む。

// VM macros の例
VM_START
a=b+c;
VM_END

// CodeReplace macors の例
CODEREPLACE_START
for(int i=0;i<100;i++){
value += (value*i*4) <<1;
}
CODEREPLACE_END

その後、コンパイルして出来上がったDLLをWinlicenseでプロテクトする。


以上です。。。
(個人的には、某EAがクラックされてしまったのは残念だったけど、この辺りを見ると、WinLicense/ThemidaのUnpackingチュートリアルが出回っているので、無理もないかな..と思います。常に最新版のWinLicense で大量のマクロ(〜10個/1MB)を埋め込んで対抗するしかないです。。
ちなみに、これは、Themidaの暗号化マクロの挙動を追いかけるチュートリアル動画です。解析者がどんな画面を見て作業しているのか・・・雰囲気が分かります。