Re[2]: Физическая организация метаданных в исполняемых файла
От: Harley Финляндия 9rays.net
Дата: 09.09.03 16:48
Оценка:
Здравствуйте, AlexK, Вы писали:

AK>Здравствуйте, Павел Румянцев, Вы писали:


AK>Одного вот только не пойму — нахрен это надо знать???? свои фреймворки вроде никто писать не собираеться... а простому програмеру это обсолютно до фени, потому как на ни на что не влияет.


AK>Интересно — но безполезно!


Мне вот было интересно как интерпертируются те или иные таблицы, у меня есть своя интерпретация, в чем-то не совпадающая с этой интерпретацией.
Несколько имхо-дополнений —
1. В последнем Роторе содержатся комментарии кторые говорят что часть таблиц использоваться не будет.
2. Может быть я пропустил чего, но изначально для парсинга PE файла (в частности — таблиц метаданных)надо знать что за формат файла используется — tiny или fat.
3. Количество записей в таблице можно узнать вычислив по формату полей длину одной записи и поделив размер таблицы на нее, размер записи может также зависеть от формата tiny или fat.
Формат PE.Net файла вообще содержит в себе много всяких условностей, так как есть еще mixed images — содержащие managed и unmanaged код — его легко получить собрав managed С++ сборку не позаботившись о том чтобы она была 100% managed — unmanaged методы могут быть впихнуты компилятором через таблицы релокаций — об этом автор не упомянул,так как исследование mscorlib — это не все. Лучше всего исследовать 3 типа сборки — от VB.Net, C#, и managed C++ (для очистки совести можно еще и от компилятора Borland C#Builder привести). Наиболее соответствовать ECMA будут первые два типа (и Borland-вский).
Конечно до кода добраться можно и сделать его дизассемблинг тоже легко, но вот даже здесь есть темные пятна, так как managed метод тоже можно "спрятать" через таблицу релокаций.
Одна статья конечно мало чего дает заинтересованному читателю, тут стоит посвятить этому вопросу цикл статей, так как ответ на вопрос "легко ли добраться до кода методов" уже давно дан тем же самым ILDASM.
И я бы назвал бы структуру метаданных, содержащихся в PE.Net реляционной базой данных, которую можно проверить утилитой PEVerify на "правильность", правда тут тоже есть обход — можно выставить SkipVerification атрибут для ублажения этой утилитки. Так что интересно было бы поставить вопрос — насколько совместимы собранные тем или иным компилятором сборки с положениями ECMA. У меня напрашивается только один ответ — C# compiler это может.
Кстати в Роторе представлены несколько подходов по парсингу PE, самый неструктурированный — это в ILDASM. Оба подхода достаточно трудны для изучения.
WBR,
Harley
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.