Можем ли мы разобрать (используя ILDasm) сборку NGen-ed?
Если я собираю сборку, нормально ли, что ildasm все равно ее разбирает?
Хорошо. Я написал библиотеку классов HelloWorld, и следующая DLL-библиотека называется NGenILDasmTest.dll. -> Предназначен для.Net fw 4.
Из командной строки Vs 2010 я сделал
gacutil -i NGenILDasmTest.dll
Я мог видеть сборку, установленную в GAC. И я побежал ildasm, чтобы я мог посмотреть IL. Все идет нормально.
Тогда я бегу
ngen NGenILDasmTest.dll
(Я не указал никаких опций для ngen). И эта сборка успешно скомпилирована. Я нашел его с именем NGenILDasmTest.ni.dll в папке
C:\Windows\Assembly\NativeImages_v4.0.30319_32\NGenILDasmTest\81d49dd4c7df22fb3df530402b58ffc9
Теперь, когда я бегу ildasm, как показано ниже
ildasm "C:\Windows\Assembly\NativeImages_v4.0.30319_32\NGenILDasmTest\81d49dd4c7df22fb3df530402b58ffc9\NGenILDasmTest.ni.dll"
Я мог видеть содержимое сборки Ngen-ed. Это нормально?.
Technically speaking, Ngen generates native CPU instrcutions for the IL (and apparently places it under C:\windows\Assembly\NAtiveImages_V4.#####_32 - in my case). If that is the case, how am I still able to see the NGen-ed assembly as IL using ILDasm?
Please help me understand that 'little something' that I am missing here.
2 ответа
Сборка NGEN - это собственный код IL plus. Ил не раздетый. Часто возникает путаница, что сборки NGen содержат только нативный образ. Исходная информация все еще необходима для метаданных.
У Microsoft, похоже, нет очень конкретной информации о внутренностях сборки NGen. Большая часть информации, которую мы знаем, из реинжиниринга.
РЕДАКТИРОВАТЬ:
После установки.NET Framework 1.1 (да..) - кажется, что.NET 1.1 NGen действительно удаляет IL. Похоже, начиная с v2 - IL сохраняется. Похоже, именно поэтому существует противоречивая информация. Точная причина, по которой это изменение было сделано, кажется неизвестной.
Здесь есть хорошая статья о некоторых внутренностях ngen (и как это крайне плохая идея для запутывания) здесь: http://www.woodmann.com/forum/entry.php?68-Rebuilding-native-.NET-exes-into-managed-.NET-exes-by-Exploiting-lefotver-IL...
Теперь, что интересно в Ngen, это то, что он не устраняет IL или метаданные, потому что, хотя код IL не требуется для выполнения, метаданные есть, потому что все строки и другие соответствующие данные, которые нужны программе, содержатся в метаданные. Таким образом, Ngen копирует все метаданные в раздел.IL собственного исполняемого файла и копирует код IL как запоздалую мысль.
Если вы посмотрите на быстрое / простое запутывание, напишите сборку смешанного режима на C++, которая будет загрузчиком вашей собственной сборки (она загрузит устаревшие.NET FW 4.0 через COM в нативный код и будет использовать открытые интерфейсы, объявленные из управляемого часть, через.tlb, созданную для вашей управляемой сборки), которая хранится как зашифрованный ресурс (с использованием RSA), и зашифровывает собственный код C++, а затем подписывает обе сборки. Это предотвратит ILDASM в вашей сборке, позволяя вам отлаживать и собирать проект (используя события сборки)