Blog. Just Blog

Запись мини-дампа процесса на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Дампы или мини-дампы создаются обычно в случае аварийного падения процесса или системы. С помощью специальных программ по дампам можно восстановить примерное окружение, на котором произошел сбой, проанализировать его и установить процесс или код, который привел к критическому сбою.

Для создания дампов памяти есть официально документированная функция MiniDumpWriteDump из динамической библиотеки dbghelp.dll. C ее помощью можно точно настроить, какие данные должны попасть в создаваемый дамп. Вызывается она примерно так (вариант для текущего процесса):
  1.         ; Создать файл для записи дампа
  2.         invoke  CreateFile,fname,GENERIC_WRITE,\
  3.                 FILE_SHARE_WRITE,0,CREATE_NEW,\
  4.                 FILE_ATTRIBUTE_ARCHIVE,0
  5.         mov     [desc],eax
  6.  
  7.         ; Получить ID текущего процесса
  8.         invoke  GetCurrentProcessId
  9.         mov     ebx,eax
  10.  
  11.         invoke  GetCurrentProcess
  12.  
  13.         MiniDumpNormal = 0x00000000
  14.  
  15.         ; Сделать дамп
  16.         invoke  MiniDumpWriteDump,eax,ebx,[desc],MiniDumpNormal,0,0,0
  17.  
  18.         ; Закрыть файл
  19.         invoke  CloseHandle,[desc]
Некоторое время назад исследователи безопасности обнаружили, что над этой функцией имеется обертка - недокументированная функция MiniDumpW из динамической библиотеки comsvcs.dll. Вся прелесть заключается в том, что ее элементарно использовать даже из командной строки с использованием только штатных утилит. Что-то типа

rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump <PID> dump.dmp full
До некоторых пор таким способом можно было сохранить дамп процесса lsass.exe и затем при помощи какого-нибудь инструмента типа Mimikatz вытащить из него пароли учетных записей пользователей компьютера.

Но у нас тут не командная строка, а Ассемблер, да и малварой я не занимаюсь. Для вызова функции MiniDumpW требуется подготовить ей строку с параметрами. Она состоит из числового идентификатора процесса, с которого надо снять дамп, имени файла для записи дампа и типа создаваемого дампа - полный или мини.
  1. buff    rw MAX_PATH
  2. ; Маска для полного дампа
  3. mask1   du '%u my_dump_full.dmp full',0
  4. ; Маска для мини-дампа
  5. mask2   du '%u my_dump_mini.dmp ',0
При формировании строки параметров есть несколько тонкостей. Пришлось посидеть в отладчике, чтобы их выяснить. Итак, в строке обязательно должно быть три параметра, все они разделяются строго одним пробелом. В имени файла дампа пробелов быть не может. Если это неприемлемо, то придется использовать функцию MiniDumpWriteDump или в некоторых случаях можно воспользоваться переменными окружения. Последний параметр может быть или "full" для полного дампа или любое другое значение для мини-дампа, регистр имеет значение, если используется пустое значение, то пробел перед ним все равно должен быть. В остальном код создания дампов простейший:
  1.         ; Получить ID текущего процесса
  2.         invoke  GetCurrentProcessId
  3.         mov     ebx,eax
  4.  
  5.         ; Сформировать командную строку для полного дампа
  6.         invoke  wsprintf,buff,mask1,ebx
  7.         add     esp,12
  8.  
  9.         ; Сделать дамп
  10.         invoke  MiniDump,0,0,buff
  11.  
  12.         ; Сформировать командную строку для мини-дампа
  13.         invoke  wsprintf,buff,mask2,ebx
  14.         add     esp,12
  15.  
  16.         ; Сделать дамп
  17.         invoke  MiniDump,0,0,buff
Также надо иметь в виду, что вне зависимости от выбранного метода, для создания мини-дампов других процессов скорее всего потребуется повысить привилегии своего процесса, добавив SeDebugPrivilege. А еще антивирусы детектируют подобные операции как потенциально опасные и могут их заблокировать, особенно в случае с системными процессами.

В приложении примеры программ с исходными текстами, которые после запуска записывают дамп своего процесса.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

MiniDump.Demo.zip (3,150 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 408 | Комментариев: 0

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.006 сек.) / Память: 4.5 Mb
Наверх