Можно ли экспортировать/выгрузить DLL из памяти процесса в файл?

Во-первых, я знаю 1. Возможно ли экспортировать определение dll из моего AppDomain? 2. Можно ли сохранить динамическую сборку на диск? 3. Как извлечь DLL файл из дампа памяти?

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

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

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

Ответы

Ответ 1

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

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

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

  • .load psscor2
  • !SaveAllModules c:\modules\

Найдите нужный модуль и наслаждайтесь.