11

私は次のコードを使用しています:

AppDomain.CurrentDomain.AssemblyLoad += (sender, args) =>
{
    var token = args.LoadedAssembly.GetName().GetPublicKeyToken();

    if (!IsValidToken(token))
    {
        Process.GetCurrentProcess().Kill();
    }
};

読み込まIsValidToken()れているアセンブリの公開キー トークンを、アプリケーションでバイト配列としてハードコードされた承認済みの公開キー トークンのリストと比較します。

これは、コード インジェクション攻撃を防ぐための適切なセキュリティ対策ですか? また、後で NetReactor を使用してアプリケーションを難読化するという事実を考えると、これは必要ですか? Snoop ツールだけでなく、外部の望ましくないソースからも、アプリケーションへの「スヌーピング」を防止しようとしています。

4

2 に答える 2

3

一見したところ、「いや、これでは足りない」と言うつもりです。

理由:

  • CreateRemoteThread攻撃はまっすぐなwin32呼び出しであり、このような検出器を作動させるマネージコードトレースはありません

  • AppDomainインジェクションされたdllに別のDLLを作成して、このチェックを完全にバイパスすることは可能だと思います。次に、そこからコードを実行しAppDomain、潜在的に(私はそれを考えなければならない)AppDomain経由で「メイン」にコールバックすることができますAppDomain.DoCallback

  • Process.Killこれは、アプリケーションをドロップする恐ろしい方法ですが、トラップできない方法です。つまり、接続されている人は誰でもそれを防ぐことはできません(内部でWin32TerminateProcessを使用します)

これらのステートメントをテストするには、「インジェクター」ハーネスをバストアウトする必要があります。コードをどこに置いたかを思い出せれば...

これらのいずれかに関係なく、特に機密ビットを内部に格納することを計画している場合は、このアセンブリの地獄を完全に難読化する必要があります(実際、機密情報をアセンブリ内に格納することはできません) -あなたの防止方法は、Reflector、ILSpy、dotPeekなどの逆アセンブラを完全に停止することはありません。

于 2013-03-05T00:55:17.087 に答える
2

実行時に (おそらく複数の部分キーから) 完全なキーを生成した方が安全です。これは、キーのバイナリを静的に調べることを回避します。

于 2013-03-08T21:49:56.300 に答える