пытаюсь отловить, кто вызывает функцию NtAlpcConnectPort использую такой вот бряк в WinDBG (может кому пригодиться ) Код (Text): bp nt!NtAlpcConnectPort ".block {as /msu MyAlias poi(@esp+(2*$ptrsize))}; .block {.if ( $spat( \"${MyAlias}\", \"*ApiPort*\" ) ) { .echo \"${MyAlias}\"; ad *; } .else { ad *; g;}};" Но при срабатывании бряка не могу получить корректный стек вызовов Код (Text): kd> k ChildEBP RetAddr a892ed34 774164f3 nt!NtAlpcConnectPort a892ed38 badb0d00 ntdll!KiFastSystemCall+0x3 WARNING: Frame IP not in any known module. Following frames may be wrong. a892ed3c 0032f76c 0xbadb0d00 a892ed40 00000000 0x32f76c В чем может быть проблема?
ntcdm Стековый фрейм является частью трап-фрейма и расположен в его начале, таким образом, дабы бактрейс выполнялся обычным способом, реализуется принудительной загрузкой значения регистра Ebp из состояния задачи. Значение(magic) 0xBADB0D00 это маркер трап-фрейма и находится в нём по смещению +8, после него следует ссылка на параметры сервиса в пользовательском стеке. При входе в сервис регистр Ebp будет адресавать не стековый фрейм, а трап фрейм(менеджер сервисов выполняющий трап-процессинг не формирует свои стековые фреймы, это линейный код), в котором адрес возврата будет KiFastSystemCallRet, а ссылка на следующий фрейм принадлежать диапазону пользовательского стека. Адрес возврата в стаб будет лежать на дне пользовательского стека. - У вас в логе отображены бессмысленные данные, тоесть в первом фрейме, том который трап-фрейм адрес возврата пользовательский, стек ядерный(как ?), во втором фрейме вместо адреса возврата прочитан маркер трап-фрейма(следующее поле) и снова ядерный стек. Выполните бактрейс вручную.