2011-03-03 120 views
0

我有一个应用程序,编写在C++和编译与VS 2010. 我需要加载.net dll编写的C#和编译.net 4.0平台从C++代码并调用一些函数。我已经通过C++ CLR及其调用.net函数完成了这项工作,直到.NET 4.0未安装在系统中。C++ CLR加载.net 4.0 dll当.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异常并显示人类可读的错误解释?

感谢事先确定目标组合的CLR运行库版本

回答

1

0xE0434F4D是托管异常的异常代码。当你得到这些代码时,它已经太晚了。未处理的异常,没有现场代码留下解释异常。在CLR启动的早期阶段改进错误处理需要您自己托管CLR。 Google CorBindToRuntimeEx查找所需的样板代码。

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

3

一种方法是通过.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 \软件\微软\ NET Framework安装\新民主党\ V4的存在。

请参阅How to detect what .NET Framework versions and service packs are installed?