[英]BadImageFormatException occurring when loading a native DLL in .NET 4.0
[英]C++ CLR loading .net 4.0 dll when .net 4.0 is not installed
我有一个用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
问题:
提前致谢
确定目标程序集的CLR运行时版本的一种方法是,在通过.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的存在 。
0xE0434F4D是托管异常的异常代码。 到您获得该代码时,已经为时已晚。 未处理该异常,没有任何活动代码可以解释该异常。 在CLR启动的早期阶段,改善错误处理需要自己托管CLR。 Google CorBindToRuntimeEx查找所需的样板代码。
编写更好的安装程序以确保.NET 4.0正确部署在计算机上可能是更有效的攻击计划。 安装项目真的很简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.