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

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


person user38309    schedule 01.05.2009    source источник


Ответы (4)


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

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 () возвращает ненулевое значение, а затем сборка успешно загружается, у нее есть допустимое строгое имя.

person Joe Albahari    schedule 01.05.2009

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

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

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

person Joshua    schedule 01.05.2009
comment
Возможно, вы задерживаете подписание? В таком случае это будет работать только на машинах, на которых вы отключили проверку строгого имени (sn -Vr) для этой сборки. А иначе что ты делаешь? Произошла ли утечка закрытого ключа для сборок .NET framework? - person Joe Albahari; 01.05.2009
comment
Ключ не просочился. Загрузчик предполагает, что полученный файл является именно тем файлом, который он запросил. - person Joshua; 01.05.2009
comment
@Joshua, может, ты объяснишь более подробно, как работает твой трюк в образовательных целях. ? - person Gerrie Pretorius; 07.03.2018
comment
@GerriePretorius: Готово. - person Joshua; 07.03.2018

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

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

Assembly.Load(assemblyName);
person user38309    schedule 01.05.2009

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

bool f_public_key = ((asm.GetName().Flags & AssemblyNameFlags.PublicKey) != 0);
person Glenn Slayden    schedule 15.12.2018