2010-09-14 24 views
1

Je voudrais ouvrir un fichier PE (que je sais est un assemblage .Net) et trouver où le bytecode .Net est (idéalement à partir de l'entrypoint). Je sais que les données d'en-tête PE (entrypoint RVA) me prennent juste à un bouchon qui appelle CorExeMain de mscoree.dll.Comment faire pour trouver par programme le bytecode (CIL) dans un .Net exécutable/dll?

Ce n'est pas ce que je cherche cependant. Je voudrais trouver le bytecode qui est exécuté par mscorlib. Comment puis-je faire cela en utilisant C++ et pas d'outils externes comme ildasm, dumpbin, etc.? Je peux déjà analyser l'en-tête PE et savoir ce que signifie la base d'image/RVA. Je ne peux pas trouver où trouver des informations suffisantes sur l'emplacement du bytecode IL.

Répondre

4

Jetez un oeil à ECMA-335 - les détails du format de fichier sont là, dans la partition II section 22-25. Je me souviens d'avoir trouvé quelques bugs quand j'ai essayé d'écrire un analyseur il y a quelques temps, mais avec un peu de persévérance, tout est faisable.

3

Je prendrais probablement le code de mono (cil_coff.h, pedump.c) plutôt que d'en écrire un à partir de zéro.

0

Sous Windows, il existe une API COM IMetaDataImport (étendue par IMetaDataImport2 avec prise en charge des génériques). Des exemples de son utilisation font cependant défaut. Le débogueur/éditeur apparemment non-maintenu mais ouvert de source IL dile (prend seulement en charge .NET 4 tel-comme dans les constructions hebdomadaires) l'utilise, ainsi vous pourriez vérifier son code. L'auteur de Dile a également écrit un billet sur l'utilisation de cette API, mais il est plutôt sinueux. Lien non fourni à cause des règles de spam. Google pour "Lecture des types d'assemblage".

Microsoft mdbg, qui est livré avec .NET SDK l'utilise également. Malheureusement, les sources mdbg ont été publiées uniquement pour la version .NET 2.0. Google pour mdbgSample21.EXE.