Сейчас на форуме: zombi-vadim, zds (+4 невидимых) |
eXeL@B —› Программирование —› Изменение DRх регистров в обработчике исключений х64 |
Посл.ответ | Сообщение |
|
Создано: 01 октября 2013 18:18 · Поправил: deniskore · Личное сообщение · #1 Пытаюсь выставить hardware breakpoint внутри SEH обработчика, через контекст (CONTEXT *ctx) который передается в обработчик, путем записи адреса в ctx->Dr0 и выставления соответствующих флагов в ctx->Dr7. В х86 это работает без проблем, в х64 значение Dr0 и Dr7 не модифицируется. Если изменять вне исключения dr0, dr7 через SetThreadContext, перед этим остановив thread, то модифицируется без проблем. Как правильно изменить drx внутри обработчика SEH в х64? |
|
Создано: 01 октября 2013 22:21 · Личное сообщение · #2 |
|
Создано: 02 октября 2013 13:26 · Поправил: deniskore · Личное сообщение · #3 натив, Code:
Студия остановится (SINGLE_STEP) на ExtValue=1 если Rip в Eip переименовать и скомпилировать под х86. |
|
Создано: 04 октября 2013 08:45 · Личное сообщение · #4 |
|
Создано: 04 октября 2013 14:38 · Личное сообщение · #5 |
|
Создано: 04 октября 2013 19:08 · Поправил: DenCoder · Личное сообщение · #6 Заинтересовался проблемой... Ответ должен быть в ntdll!KiUserExceptionDispatcher. Посмотрев код в WinDbg Code:
и сравнив его с аналогом на x86 Code:
видим первое отличие - на x64 ZwContinue заменена на RtlRestoreContext. В её внутренностях содержится такой код Code:
deniskore пишет: В х86 это работает без проблем, в х64 значение Dr0 и Dr7 не модифицируется. Бегло проглядывая код, не вдаваясь глубоко во все детали, можно заметить, что не при всех условиях модифицируются dr-регистры. Или мне это кажется? Связанная проблема - не могу для более удобного анализа локализовать x64-версию ntdll.dll. (Ида64 анализирует её как 32битную). Даже поиск файла с сигнатурой 4885C0740F488BCC4881C ничего не дал. Чудеса какие-то... P.S. Дайте Клерку ссылку на книженцию о правилах хорошего тона. Кол-во страниц - не меньше, чем в мануалах интела ----- IZ.RU |
|
Создано: 04 октября 2013 19:52 · Личное сообщение · #7 Ида анализирует как 32-битную, потому что нечего открывать 32-битным процессом файлы из х64 виндовой директории, срабатывает редирект на ФС. Скопируй либу в другое место, потом открывай. | Сообщение посчитали полезным: DenCoder |
|
Создано: 04 октября 2013 20:26 · Поправил: DenCoder · Личное сообщение · #8 Да, только со скопированной dll анализ x64-версии. Ответ тогда прост: ввиду Code:
и Code:
делается вывод, что не предусмотрена на x64-системах установка DR-регистров в обработчиках или же фильтрах через передаваемую структуру CONTEXT. (смещения DR-регистров: 0x48 .. 0x70) Если всё же нужно, то можно прямо в обработчике их установить Code:
----- IZ.RU |
|
Создано: 04 октября 2013 22:28 · Личное сообщение · #9 |
|
Создано: 04 октября 2013 23:02 · Поправил: DenCoder · Личное сообщение · #10 отт точно )) SetThreadContext() тогда Code:
----- IZ.RU |
|
Создано: 06 октября 2013 17:18 · Личное сообщение · #11 |
|
Создано: 07 октября 2013 16:59 · Поправил: DenCoder · Личное сообщение · #12 Должен сказать, что да - под Win32 не работает установка dr-регистров посредством ф-ции SetThreadContext перед выходом из обработчика, поскольку по завершению обработки ось забирает весь контекст в соответствии с флагами. И также бесполезно, находясь ещё в обработчике, устанавливать контекст из другого потока. Но! Рассмотренная особенность x64, по крайней мере на Windows XP, позволяет установить DR-регистры методом в посте выше. Установил x64 tools, настроил отладку x64. Код: Code:
Работает и для SETDR_METHOD = 1 и для SETDR_METHOD = 2. То есть GetThreadContext() после исключения получает в обоих случаях то, что мы хотели установить. Вопрос только отладчика - будет ли он реагировать на исключения отладки, которые не были установлены в его среде? ) Будет! У меня просто сначала была ошибка - устанавливал DWORD вместо UINT64 ) ----- IZ.RU |
|
Создано: 07 октября 2013 18:06 · Личное сообщение · #13 Вся эта махинация с установкой контекста работающего потока андок, посему я бы не рассчитывал, что оно везде будет нормально работать. | Сообщение посчитали полезным: ajax |
|
Создано: 08 октября 2013 02:22 · Личное сообщение · #14 |
eXeL@B —› Программирование —› Изменение DRх регистров в обработчике исключений х64 |