2015-07-18 2 views
14

Во-первых, я отдаю себе отчет в 1. Is it possible to export a dll definition from my AppDomain? 2. Is it possible to save a dynamic assembly to disk? 3. How can I extract DLL file from memory dump?Можно ли экспортировать/выгрузить DLL из памяти процесса в файл?

, но ни один из них не кажется, ответить на мой вопрос, в частности.

Рассмотрите следующую ситуацию: приложение C# загружает DLL из потока памяти (поэтому DLL не подвергается прямому воздействию пользователя). Есть ли инструмент, который явно позволяет выгружать или экспортировать эту конкретную DLL из памяти на диск в ее первоначальной форме?

Примечание: Мне бы хотелось, чтобы кто-нибудь показал мне пошаговую процедуру извлечения неповрежденной DLL из дампа памяти приложения C#.

+0

Какой формат у вас есть при загрузке dll? у вас все еще есть ссылка на объект «Сборка» или байт []? –

+0

Попробуйте использовать MyAssembly.Location ... это дает вам путь к файлу, с которым вы могли бы читать. Я знаю, что это MemoryStream, но они могут создать временный файл внутри. –

+0

@ PhilippeParé Путь к сборке никогда не будет доступен для пользователя. Мне интересно узнать точный способ извлечения загруженных DLL-файлов из распределенной памяти процесса или из дампа памяти. – IneedHelp

ответ

9

WinDbg с управляемыми расширениями отладки способен на этот трюк. Сначала загрузите WinDbg (google microsoft debugging tools for windows, они не являются автономной загрузкой, а частью других комплектов).

Следующая часть устанавливает расширение psscor2 (от https://www.microsoft.com/en-us/download/details.aspx?id=1073) и извлекает его в папку, где находится WinDbg.

Далее запустите свою программу и подключите к ней WinDbg (ее в меню). Введите следующие команды:

  1. .load psscor2
  2. !SaveAllModules c:\modules\

Найдите модуль, который вы хотите и наслаждаться.

+0

Я протестировал решение на случайном приложении .NET на своем компьютере, и результаты были такими, какие я ожидал. Однако это приложение, вероятно, не использовало 'Assembly.Load (byte [])', но я не думаю, что это должно быть проблемой. Интересуются ли сборки, по крайней мере, перечисленные с помощью команды '! DumpDomain'? – rkapl

+0

Я пробовал, и я получаю эту ошибку: 0: 021>! DumpDomain Не удалось найти runtime DLL (mscorwks.dll), 0x80004005 Для команд расширения требуется mscorwks.dll, чтобы иметь что-то делать. – IneedHelp

+0

Ну, '! DumpDomain' работает для меня. Попробуйте запустить '.loadby sos mscorwks' перед'! DumpDomain'. – rkapl