2010-05-23 15 views
9

Ho bisogno di analizzare semplice Win32 DLL/Exe e ottenere tutte le importazioni ed esportazioni da esso per mostrare su console o GUI (cioè Win Form). È possibile analizzare Win32 DLL/Exe in C# .NET leggendo le sue tabelle di esportazione/importazione e ottenere tipi gestiti da esso? Essendo PE non gestito, .NET non consente di convertire file PE non gestiti in assembly gestiti .NET, ma genera solo assembly COM gestiti.Analisi semplice file PE Win32 (EXE/DLL) in .NET

Come posso analizzare queste tabelle e prendere tutti i suoi metodi (firme) in forma gestita. (ad esempio, se char * come argomento, dovrebbe essere visualizzato come IntPtr).

+0

Usman, non c'è ad esempio pensare come "C# .NET". –

+0

Perché questo wiki della comunità? –

+0

@John: C# appartiene a .NET ..? Ho detto qualcosa di strano ..? – Usman

risposta

2

L'analisi dei file PE è possibile utilizzando Microsoft Portable Executable Specification Document. Tuttavia, come notato da Logan, le firme sono non incluse nel file PE; sono inclusi solo i nomi delle funzioni esportate.

UPDATE: Se la DLL è una DLL C++ creato da una versione recente di C++ di Microsoft compilatore, allora si può undecorate il nome storpiato per ottenere la maggior parte della firma chiamando questa funzione: UnDecorateSymbolName da Debugging Tools for Windows. Tuttavia, il valore restituito non è incluso nel nome storpiato.

+0

sono decorati. Quando li decori, ottieni le firme esatte (a parte i nomi dei parametri, solo i tipi). Quindi in questo modo hai ottenuto quasi il 90% della firma. – Usman

+0

La maggior parte delle DLL di Windows ha interfacce in stile C e nomi non codificati senza informazioni sui parametri. Se hai qualche dll specifico in mente, allora come ho detto puoi controllare quelli con dumpbin. –

+0

Vedere la risposta aggiornata alla non decostruzione dei nomi C++ storpiati. –

2

Per quanto riguarda la seconda parte della domanda, ottenere le firme del metodo, questo è, come regola generale, impossibile. Quella informazione non è solitamente memorizzata nel PE stesso. Per le funzioni C++ può essere possibile, perché il nome distorto codificherà quell'informazione, ma molte DLL non espongono le interfacce C++. Per le interfacce COM, queste informazioni sono memorizzate in una libreria di tipi, spesso incorporata come risorsa nel PE. Per vedere se questo è possibile per le dll specifiche che hai in mente puoi usare dumpbin e undec per vedere se le funzioni sono nomi mutilati C++. In caso contrario, avrete bisogno di qualche altra fonte di informazioni come i file di intestazione per creare le firme P/Invoke appropriate (nel qual caso probabilmente non è necessario analizzare il file PE).

Problemi correlati