none
如何识别一个DLL文件是C/C++动态链接库还是.NET程序集? RRS feed

答案

全部回复

  • 你好,

    根据你的问题,你想识别dll 是C++还是.Net, 不知道你说的识别是指程序识别还是工具识别?

    如果是程序方面的识别,一般我们如果直接在C++中引用.net dll程序会报错的,一般需要我们将.Net dll 生成组件dll 然后再在C++中用,而且需要做些相应的配置。比如开启clr 选项之类的。同样在.net 程序中直接使用C++ dll 也是会有问题的,一般要我们通过interop技术比如Pinvoke之类的来做的。

    如果可以使用工具,你可以用CorFlags.exe (CorFlags Conversion Tool) 工具来识别。比如我有两个dll 文件,一个native C++ dll 和 一个 .Net dll, 我分别用corFlag 工具去打开文件,会得到不同的信息,当尝试去打开非.net 文件时,它将会提示没有manged header. 具体细节请看我的截图:

    这个是打开.net dll 的显示:

    这个是打开C++ dll 的显示:

    May


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已建议为答案 TANSHUAI 2014年9月26日 1:21
    2014年9月24日 8:08
  • 我想知道用C++代码识别一个DLL文件是否是C++动态链接库。截图里提示.NET程序集有一个PE32文件头,还有一个CLR文件头?我想知道如何读取到它呢?我想仅仅做一个判断。

    妆台秋思


    2014年9月25日 20:05
  • 你好,

    我认为你可以借鉴corflag的实现原理,换言之就是你也可以使用PortableExecutableKinds Enumeration 和 Module::GetPEKind Method 这样的API去获取。

    除此之外,你也可以自己去读PE头,类似这个链接中的方式:

    http://geekswithblogs.net/rupreet/archive/2005/11/02/58873.aspx

    May


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年9月26日 3:10
  • 非常感谢,我想读取PE文件头,找到那个CLR文件头,不过我没有成功。我看到了您提供的链接,我觉得他的意思是偏移0x3C+0x32+0x60+0x70个字节,读取这个地方的4个字节,我试试c:\windows\system32\ntdll.dll,结果不为0,再试一试c:\Windows\Microsoft.NET\Framework64\v4.0.30319\system.dll,结果是0,这与它的代码逻辑的意思刚好相反。请问问题在哪里呢?

    我还试了这个方法:

    void CsfclrDlg::OnClickedButton2()
    {
    	UpdateData();
    	CFile f(m_DllPath,CFile::modeRead);
    	PBYTE data=(PBYTE)calloc((ULONG)f.GetLength(),sizeof(BYTE));
    	f.Read(data,(UINT)f.GetLength());
    	f.Close();
    	PIMAGE_DOS_HEADER pdosHeader=(PIMAGE_DOS_HEADER)data;
    	PIMAGE_NT_HEADERS32 pntHeader=(PIMAGE_NT_HEADERS)(pdosHeader+pdosHeader->e_lfanew);
    	PIMAGE_COR20_HEADER pclrHeader=(PIMAGE_COR20_HEADER)(pntHeader+sizeof(PIMAGE_NT_HEADERS32));
    	
    }
    

    不过我无法从PIMAGE_COR20_HEADER找到确切证明模块是.NET模块的信息,因为C++的DLL也可以这么强制转换过来。您能告诉我从哪里检查数据的合法性以确定该模块是.NET模块吗?

    除上述方法外,我想加一个辅助条件来判断,即找到PE文件入口点,读取入口点的6个字节,确定是否FF 25 00 20 40 00(jmp dword ptr [00402000])或者FF 25 00 20 00 10,您觉得呢?

    我看到Windows Platform SDK里面许多头文件以cor开头,比如CorHdr.h文件,我粗略看了里面的内容,好像SDK里面提供了C++与.NET 托管代码交互操作的方法,我想知道哪里有这些方面的资料。比如,如何检测到.NET程序有未经处理的异常,在.NET弹框提示用户之前我能否捕捉得到并自行处理(比如导出DMP文件)?


    妆台秋思






    2014年9月26日 16:12