Как отладчики обходят Опции выполнения Файла Изображения при запуске их debugee? - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь поработать над внутренними компонентами Windows для общего назидания и пытаюсь понять механизм, лежащий в основе параметров исполнения файла изображения.В частности, я установил запись отладчика для calc.exe, с "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -NoExit -Command "& { start-process -filepath $args[0] -argumentlist $args[1..($args.Length - 1)] -nonewwindow -wait}" в качестве полезной нагрузки.Это приводит к рекурсии со многими запускаемыми экземплярами PowerShell, что имеет смысл, учитывая, что я перехватываю их вызовы на calc.exe.

. Однако возникает вопрос: как обычные отладчики запускают тестируемую программуне вызывая такого рода рекурсивного поведения?

1 Ответ

0 голосов
/ 23 февраля 2019

Неужели нет берущих?

В любом случае, это хороший вопрос о внутренностях Windows, но причина, по которой я сейчас заинтересован, заключается в том, что это стало для меня практическим вопросом.Где-то, где я делаю оплачиваемую работу, три компьютера, каждый с разной версией Windows и даже разными отладчиками, для которых использование этого трюка IFEO приводит к отладке самой отладки, по-видимому, в этой же цикличности, которая беспокоит OP.

Как отладчики обычно избегают этой цикличности?Ну, они сами этого не делают.Windows избегает этого для них.

Но давайте сначала посмотрим на округлость.Приготовления PowerShell почти никогда не помогают простым демонстрациям, а calc.exe уже не тот, что раньше.Вместо этого давайте установим значение «Отладчик» для notepad.exe в «c: \ windows \ system32 \ cmd.exe / k» (без кавычек).Windows интерпретирует это как означающее, что при попытке запустить notepad.exe вместо этого обычно следует запускать «c: \ windows \ system32 \ cmd.exe / k notepad.exe».CMD будет интерпретировать это как значение для запуска notepad.exe и зависания.Но это выполнение тоже notepad.exe будет превращено в "c: \ windows \ system32 \ cmd.exe / k notepad.exe" и так далее.Диспетчер задач скоро покажет вам сотни экземпляров cmd.exe.(Хорошая новость в том, что все они находятся на одной консоли и могут быть убиты вместе.)

Тогда вопрос OP заключается в том, почему CMD и его / k (или / c) переключаются для запуска дочернего процесса.циклический в значении отладчика, но WinDbg, например, нет.

В каком-то смысле ответ сводится к одному биту в недокументированной структуре PS_CREATE_INFO, которая обменивается между режимами пользователя и ядра для функции NtCreateUserProcess.Эта структура стала довольно известной в некоторых кругах, а не то, что они когда-либо говорят, как.Я думаю, что структура датируется Windows Vista, но она не известна из файлов открытых символов Microsoft до Windows 8 и даже не из ядра, а из таких вещей, как компонент Internet Explorer URLMON.DLL.

Так или иначе, в современной форме структуры PS_CREATE_INFO бит 0x04 со смещением 0x08 (32-битный) или 0x10 (64-бит) контролирует, проверяет ли ядро ​​значение отладчика.Файлы символов говорят нам, что этот бит известен Microsoft как IFEOSkipDebugger.Если этот бит сброшен и имеется значение отладчика, то NtCreateUserProcess завершается ошибкой.Другая обратная связь через структуру PS_CREATE_INFO говорит KERNELBASE, для его обработки CreateProcessInternalW, по-своему взглянуть на значение отладчика и снова вызвать NtCreateUserProcess, но (предположительно) для некоторого другого исполняемого файла и командной строки.

Когда вместо этого установлен бит, ядро ​​не заботится о значении отладчика, и NtCreateUserProcess может завершиться успешно.Как обычно устанавливается бит, устанавливает KERNELBASE, потому что вызывающая сторона просит не просто создать процесс, а конкретно просит быть отладчиком нового процесса, т. Е. Установила либо DEBUG_PROCESS, либо DEBUG_ONLY_THIS_PROCESS в флагах создания процесса.Вот что я имею в виду, говоря, что отладчики сами ничего не делают, чтобы избежать цикличности.Windows делает это для них только потому, что они хотят отладить исполняемый файл.

Один из способов рассматривать значение отладчика как вариант выполнения файла образа для исполняемого файла X состоит в том, что присутствие значения означает, что X не может выполняться, кроме как в отладчике, и его содержимое может сказать, как это сделать.Как давно заметили хакеры, и программисты ядра заметили это раньше, контенту не нужно указывать отладчик, и значение может быть адаптировано так, чтобы попытки запустить X вместо запуска Y. Менее заметным является то, что Y не сможетзапускать X, если Y не отлаживает X (или не отключает значение отладчика).Также менее заметным является то, что не все попытки запустить X вместо этого будут запускать Y: попытка отладчика запустить X в качестве отладчика не будет отклонена.

Хорошо, хватит этого.Теперь я должен написать PS_CREATE_INFO для моего сайта.

...