デコンパイルすると動かないコード(?!)
先日みつけた、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"
↑ヘッダファイルをインクルードして、
↓処理の前後をマクロ専用の大文字の文字列で囲む。
// 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の暗号化マクロの挙動を追いかけるチュートリアル動画です。解析者がどんな画面を見て作業しているのか・・・雰囲気が分かります。