Получение кол-стека

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 2 фев 2008.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. Local Buffer[8]:PVOID, ThreadInformation:THREAD_BASIC_INFORMATION, ThreadHandle:HANDLE
    2.     invoke ZwQueryInformationThread, ThreadHandle, ThreadBasicInformation, addr ThreadInformation, SizeOf THREAD_BASIC_INFORMATION, NULL
    3.     invoke OpenProcess, PROCESS_VM_READ, FALSE, ThreadInformation.ClientId.UniqueThread
    4.     mov ProcessHandle,eax
    5.     add ThreadInformation.TebBaseAddress,TEB.Tib.StackBase
    6.     invoke ReadProcessMemory, ProcessHandle, ThreadInformation.TebBaseAddress, addr Buffer, 2*4, NULL
    7.     invoke CloseHandle, ThreadHandle
    Как на си записать - хз
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    А насчёт совместимости ты прав, но начало блока во всех версиях одинаково.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    QueryThreadStackInformation() - должно хватить..
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Clerk

    Что это за функция? Ее не нашел даже гугл...
     
  5. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    _DEN_

    Call stack прекрасно дампится безо всяких ассемблеров - через dbghelp
    Там есть куча хитростей и тонкостей, мсдн в этом месте особенно непонятен
    Вот мой продакшын-вариант, только "С", работает для 32 и 64 -битных кодов

    Вот когда стоит задача _БЕЗ_ dbghelp-а сдампить - тогда да, только асм
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    z0mailbox

    Спасибо за сорцы. Главный вопрос - у тебя происходит получение стека вызывающего потока. Это я и так умею делать. У тебя есть рабочий пример получения стека другого потока?
     
  7. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    этот код должен работать для другого треда, стоящего в юзермоде
    хитрость в том что остановить поток в юзермоде кроме как в ексепшыне непросто
    SuspendThread даст тебе текущий IP в ядре - и что дальше? стека не будет :dntknw:

    я делал ваще для другого процесса, но на асме, непереносимый, 32-битный
    и там я вручную иду вверх по esp-ebp, такая была постановка задачи
    этот я выкладывать понятно не буду, кому оно нужно - чужой асм
    но общий ход мыслей такой:
    1) enable_debug_privileges
    2) DebugActiveProcess
    3) WaitForDebugEvent - мы получаем ексепшын и IP будет юзермодовским
    ... EXCEPTION_DEBUG_EVENT ...
    4) OpenThread
    5) GetThreadContext
    6) RtlCreateQueryDebugBuffer - тут список модулей и (главное!) хипы (мне нужны были)
    7) RtlQueryProcessDebugInformation
    8) dump_stack (Read/WriteProcessMemory)
    9) RtlDestroyQueryDebugBuffer
    10) ContinueDebugEvent

    это работает
    попробуй так сделать и в dump_stack воткнуть предыдущий stackwalk
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    И это чтобы получить контекст или стек в UserMode !?
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Интересно было бы посмотреть как это делает Microsoft в Process Explorer.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ProcessExplorer суспендит поток с помощью NtSuspendThread и получает контекст GetThreadContext.
     
  11. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    _DEN_

    я смотрел - там ядерную часть стека раскручивает драйвер
    собственно как и предполагалось
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    n0name

    Кернеловский SuspendThread все что и делает, так это вызывает NtSuspendThread :-(


    z0mailbox

    Т.е. "по-человечески" раскрутить стек не-вызывающего потока чисто средствами Dbghelp API невозможно?
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    z0mailbox

    Посмотри личку.
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    z0mailbox

    Можно тут поподробнее? Как заставить отлаживаемый процесс вылететь с исключением из текущей позиции eip?
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    z0mailbox

    Смотри. Вот что я делаю.

    Включаю себе дебажные привелегии.

    DebugActiveProcess(process_id);

    DEBUG_EVENT de = {0};
    de.dwProcessId = process_id;
    de.dwThreadId = thread_id;
    de.dwDebugEventCode = EXCEPTION_DEBUG_EVENT; // Это надо заполнять?
    WaitForDebugEvent(&de, INFINITE);

    Первый раз я получаю CREATE_PROCESS_DEBUG_EVENT. Второй раз - CREATE_THREAD_DEBUG_EVENT. А в третий раз функция просто зависает. Как мне заставить его кинуть EXCEPTION_DEBUG_EVENT?

    [Добавлено]

    Можно конечно сделать WaitForDebugEvent(&de, INFINITE), а потом в паралельном потоке вызвать DebugBreakProcess(process_id), но ведь это совсем через ж...
     
  16. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Всем спасибо, тему можно закрывать.