How can I detect the type of a dll? (COM, .NET, WIN32)

大兔子大兔子 提交于 2019-12-17 16:07:04

问题


I need to process a number of dll's and exe files in a folder and determine what type of file I am dealing with: .NET, COM, Win32 or some other alien life form.

I've been trying to determine the easiest way to detect the type of a DLL, what do you think of this:

  1. COM dll => I do a LoadLibrary, then GetProcAddress for "DllRegisterServer". If I get a valid return, it's a COM file.

  2. .NET dll => If the dll depends on MSCOREE.DLL it's always a .NET dll?

  3. Win32 dll => If both the above tests fail, it's a Win32 dll?

Surely there must be a better way to detect what type of dll we are dealing with. The above is very clunky, and won't work for EXE files? There must be some other way that I am not thinking of.

Ideally I'd like to be able to make the parser determine what compiler the file was compiled with, and what features it uses such as MFC, Atl, Stl etc... But I doubt that's possible in the pre-reflection era?


回答1:


You must check the PE Header of these files. All DLL and executables, Win32 and .NET, have a PE header.

An In-Depth Look into the Win32 Portable Executable File Format

The .NET File Format

Portable Executable




回答2:


DllRegisterServer is not required, the only required export for a COM dll is DllGetClassObject




回答3:


I don't see a better way of doing it. However, at 2., actually the answer is no. Runtime hosts will almost certainly also depend on mscoree.dll, and those are not necessarily .Net assemblies.

.Net dlls have a COM descriptor, which you can find using dumpbin. I don't know how to get this information from code.

If you are programming in .Net, one way of determining if the assembly is a .Net assembly is by trying to call Assembly.LoadFrom(...).

Well, this isn't a real answer, but a set of tips of things I'd look into.



来源:https://stackoverflow.com/questions/1420726/how-can-i-detect-the-type-of-a-dll-com-net-win32

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!