保護上の理由から、現在の実行可能ファイルのメモリ イメージをチェックするスレッドを実行したいと考えています。現在のメモリ実行可能ファイル (WinAPI または .NET の方法) で CRC を実行する方法はありますか? 私のアプリは .NET で書かれています。
5 に答える
アセンブリに署名すると、.NetアセンブリのCRCを検証するために得られるのと同じくらい良い検証が得られます(Rodrigoの回答を参照)。
誰かが実行時にアセンブリにパッチを当てるのではないかと心配しているなら、おそらく心配しすぎているでしょう。単に .Net コードを逆アセンブルして修正する (CRC チェックの削除を含む) のと比較して、既に JIT されているメソッドのインメモリ パッチ IL へのランタイムをよりよく理解する必要があります。
アセンブリがロードされているベースアドレスを見つけて、ある種のCRCを計算することができるはずです...または、ページが変更済みとしてマークされているかどうかを確認できます...
実行時チェックには、次の欠点があります。
- 偽陽性。これは .NET であるため、ランタイムがメモリ内コードを変更しないと想定することはできません。何もないところでハッキングを検出する場合があります。
- 実行時のチェックは、保護しようとしているコードよりも安全ではありません。これには、定期的な CRC チェック、センチネル プロセス、さらにはリクエストが偽造される可能性があるサーバーでのチェックなど、アプリで作成するランタイム メカニズムが含まれます。
- 正当なアプリケーションのパフォーマンスが低下しますが、海賊版はこれらのすべてのチェックなしでより適切に動作します
- EXE へのパッチ適用を解決するために何もしません。
100% 解けないわけではありませんが、できるだけ難しくしようとしていることは理解しています。しかし、あなたが提案する解決策 (およびおそらくあなたが自分で実装できる解決策) は、平均的なクラッカーを阻止するためにほとんど役に立ちません。
ただし、これは非常に要求の厳しい機能であるため、クラッキング技術の進化に合わせて更新できる洗練されたソリューションに力を入れているサードパーティのソリューションを探します。個人的にはおすすめできませんが。
.NET ではかなり難しいと思います。実行可能ファイルが読み込まれると、メモリ内のいくつかの異なる領域に分割されて読み込まれる可能性があります。Windows の実行可能形式について理解する必要があります: http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx
Windows 実行可能ファイルの読み込みプロセスと同様に。
また、依存関係の dll にも気を配る必要があるかもしれません。非常に多くのネイティブ呼び出しを行うため、C でこれを行うことを検討することをお勧めします。
たいした答えではありません、恐れ入ります。
.NET でこれを行う方法を知りません。実行可能ファイルの保護に関心がある場合は、新しいキーを生成しsn
て AssemblyInfo.cs に追加し、アプリケーションが変更された場合に少なくとも実行されないようにすることができます。
Jon Skeet の Miscellaneous Utility Libraryには、ストリームのAdler32 チェックサムを計算するメソッドが含まれています。その使用法は次のとおりです。
MiscUtil.Checksum.Adler32.ComputeChecksum(stream);
現在実行中のアセンブリからメモリストリームを作成することに関しては...それが可能かどうか(または推奨されるかどうか)はわかりません。