1

私たちが使用する通信ミドルウェア用の C++ CLI ラッパーを作成しました。ラッパーは .NET 4.5 にあり、Windows 7 および Windows Server 2008 R2 で正常に動作します。しかし、Windows Server 2012 R2 では、mswsock.dll の「アクセス違反」エラーでクラッシュします。

興味深い点は、.NET 4.0 を対象とするラッパーとテスト アプリケーションをビルドすると、それが機能することです。しかし、それらを .NET 4.5.x に再ターゲットすると、例外がトリガーされます。

セキュリティ、厳密な名前付け、.NET のホットフィックスについて調査しようとしましたが、役に立ちませんでした。

問題は、.NET 4.0 の Server 2012 R2 では動作するが、4.5.x では動作しないことです。アクセス違反が発生するのは、明らかにネイティブ コードが winsock API にアクセスするときです。

同じ問題、または同様の Server 2012 .NET 4.0 と 4.5.x の有線の問題を経験した人はいますか?

.NET 4.5 アプリケーションの実行時に Server 2012 でアクティブ化され、4.0 アプリケーションではアクティブ化されないセキュリティ メカニズムはありますか。特にCLIモジュールに関して?

技術: ネイティブ コードは VS2010 でコンパイルされるため、ラッパーは VS2012 でそのコンパイラを使用してコンパイルされます。C++ CLI プロジェクト ファイルを編集して、目的のフレームワーク ターゲットを設定します。テスト アプリケーションは C# で記述されています。

4

2 に答える 2

1

.NET 4.5 を使用する Server 2012 R2 は、常に 32 ビット アドレス スコープ外のメモリを割り当てます。

はい、これは EXE ファイルで Dumpbin.exe /headers を使用するとよくわかります。表示される出力の関連部分を投稿します。

        4.00 operating system version
        0.00 image version
        6.00 subsystem version                      // <== here
           0 Win32 version
        8000 size of image
         200 size of headers
           0 checksum
           3 subsystem (Windows CUI)
        8560 DLL characteristics
               High Entropy Virtual Addresses       // <=== here
               Dynamic base
               NX compatible
               No structured exception handler
               Terminal Server Aware

サブシステム バージョンは、.NET 4.5 コンパイル済み実行可能ファイルにおける最初の重要な変更です。バージョン 6.00 は、以前は 4.00 に設定されていた Vista のバージョンです。副作用の 1 つは、プログラムが XP および Server 2003 で実行できなくなることです。バージョン 6 は、Windows カーネルの最後の抜本的なオーバーホールです。Vista の不人気の原因となった大きな変化です。

そしてHigh Entropy Virtual Addresses特徴は重要な変化です。それが、ネイティブ コードのバグを引き起こした原因です。このオプションは、マルウェア対策である ASLR (Address Space Layout Randomization) に関連しています。アドレス空間のレイアウトをランダム化することで、マルウェアがコードを攻撃することが難しくなり、そのようなコードが既知のアドレスに存在することに依存できなくなります。

オプションによって有効化された ASLR の元のバージョンはDynamic base、256 の可能なアドレス オフセットの 1 つを選択することによってアドレスをランダム化しました。ブート時に選択されます。64 ビット プロセスにははるかに優れた選択肢があり、アドレス空間がはるかに大きくなります。/HIGHENTROPYVA リンカー オプションを使用すると、これが有効になります。ただし、アドレスが下位 4 ギガバイトのアドレス空間に配置される可能性がなくなるという副作用があります。したがって、キャスティングバグをつまずかせます。

.NET 4.5 コンパイラは、4.5 以降をターゲットにするとこれらをオンにしますが、4.0 コンパイラはオンにしませんでした。XP と Server 2003 をサポートする必要がなくなった (4.5 を実行できない) ことで、これらのオプションが有効になりました。

于 2015-09-07T10:40:24.763 に答える
1

そのため、最終的にバグを発見しました。サードパーティの通信ミドルウェアには、64 ビット版でバグがありました。long にキャストされてから再度キャストされたポインターで、64 ビット アドレッシング エラーが発生しました。

.NET 4.5 を使用しているときに、なぜこれが最初に引き起こされたのかはわかりません。.NET 4.5 を搭載した Server 2012 R2 は、常に 32 ビット アドレス スコープ外にメモリを割り当てるようです。少なくとも私たちのテストベッドでは。常にこのアクセス違反エラーが発生しました。

于 2015-09-07T08:03:04.910 に答える