Как программно найти байт-код (CIL) в исполняемом файле .Net / DLL? - PullRequest
1 голос
/ 14 сентября 2010

Я хотел бы открыть PE-файл (который я знаю, это сборка .Net) и найти, где байт-код .Net (в идеале, начиная с точки входа).Я знаю, что данные PE-заголовка (точка входа RVA) переносят меня только в заглушку, которая вызывает CorExeMain из mscoree.dll .

Это не то, что я ищу, хотя.Я хотел бы найти байт-код, который запускается mscorlib.Как я могу сделать это, используя C ++ и без каких-либо внешних инструментов, таких как ildasm, dumpbin и т. Д.? Я уже могу проанализировать PE-заголовок и узнать, что означает основа изображения / RVA.Я просто не могу понять, где найти достаточную информацию о местонахождении байт-кода IL.

Ответы [ 3 ]

4 голосов
/ 14 сентября 2010

Посмотрите на ECMA-335 - подробности о формате файла приведены там, в разделе II, раздел 22-25.Кажется, я помню, что нашел несколько ошибок в нем, когда пытался написать парсер некоторое время назад, но с некоторой настойчивостью все это выполнимо.

3 голосов
/ 14 сентября 2010

Я бы, вероятно, взял код из mono (cil_coff.h, pedump.c), а не написал его с нуля.

0 голосов
/ 11 декабря 2011

В Windows для этого есть COM API, IMetaDataImport (расширен IMetaDataImport2 с поддержкой обобщений). Однако примеров его использования довольно мало. Кажущийся не очень поддерживаемым, но с открытым исходным кодом отладчик / редактор IL dile (поддерживает только .NET 4 так себе в еженедельных сборках) использует его, чтобы вы могли проверить его код. Автор Dile также написал сообщение в блоге об использовании этого API, но оно довольно сложное. Ссылка не указана из-за спам-правил. Google для "Чтение типов из сборки".

Microsoft mdbg, которая поставляется с .NET SDK, также использует его. К сожалению, исходники mdbg были выпущены только для версии .NET 2.0. Google для mdbgSample21.EXE.

...