Код (Text): Local Buffer[8]:PVOID, ThreadInformation:THREAD_BASIC_INFORMATION, ThreadHandle:HANDLE invoke ZwQueryInformationThread, ThreadHandle, ThreadBasicInformation, addr ThreadInformation, SizeOf THREAD_BASIC_INFORMATION, NULL invoke OpenProcess, PROCESS_VM_READ, FALSE, ThreadInformation.ClientId.UniqueThread mov ProcessHandle,eax add ThreadInformation.TebBaseAddress,TEB.Tib.StackBase invoke ReadProcessMemory, ProcessHandle, ThreadInformation.TebBaseAddress, addr Buffer, 2*4, NULL invoke CloseHandle, ThreadHandle Как на си записать - хз
_DEN_ Call stack прекрасно дампится безо всяких ассемблеров - через dbghelp Там есть куча хитростей и тонкостей, мсдн в этом месте особенно непонятен Вот мой продакшын-вариант, только "С", работает для 32 и 64 -битных кодов Вот когда стоит задача _БЕЗ_ dbghelp-а сдампить - тогда да, только асм
z0mailbox Спасибо за сорцы. Главный вопрос - у тебя происходит получение стека вызывающего потока. Это я и так умею делать. У тебя есть рабочий пример получения стека другого потока?
этот код должен работать для другого треда, стоящего в юзермоде хитрость в том что остановить поток в юзермоде кроме как в ексепшыне непросто SuspendThread даст тебе текущий IP в ядре - и что дальше? стека не будет я делал ваще для другого процесса, но на асме, непереносимый, 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
n0name Кернеловский SuspendThread все что и делает, так это вызывает NtSuspendThread :-( z0mailbox Т.е. "по-человечески" раскрутить стек не-вызывающего потока чисто средствами Dbghelp API невозможно?
z0mailbox Можно тут поподробнее? Как заставить отлаживаемый процесс вылететь с исключением из текущей позиции eip?
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), но ведь это совсем через ж...