0

C++ で記述され、VS 2010 でコンパイルされたアプリケーションがあります。C# で記述され、.net 4.0 プラットフォーム用にコンパイルされた .net dll を c++ コードからロードし、いくつかの関数を呼び出す必要があります。.net 4.0がシステムにインストールされなくなるまで、C++ CLRとその呼び出し.net関数を使用してこれを既に行っています。

.net 4.0 がインストールされていない場合、関数呼び出しによって C++ コードで SEH 例外が発生しますが、ライブラリの読み込みは成功します。毎回例外コードは同じ 0xE0434F4D です。

KERNELBASE.dll!RaiseException()  + 0x3d bytes   
mscorwks.dll!RaiseTheExceptionInternalOnly()  + 0x295 bytes 
mscorwks.dll!UnwindAndContinueRethrowHelperAfterCatch()  + 0x63 bytes   
mscorwks.dll!CorDllMainForThunk()  + 0xcd bytes 
mscoree.dll!CorDllMainWorkerForThunk()  + 0x62 bytes    
mscoree.dll!VTableBootstrapThunkInitHelper()  + 0x12 bytes  
mscoree.dll!VTableBootstrapThunkInitHelperStub()  + 0x3e bytes  
hs.exe!SrvAuth::PluginProxy::ProxyBody()  Line 363 + 0x13 bytes C++
hs.exe!hs::hsThread::InvokableEntry(void * thread_obj=0x000000000024de90)  Line 458 C++
msvcr100.dll!_callthreadstartex()  Line 314 + 0xd bytes C
msvcr100.dll!_threadstartex(void * ptd=0x0000000000000000)  Line 292 + 0x5 bytes    C
kernel32.dll!BaseThreadInitThunk()  + 0xd bytes 
ntdll.dll!RtlUserThreadStart()  + 0x21 bytes    

質問:

  1. ロードされた dll のターゲット .net プラットフォームを C++ コードから特定し、そのプラットフォームがシステムにインストールされているかどうかを特定することはできますか?
  2. SEH例外を防ぎ、人間が読めるエラーの説明を表示する方法が他にあるのでしょうか?

前もって感謝します

4

2 に答える 2

3

ターゲット アセンブリの CLR ランタイム バージョンを特定する 1 つの方法は、.NET ローダー (リフレクション) を介して読み込む前に、DLL ファイルのヘッダーを直接読み取ることです。IMAGE_COR20_HEADER ヘッダーから MajorRuntimeVersion フィールドを確認する必要があります。

詳細については、http: //ntcore.com/files/dotnetformat.htmおよびhttp://www.codeproject.com/Articles/65181/From-Binary-to-Data-Structures.aspxを参照してください。

.NET 4.0 がインストールされているかどうかを判断するには、レジストリ キー HKLM\Software\Microsoft\NET Framework Setup\NDP\v4の存在を確認します。

インストールされている .NET Framework のバージョンと Service Pack を検出する方法を参照してください。.

于 2011-03-03T20:49:20.640 に答える
2

0xE0434F4D はマネージド例外の例外コードです。そのコードを取得するまでには、すでに手遅れです。例外は処理されませんでした。例外を解釈するためのライブ コードは残っていません。CLR 起動の初期段階でエラー処理を改善するには、CLR を自分でホストする必要があります。Google CorBindToRuntimeEx を使用して、必要なボイラープレート コードを見つけます。

.NET 4.0 がマシンに適切に展開されることを保証するより優れたインストーラーを作成することは、より実り多い攻撃計画になる可能性があります。Setup プロジェクトを使用すると、非常に簡単です。

于 2011-03-03T21:28:11.783 に答える