Assembly.LoadFrom — использование перегрузки Evidence для проверки подписи строгого имени.

StackOverflow https://stackoverflow.com/questions/809934

  •  03-07-2019
  •  | 
  •  

Вопрос

Можно ли использовать перегрузку Assembly.LoadFrom с параметром Evidence, чтобы гарантировать строгое имя сборки?Я хочу иметь возможность указать имя сборки, культуру, версию и токен открытого ключа.Если какая-либо информация не соответствует, сборка не сможет загрузиться.

Это было полезно?

Решение 3

Я нашел другой способ сделать это.

var assemblyName = new AssemblyName(<fully qualified type name>);
assemblyName.CodeBase = <path to assembly>

Assembly.Load(assemblyName);

Другие советы

Вы можете получить открытый ключ сборки после ее загрузки — если она загружается успешно и имеет открытый ключ, то она имеет строгое имя:

Assembly assembly = Assembly.LoadFrom (...);
byte[] pk = assembly.GetName().GetPublicKey();

А еще лучше проверьте открытый ключ сборки и информацию о версии. до загружаю его:

AssemblyName an = AssemblyName.GetAssemblyName ("myfile.exe");
byte[] publicKey = an.GetPublicKey();
CultureInfo culture = an.CultureInfo;
Version version = an.Version;

Если GetPublicKey() возвращает значение, отличное от NULL, а затем сборка успешно загружается, значит, она имеет допустимое строгое имя.

У меня есть способ обойти проверку строгого имени для исправления System.Windows.Forms.dll.Если я им воспользуюсь, вы ничего не сможете с этим поделать.Мой трюк требует полного доверия.

Что я сделал, так это пропатчил dll, развернул исправленную dll, ngen ее и исправил загрузчик, чтобы получить исправленный образ ngen вместо оригинала.Что я мог сделать, так это уничтожить стандартную dll-библиотеку ngened.(Я действительно протестировал этот путь и решил, что возможность взлома чужого программного обеспечения — плохой выбор.)

Я не говорю, что это хорошая идея.Я говорю, что зависеть от проверки подписей от Assembly.Load — плохая идея.

Попробуйте System.ReflectionAssemblyNameFlags перечисление:

bool f_public_key = ((asm.GetName().Flags & AssemblyNameFlags.PublicKey) != 0);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top