Получение правильного стека вызовов

Тема в разделе "WASM.NT.KERNEL", создана пользователем ntcdm, 12 авг 2010.

  1. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    пытаюсь отловить, кто вызывает функцию NtAlpcConnectPort

    использую такой вот бряк в WinDBG (может кому пригодиться )

    Код (Text):
    1. bp nt!NtAlpcConnectPort ".block {as /msu MyAlias poi(@esp+(2*$ptrsize))}; .block {.if ( $spat( \"${MyAlias}\", \"*ApiPort*\" ) ) { .echo \"${MyAlias}\"; ad *; } .else { ad *; g;}};"
    Но при срабатывании бряка не могу получить корректный стек вызовов
    Код (Text):
    1. kd> k
    2. ChildEBP RetAddr  
    3. a892ed34 774164f3 nt!NtAlpcConnectPort
    4. a892ed38 badb0d00 ntdll!KiFastSystemCall+0x3
    5. WARNING: Frame IP not in any known module. Following frames may be wrong.
    6. a892ed3c 0032f76c 0xbadb0d00
    7. a892ed40 00000000 0x32f76c
    В чем может быть проблема?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ntcdm
    Стековый фрейм является частью трап-фрейма и расположен в его начале, таким образом, дабы бактрейс выполнялся обычным способом, реализуется принудительной загрузкой значения регистра Ebp из состояния задачи. Значение(magic) 0xBADB0D00 это маркер трап-фрейма и находится в нём по смещению +8, после него следует ссылка на параметры сервиса в пользовательском стеке. При входе в сервис регистр Ebp будет адресавать не стековый фрейм, а трап фрейм(менеджер сервисов выполняющий трап-процессинг не формирует свои стековые фреймы, это линейный код), в котором адрес возврата будет KiFastSystemCallRet, а ссылка на следующий фрейм принадлежать диапазону пользовательского стека. Адрес возврата в стаб будет лежать на дне пользовательского стека.
    -
    У вас в логе отображены бессмысленные данные, тоесть в первом фрейме, том который трап-фрейм адрес возврата пользовательский, стек ядерный(как ?), во втором фрейме вместо адреса возврата прочитан маркер трап-фрейма(следующее поле) и снова ядерный стек. Выполните бактрейс вручную.
     
  3. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Нашел воркараунд. поставил бряк на функцию в юзермоде. там стек вызовов уже человеческий