2009-09-14 7 views
13

Potrzebuję przetworzyć wiele plików DLL i exe w folderze i określić, jaki typ pliku mam do czynienia: .NET, COM, Win32 lub jakiejś innej formy życia obcych.Jak mogę wykryć typ biblioteki DLL? (COM, .NET, WIN32)

Próbowałem określić najprostszy sposób, aby wykryć rodzaj DLL, co myślisz o tym:

  1. dll COM => I zrobić LoadLibrary, następnie GetProcAddress dla "DllRegisterServer". Jeśli otrzymam prawidłowy zwrot, jest to plik COM.

  2. .NET dll => Jeśli dll zależy Mscoree.dll to zawsze dll .NET?

  3. Win32 dll => Jeśli oba powyższe testy zakończą się niepowodzeniem, jest to Win32 dll?

Z pewnością musi istnieć lepszy sposób na wykrycie, z jakim typem dll mamy do czynienia. Powyższe jest bardzo niezgrabne i nie będzie działać z plikami EXE? Musi istnieć jakiś inny sposób, o którym nie myślę.

Idealnie chciałbym móc sprawić, aby analizator składni ustalił, z jakim kompilatorem plik został skompilowany i jakie funkcje używa, takie jak MFC, Atl, Stl itd ... Ale wątpię, aby było to możliwe w Era refleksji?

Odpowiedz

1

nie widzę lepszego sposobu robi. Jednak w 2., tak naprawdę odpowiedź brzmi: nie. Hosty runtime prawie na pewno będą również zależeć od mscoree.dll, a te niekoniecznie są zespołami .Net.

. Pliki dll .Net mają deskryptor COM, który można znaleźć za pomocą dumpbina. Nie wiem, jak uzyskać te informacje z kodu.

Jeśli programujesz w .Net, jednym ze sposobów sprawdzenia, czy zestaw jest zespołem .Net jest próba wywołania Assembly.LoadFrom (...).

Cóż, to nie jest prawdziwa odpowiedź, ale zestaw wskazówek, na które powinienem zaglądać.

+0

Cześć, dzięki. Użyłem wcześniej podejścia "spróbuj załadować zespół" - ale wygląda na to, że jest strasznie niezgrabne, prawda? Wygląda na to, że muszę zejść z trasy PE. Może to być dobry składnik wielokrotnego użytku. Miałem nadzieję, że w bibliotekach jest ukryty element, ale nie zgadujcie. –

+0

Tak, to wygląda na strasznie przylegającego ... yyucckckk! :-) Powodzenia! –

4

DllRegisterServer nie jest to konieczne, wymagane tylko eksport do dll COM jest DllGetClassObject