![]() |
eXeL@B —› Основной форум —› Olly Debugger: трейсинг многопоточных приложений |
Посл.ответ | Сообщение |
|
Создано: 06 января 2006 17:17 · Личное сообщение · #1 Я вообще крякер начинающий. Вообще я программист, но асм знаю, и иногда отладчиками пользовался, чтобы изучать то, что мне компилятор нагенерил. Но сейчас вот пришлось поломать одну прогу. Аернее, исследовать просто. Меня крайне инетересует код, исполняемый в отдельном потоке. Я использую OllyDbg версии 1.10. //Суть проблемы: Когда я ставлю бряк на точку входа во вновь созданный поток (или просто в опциях ставлю Break on new thread created), дебагер прогу успешно останавливает на нужной бряке, но потом отлаживаемое приложение виснет, через 5 секунд выкатывается сообщение /*вольный перевод*/ "Олли вставил в каких-то своих целях небольшой кусок кода в отлаживаемое приложение, отлаживаемый процесс не отвечает в течение 5-ти секунд... Дальнейшая работа препарируемой программы может быть нестабильной, как можно скорее убейте ее" и там дальше два варианта. Подождать еще 5 секунд или продолжить. Собственно после того, как я отвечаю "нет", работа "жертвы" останавливается и на всякие там F7/F8/F9 не реагирует. Соответственно отттрейсить поток я не могу. Я пробовал активировать поток (ну для чего-то ведь нужна кнопочка Actualize в окне Threads!). Пробовал бряки на функциях, вызываемых из потока ставить. Результат один и тот же, и он описан выше. //Собственно, вопрос: Как можно (и можно ли вообще) трейсить работу не главного потока приложения с помощью средств OllyDbg? З.Ы. SoftIce не предлагать. ![]() |
|
Создано: 06 января 2006 17:26 · Личное сообщение · #2 ну по крайней мере в справке пишут, что можно: Особенность OllyDbg в том, что он позволяет просто и эффективно управлять потоками. Если Вы проходите по программе, трассируете её, выполняете till return (до возврата) или till selection (до выбранного), эти действия останавливают все потоки кроме основного, и возобновляют этот поток, даже если он был приостановлен. В этом случае, если Вы приостанавливаете или возобновляете потоки вручную, действия откладываются. Если Вы запускаете отлаживаемое приложение, OllyDbg восстанавливает первоначальные состояния потоков. (Заметьте, что с точки зрения Отладчика, hit trace (пошаговая трассировка), эквивалентна свободному выполнению). может это какие-то ухищрения авторов программы? я бы набросал свой каркас приложения, создающего потоки и понаблюдал как оно отлаживается в ольке ![]() |
|
Создано: 06 января 2006 17:36 · Личное сообщение · #3 Честно говоря, я почитал справку, и то что ты здесь написал. Однако как конкретно брякнуть неосновной поток, там не написано... А насчет каркаса приложения, я так и сделал. Я соорудил простейший счетчик с программируемой задержкой и грубо синхронизировал его через PostMessage. Собственно во время работы дебаггера удается протрейсить только конструктор (там точка входа в программу) самого приложения (поток, кстати, именно там порождается, сразу с флагом CreateSuspended=false, т.е. его выполнение начинается сразу после создания, вернее, разумеется, проверки условия CreateSuspended). После того, как конструктор заканчивается, главный поток оставнавливается. При этом дебаггер явно как-то сам отсележивает исполняющийся дополнительный поток, в котором стоит счетчик, сам дебаггер отнимает ~50% процессороного времени. Стало быть, поток дебаггеру подвластен. Но при попытке брякнуть этот поток происходит то, что я описал в предидущем посте. ![]() |
|
Создано: 06 января 2006 18:05 · Личное сообщение · #4 |
|
Создано: 06 января 2006 19:35 · Личное сообщение · #5 |
|
Создано: 06 января 2006 21:55 · Личное сообщение · #6 |
|
Создано: 07 января 2006 14:33 · Личное сообщение · #7 Я кажись понял, что вы имели ввиду, когда сказали, что рекомендуется откючать. Это "Allow code injection..."? Тогда непойдет. Я пробовал - результат тот же. Олька всё равно впихивает свой код в программу. Я весь хелп переворошил и ничего не нашел. Может эту инъекцию вызывает еще какая-нибудь опция по умолчанию? Я скопировал все настройки из статьи "Olly от А доЯ" - код внедряться прекратил, однако теперь он при входе в поток выполняет несколько команд, потом выполняет выхов подпрограммы и останавливается (paused) вернуть его из этого состояния невозможно. Может кто знает лекарство от этого? ![]() |
|
Создано: 08 января 2006 00:39 · Личное сообщение · #8 |
|
Создано: 11 мая 2006 20:13 · Личное сообщение · #9 Monster пишет: при входе в поток выполняет несколько команд, потом выполняет выхов подпрограммы и останавливается (paused) вернуть его из этого состояния невозможно. Может кто знает лекарство от этого? Точно так же доходит до call dword ptr ds:[<&ntdll.CsrNewThread>>; ntdll.CsrNewThread потом на следеющем Call останавливаеться.С этим еще никто не разобрался? ![]() |
|
Создано: 11 мая 2006 20:40 · Личное сообщение · #10 Monster пишет: Я вообще крякер начинающий. правильно выбранный ник - половина успеха, ты на верном пути ;) Monster пишет: Когда я ставлю бряк на точку входа во вновь созданный поток (или просто в опциях ставлю Break on new thread created), дебагер прогу успешно останавливает на нужной бряке, но потом отлаживаемое приложение виснет, через 5 секунд выкатывается сообщение ты это под win 9x проделываешь, угадал? ![]() |
|
Создано: 11 мая 2006 20:45 · Личное сообщение · #11 |
|
Создано: 11 мая 2006 21:36 · Личное сообщение · #12 |
|
Создано: 03 ноября 2006 05:48 · Личное сообщение · #13 |
|
Создано: 03 ноября 2006 08:00 · Личное сообщение · #14 |
|
Создано: 03 ноября 2006 10:42 · Личное сообщение · #15 timon пишет: Ну что кто нить разобрался с трейсингом многопоточных приложений в Олли???Времени то много прошло,мож кто понял. Поставь бряк на CreateThread, когда остановится, подсмотри значение lpStartAddress в стэке, ну и поставь бряк на этот адрес. HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); ![]() |
![]() |
eXeL@B —› Основной форум —› Olly Debugger: трейсинг многопоточных приложений |