0

我有一个应用程序,用 c++ 编写并用 VS 2010 编译。我需要加载用 C# 编写并从 c++ 代码为 .net 4.0 平台编译的 .net dll 并调用一些函数。我已经通过 C++ CLR 及其调用 .net 函数完成了这项工作,直到系统中没有安装 .net 4.0。

当未安装 .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. 是否可以从 C++ 代码中确定加载的 dll 的目标 .net 平台,并确定系统中是否安装了该平台?
  2. 也许还有其他方法可以防止 SEH 异常并显示人类可读的错误解释?

提前致谢

4

2 回答 2

3

确定目标程序集的 CLR 运行时版本的一种方法是在通过 .NET 加载程序(反射)加载之前直接读取 DLL 文件的标头。您可能需要检查 IMAGE_COR20_HEADER 标头中的 MajorRuntimeVersion 字段。

有关详细信息,请参阅http://ntcore.com/files/dotnetformat.htmhttp://www.codeproject.com/Articles/65181/From-Binary-to-Data-Structures.aspx 。

要确定是否安装了 .NET 4.0,您可以检查注册表项 HKLM\Software\Microsoft\NET Framework Setup\NDP\v4是否存在。

请参阅如何检测安装了哪些 .NET Framework 版本和服务包?.

于 2011-03-03T20:49:20.640 回答
2

0xE0434F4D 是托管异常的异常代码。当你得到那个代码时,已经太晚了。异常未处理,没有可用的代码来解释异常。在 CLR 启动的早期阶段改进错误处理需要自己托管 CLR。谷歌 CorBindToRuntimeEx 找到所需的样板代码。

编写一个更好的安装程序以确保 .NET 4.0 正确部署在机器上可能是一个更有成效的攻击计划。安装项目真的很简单。

于 2011-03-03T21:28:11.783 回答