Я бы не советовал, но вы сможете изменить IL-код, который проверяет наличие слабых ключей, используя Reflector и надстройку ReflexIL
редактирование:
Извините, мне потребовалось некоторое время, чтобы загрузить все это на мою виртуальную машину (под управлением Ubuntu), и я не хотел связываться с Mono.
- Установка надстройки ReflexIL: Просмотр -> Надстройки -> Добавить
- Открыть ReflexIL: Инструменты -> ReflexIL v0.9
- Найдите функцию IsWeakKey (). (Вы можете использовать Поиск: F3)
- Появятся две функции, дважды щелкните ту, которая найдена в System.Security.Cryptography.TripleDES
- ReflexIL тоже должен был появиться. На вкладке «Инструкции» выполните прокрутку до строки 29 (смещение 63).
- Измените ldc.i4.1 на ldc.i4.0, это означает, что функция всегда будет возвращать false.
На панели сборок (слева) теперь можно прокрутить вверх и щелкнуть «Common Language Runtime Library», панель ReflexIL даст вам возможность сохранить ее.
Важные примечания:
- Сначала создайте резервную копию вашей оригинальной сборки! (Mscorlib.dll)
- mscorlib.dll является подписанной сборкой, и вам потребуется .NET SDK (инструмент sn.exe) для ReflexIL, чтобы пропустить проверку. Я только что проверил это сам, у вас уже должно быть это с установленным Visual C #. Просто нажмите «Зарегистрировать для пропуска проверки (на этом компьютере)», когда вас попросят.
- Не думаю, что я должен говорить вам использовать это только на вашей машине разработки:)
Удачи! Если вам нужны дополнительные инструкции, пожалуйста, не стесняйтесь использовать поле для комментариев.
edit2:
Я в замешательстве!
http://i44.tinypic.com/2r6fwbo_th.png
Я полностью удалил проверку IsWeakKey из функции set_Key в сборке mscorlib. Я абсолютно уверен, что я изменил правильную функцию, и что я сделал это правильно. Дизассемблер рефлектора больше не показывает чек. Самое смешное, что Visual C # по-прежнему вызывает то же исключение.
Это наводит меня на мысль, что mscorlib каким-то образом все еще нужно где-то кэшировать. Однако переименование mscorlib.dll в mscorlib.dll_ приводит к сбою MSVC #, поэтому он все равно должен зависеть от исходного dll.
Это довольно интересный материал, но я думаю, что дошел до того, что я понятия не имею, что происходит, просто это не имеет никакого смысла! Смотрите прикрепленное изображение. : (
Edit3:
Я замечаю в Олли, что в отличие от таких сборок, как mscoree, mscorsec и mscorwks; mscorlib.dll фактически не находится в:
C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \
Но вместо этого в том, что кажется несуществующим местоположением:
C: \ WINDOWS \ сборка \ NativeImages_v2.0.50727_32 \ mscorlib \ 6d667f19d687361886990f3ca0f49816 \ mscorlib.ni.dll
Я думаю, что я что-то здесь упускаю :) Исследую это еще немного.
edit4:
Даже после того, как я пропатчил ВСЕ в IsWeakKey и поиграл с удалением и генерацией новых собственных образов (x. ni .dll) mscorlib.dll с помощью «ngen.exe», я получаю такое же исключение. Я должен отметить, что даже после удаления собственных образов mscorlib он все еще использует файл mscorlib.ni.dll ... Meh.
Я сдаюсь. Я надеюсь, что кто-то сможет ответить, что, черт возьми, происходит, потому что я точно не знаю. :)