これを防止する方法は?
私が理解できる限り、とは限りません。しかし、あなたはそれを簡単にすることはできません。
単純なケースでは、ILを注入する必要はありません。 IL編みを行ってアセンブリを変更することができます。たとえば、ログインメソッドantを見つけて元のILコードを削除し、単にtrue
を返すか、自分のログインメソッドにジャンプすることができます。
public bool Login(string userName)
{
// original method did security checks
// and return true if the user is authorized
// your implementation can return true or jump to other method
}
これは、アプリケーションが実行されていないときに行う必要があります。アセンブリ自体を変更する必要があります。あなたはmono.cecil
でそれを行うことができ、例えばStaticProxy.Fodyを見ることができます。
もう1つのケースは、実行中のアセンブリにコードを注入する場合です。この2つの場合に分割される:
- コードは、コードが最初のケースで\ ngen'd
JITコンパイルされている場合、より容易
あるngen'd \ JITコンパイルされていない場合、あなたはまだ各メソッドのILを持っていて、独自のIL命令を注入します。 ジッタがILポインタをマシンコードにリダイレクトするため、2番目のケースはより複雑です。
2人のために、注射作業を行うために記事\ librarisの束を見ることができます。
しかし、あなたはしかし、注入することを不可能にしても、あなたはまだ保護されていません。バイト自体を変更できるためです。詳細はthis articleを参照してください。
上記のすべての方法では、作業が複雑になる場合があります。たとえば、GenericsのDynamicMethodsは、プロセスへのロード・アセンブリを防止します(場合によっては必要です)。
要約すると、コードを挿入するのは非常に難しくありませんが、防ぐことはできません。
この質問には根本的に欠陥があります。 MSILを変更してセキュリティ機能をバイパスすることができる場合は、MSILを変更せずに同じセキュリティ機能をバイパスすることもできます。どのセキュリティ機能を念頭に置いていますか?それについての詳細を記入すると、バイパスが完全に防止される方法、またはバイパスが完全に防ぐことができない理由を回答で説明することができます。 – hvd
興味深い質問、なぜこのような措置を防ぐことを唯一の目的とする企業があるのかを歓迎します。私は答えはありませんが、約15年前、私は様々な悪意のある目的のためにSoftICEデバッガのクラッキングソフトウェアで楽しい経験をしていました。私が学んだ教訓は、「彼ら(私たち)は常に方法を見つけます!」です。最近はますます難しくなっていますが、正当なユーザーを迷惑にすることと悪いことを防ぐこととのバランスがすぐになります。 –
正確に何を防ぐ?マシン上で任意のコードを実行したり、バイナリを変更したりする能力あなた自身のサーバー上でコードを実行することは、例えばログイン目的のために、Xbox/PS –