2010-05-23 15 views
9

Necesito analizar Win32 DLL/Exe y obtener todas las importaciones y exportaciones desde allí para mostrar en consola o GUI (es decir, Win Forms). ¿Es posible analizar Win32 DLL/Exe en C# .NET leyendo sus tablas de exportación/importación y obteniendo tipos administrados de ella? Como es PE no administrado, .NET no le permite convertir archivos PE no administrados a ensamblados .NET administrados, solo genera ensamblados administrados COM.Analizando archivo Win32 PE simple (Exe/DLL) en .NET

Cómo puedo analizar estas tablas y tomar todos sus métodos (firmas) en forma administrada. (por ejemplo, si char * como argumento, debe mostrarse como IntPtr).

+0

Usman, no hay tal piensan como "C# .NET". –

+0

¿Por qué esta comunidad es wiki? –

+0

@John: C# pertenece a .NET ..? He dicho algo extraño ...? – Usman

Respuesta

2

El análisis de archivos PE es posible con Microsoft Portable Executable Specification Document. Sin embargo, como señaló Logan, las firmas son no incluidas en el archivo PE; solo se incluyen los nombres de las funciones exportadas.

ACTUALIZACIÓN: Si el archivo DLL es una DLL de C++ creado por una versión reciente de C++ de Microsoft compilador, entonces se puede Undecorate el nombre revuelto para obtener la mayor parte de la firma de llamar a esta función: UnDecorateSymbolName de Debugging Tools for Windows. Sin embargo, el valor de retorno no está incluido en el nombre destrozado.

+0

nombres están decorados. Cuando los decodifica, obtiene firmas exactas (aparte de los nombres de los parámetros, solo escribe). ASÍ que obtuviste casi el 90% de la firma. – Usman

+0

La gran mayoría de las DLL de Windows tienen interfaces de estilo C y nombres no protegidos sin información de parámetros. Si tiene algunos dlls específicos en mente, entonces como dije, puede verificarlos con dumpbin. –

+0

Ver la respuesta actualizada re undecorating nombres C++ destrozados. –

2

En cuanto a la segunda parte de su pregunta, obtener las firmas de método, esto es, como regla general, imposible. Esa información generalmente no se almacena en el propio PE. Para las funciones de C++, puede ser posible, porque el nombre destruido codificará esa información, pero muchas DLL no exponen las interfaces de C++. Para las interfaces COM, esta información se almacena en una biblioteca de tipos, a menudo integrada como un recurso en el PE. Para ver si esto es posible para los dlls específicos que tiene en mente, puede usar dumpbin y undec para ver si las funciones son nombres alterados de C++. De lo contrario, necesitará alguna otra fuente de información, como archivos de cabecera, para crear firmas P/Invoke adecuadas (en cuyo caso probablemente no necesite analizar el archivo PE).