Как я могу извлечь файл DLL из дампа памяти?

У меня есть дамп памяти (неуправляемый процесс). Как я могу извлечь (используя windbg) одну из DLL, загруженных в процесс? Я имею в виду фактическое сохранение файла dll на диск


person Saar    schedule 29.10.2009    source источник


Ответы (3)


Вы можете использовать sos.dll внутри каталога Windbg.

Сначала загрузите sos.dll в windbg:

.load clr10\sos.dll

Затем используйте !sam ИЛИ !SaveAllModule для извлечения модулей в определенное место на диске:

!sam c:\notepad
person Steve    schedule 29.10.2009

Чтобы извлечь DLL без использования SOS, используйте расширение .writemem следующим образом:

  1. узнайте начальный и конечный адреса модуля, используя lmvm dllname
    пример вывода для ieframe:
    start end module name
    61370000 61fb8000 ieframe

  2. вычислить длину = конец-начало: ? 61fb8000 - 61370000
    вывод: Evaluate expression: 12877823 = 00c48000

  3. затем сохраните DLL следующим образом:
    .writemem C:\tmp\mydll.dll 61370000 L?00c48000

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

(Частично основано на эта статья)

person deemok    schedule 29.10.2009
comment
Я пробовал это, но это не сработало. Я подключил Windbg к Calc.exe, написал exe и получил файл большего размера. Странный. - person Saar; 31.10.2009
comment
Я предполагаю, что это связано с расхождениями в выравнивании - файлы pe32 занимают больше места в памяти, чем на диске из-за больших требований к выравниванию памяти. Вам необходимо правильно пересобрать исполняемый файл после его дампа, чтобы он соответствовал этим правилам. Кроме того, раздел отладки не сбрасывается (поскольку, я думаю, он не отображается). Таблицы импорта также нуждаются в реконструкции. - person deemok; 05.11.2009

Да, это правда. calc.exe также извлечет информацию о многопользовательском интерфейсе и прикрепит ее к памяти, как и многие программы Windows, такие как mspaint, photoviewer и т. д.

person Matt    schedule 11.11.2009