Сейчас на форуме: (+7 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Определить функцию потока |
Посл.ответ | Сообщение |
|
Создано: 19 мая 2014 20:56 · Личное сообщение · #1 При старте до выхода на ОЕР в программе кроме основного запускаются и другие потоки. Те, которые запускаются через CreateThread, я благополучно нейтрализую. Но есть поток, обозначенный в окне "Т" OllyDbg как 7С810856, который не выдаёт о себе информацию. Точка 7С810856 находится не далеко от 7С81082F - начала CreateThread. На 7С810856 панель стека и окно "К" приходят чистыми. Может кто подскажет как найти функцию ThreadFunction для такого потока. Заранее спасибо! ![]() |
|
Создано: 19 мая 2014 21:03 · Личное сообщение · #2 |
|
Создано: 20 мая 2014 01:04 · Поправил: DenCoder · Личное сообщение · #3 |
|
Создано: 20 мая 2014 02:49 · Поправил: Dr0p · Личное сообщение · #4 DenCoder Что там трейсить.. ладно если не stdcall. А на x86 есть цепочка SFC. Тупо ентер жмём на стек в олли и все дела. Непосредственно загрузка юзер контекста происходит в NtContinue. Можно на этом остановиться и посмореть контекст. А гнилые методы, типо всяких нотифи - обычно бесполезно и я это даже никогда не рассматриваю и не юзаю. ![]() |
|
Создано: 20 мая 2014 17:10 · Личное сообщение · #5 Dr0p, DenCoder Спасибо за оперативный ответ! Я посмотрел что вы сказали. TLS callback программа, вроде, не использует. Установил ВР на этот АРС - диспетчер, зашёл в NtContinue(который у меня ZwContinue) и встал совсем, т.к. не знаю, где взять адрес структуры CONTEXT. А дальше, и как из неё выудить значение стека в момент запуска потока. ![]() |
|
Создано: 20 мая 2014 18:23 · Личное сообщение · #6 |
|
Создано: 21 мая 2014 17:50 · Личное сообщение · #7 Теперь и до NtContinue не удаётся дойти: Загружаю программу, ост. на System BP, устанавливаю BP KiUserApcDispatcher, жму F9, встаёт на начало этого диспетчера. В панели кода теперь указан хэндл потока "7С810856" и в окне "Т" добавился этот поток. Стек чистый, кроме одной строчки. На вершине стоит ntdll.LdrInitializeThunk. А первые две инструкции от начала диспетчера загружают этот инициализатор и программа виснет! ![]() |
|
Создано: 21 мая 2014 23:09 · Личное сообщение · #8 |
|
Создано: 22 мая 2014 12:52 · Личное сообщение · #9 Dr0p А сейчас доходит до NtContinue - через несколько запусков программа что-то меняет, а потом возвращается к прежнему. > В панели кода теперь указан хэндл потока "7С810856" Это глюки. Хэндл, конечно, другой - это я идентифицирую поток по адресу запускающей его функции. Dr0p , а вы не сможете сказать как найти адрес CONTEXT ,когда программа стоит на breakpoint'e на KiUserApcDispatcher? ![]() |
|
Создано: 22 мая 2014 18:45 · Личное сообщение · #10 ksol Я же дал прото, первый аргумент. На стеке внизу находится. Сразу ставьте символы для нэйтива, это если надо глубоко в нотифи лазить. Если просто отследить тред - то достаточно NtContinue, там в регистрах стартап адрес. Если отладчик лагает с каким то тредом, то возмоно он скрыт от отладчика, либо в жтом треде по како то причине не произошёл останов. Механизмы отладки в олли весьма примитивны. ![]() |
|
Создано: 23 мая 2014 12:02 · Личное сообщение · #11 |
|
Создано: 23 мая 2014 13:27 · Личное сообщение · #12 |
|
Создано: 23 мая 2014 18:28 · Личное сообщение · #13 Dr0p Спасибо! Я запустил в OllyDbg свою программу, она тоже с несколькими потоками. Задал тоже BP KiUserApcDispatcher. Получил тот же результат - такой же стек. В дампе смотрел начиная от 10017, не нашел ничего похожего на подходящие адреса, которые для своей программы мне известны. С этой структурой я столкнулся впервые, и скорее всего, я не так её смотрю. Поэтому вопросы по ней: расположение полей относительно её начала постоянно?, поле FloatSave какое имеет размер?, адрес возврата EIP=10017+B8? Зато в регистре EAX я вижу адрес ThreadFunction. ![]() |
|
Создано: 23 мая 2014 18:50 · Личное сообщение · #14 |
|
Создано: 23 мая 2014 18:51 · Личное сообщение · #15 |
|
Создано: 24 мая 2014 13:37 · Личное сообщение · #16 Да с полями структуры я разобрался. Взял в VS C++ адрес от полей типа context.Eip и нашел это смещение В8. Не могу найти её начало! Значение 10017 вряд ли подходит на эту роль: расположено оно на 5-й строчке, а в определении функции контекст идёт 1-м параметром. Собственно, на заголовок темы ответ уже найден - это регистр EAX. Может быть как-то удастся ещё узнать и место запуска потока!? ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Определить функцию потока |
Эта тема закрыта. Ответы больше не принимаются. |