Возможный? Изменить загруженную C # DLL? - PullRequest
1 голос
/ 13 июля 2011

Мне было просто интересно, возможно ли это, прежде чем я начну работать над этим.Я могу внедрить и запустить код C # в работающий процесс, а также перечислить все загруженные модули .NET.Отдельно я могу отредактировать инструкции .NET DLL, чтобы добавить вызовы моих методов.Очевидно, что я не могу редактировать библиотеку DLL, пока она загружена, но когда я пытаюсь это сделать, системное сообщение говорит мне, что я не могу редактировать ее, потому что она загружена в другой процесс.Это заставило меня поверить, что если я нахожусь в процессе того же (например, из-за моего кода инъекции), я могу редактировать загруженную DLL.Я подозреваю, что это неправильно.

Если нет, как вы думаете, возможно ли выгрузить целевую DLL, отредактировать ее и перезагрузить целевую DLL?Будет ли система переназначать все свои значения правильно (поскольку новая DLL будет больше на несколько инструкций)?У меня есть ощущение, что если есть возможность выгрузить DLL, отредактировать ее и перезагрузить в процесс, об остальной части должна позаботиться ОС.

Спасибо за понимание и обратную связь.

Ответы [ 4 ]

2 голосов
/ 13 июля 2011

да, это возможно.

«Замените любой метод .NET своим собственным делегатом!»

См. http://research.microsoft.com/en-us/projects/moles/

вот видео: http://channel9.msdn.com/blogs/peli/moles-replace-any-net-method-with-a-delegate

Этов категории «Внедрение кода».Довольно интересные вещи.

Это технически перезаписывает MSIL?Точно сказать не могу.Однако эта техника даст вам тот же конечный результат.Это то, что нас волнует, верно?

1 голос
/ 13 июля 2011

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

Вы также можете написать свой собственный .Net host + JIT; но тогда я сомневаюсь, что вы бы убедили кого-либо запустить его сознательно .

Вы, конечно, не сможете изменить IL загруженной сборки, потому что .Net защищает ее после загрузки. Я предполагаю, что возможно какое-нибудь грязное (с акцентом на неприятное там) низкоуровневое приложение, которое полностью обходит .Net может быть способным взломать IL в памяти; но я сомневаюсь, что представление в памяти при загрузке для выполнения такое же, как и на диске; и даже если к тому времени, когда вы «взломали», это, вероятно, все равно было JITted, и поэтому любые ваши изменения не будут иметь никакого значения.

В конечном итоге .Net специально разработан для предотвращения того, о чем вы говорите. Вы можете прикрепить (статические) динамические методы к существующим типам и т. Д., Чтобы получить выгоду от видимости (если у вас есть разрешение), но изменяете загруженный код? Нет.

Как уже упоминалось в нескольких других ответах, вы обычно делаете это с помощью сборки на диске, и для этого существует множество инструментов.

Но тогда что вы собираетесь делать со сборками со строгим именем? Вы должны быть в состоянии оставить их с тем же ключом строгого имени, который использовался первоначально; и почему-то я сомневаюсь, что у тебя будет к этому доступ.

1 голос
/ 13 июля 2011

Как только DLL-библиотека .Net загружается в процесс с помощью CLR, единственный способ удалить ее - выгрузить все экземпляры AppDomain, которые используют DLL.Поэтому я думаю, что можно было бы отредактировать загруженную DLL, выполнив следующие действия:

  1. . Выгрузите все AppDomain экземпляры, содержащие DLL, таким образом, сняв блокировку DLL
  2. Редактирование DLLна диск или просто поместите измененную DLL в другое место
  3. Создайте новый AppDomain и загрузите измененную DLL
0 голосов
/ 13 июля 2011

Я могу отредактировать инструкции .NET DLL, чтобы добавить свой метод вызовов.

Молодец! Я не знаю, как ты это делаешь.

Как вы думаете, возможно ли выгрузить целевую DLL, отредактировать ее, и перезагрузить целевую DLL?

Нет. Загруженная DLL не может быть выгружена или перезагружена. период.

EDIT

Мне напомнили, что DLL можно выгрузить, если вы выгружаете все AppDomain. Но я считаю, что это не то, что вы хотите сделать.

...