2025年2月13日木曜日

難読化のはなし

EA開発において、ロジックの保守は極めて重要です。

しかし、デコンパイルを試みる人がいる以上、コードの難読化は必須といえるでしょう。

代表的なデコンパイル対策には、以下のようなものがあります。


1️⃣ 外部ファイルを使用する

→ ex4ファイル単体ではなく、外部ファイルを参照する方法。ただし、外部ファイルの配布や設置の手間が増えるうえ、それ自体が解析されるリスクもあります。


2️⃣ 暗号化コンパイルを活用する

→ META EDITORではコードを暗号化した状態でコンパイルできます。

しかし、これも突破される可能性があると言われています。


3️⃣ 変数を増やしてコードを難読化する

→ 読解を困難にすることで解析を防ぐ手法。

ただし、開発側も大幅に手間が増え、メンテナンスが煩雑になるデメリットがあります。


どの手法にも一長一短があり、完全な防御策は存在しません。

しかし、複数の対策を組み合わせることで、解析の難易度を大幅に引き上げることは可能です。

EA開発者として、常に対策を講じながら、資産を守る意識が求められますね。


ソースコードを読んでも理解しづらくするテクニック


デコンパイル対策の一環として、コードの可読性を意図的に下げる方法を紹介します。

今回は、シンプルな条件分岐を難読化してみましょう。


通常のコード

if(x == 9 || x == 10)return;

このコードは、x が 9 または 10 のときに処理を終了します。非常に分かりやすいですね。


難読化したコード

if (!(bool)((x - 9) * (x - 10))) return;

この書き方では、(x - 9) * (x - 10) = 0 となる場合に return されます。

具体的には、

x = 9 のとき → 9 - 9 = 0 となる

x = 10 のとき → 10 - 10 = 0 となる

したがって、 x = 9 または x = 10 のとき return される点は元のコードと同じですが、数学の知識がないと一見して理解しにくくなっています。

さらに、わざわざ bool に型キャストし、! を使って判定している点も可読性を下げるポイントです。

このように、シンプルな条件式でも数学的な変形や冗長な型変換を組み合わせることで、解析の難易度を高めることができます。

デコンパイルを防ぐためには、こうしたテクニックを適宜取り入れながら、コードの保護を強化していきましょう。