точка останова обнаружена точка останова что это такое гта 5
Точка останова обнаружена точка останова что это такое гта 5
На практике, точка останова определяется как одно или несколько условий, при которых происходит прерывание программы. Наиболее часто используется условие останова при переходе управления к указанной инструкции программы (instruction breakpoint). Другое условие останова — операция чтения, записи или изменения указанной ячейки или диапазона ячеек памяти (data breakpoint или watchpoint).
Многие процессоры имеют аппаратную поддержку точек останова (обычно, только для instruction breakpoint и watchpoint). При отсутствии такой аппаратной поддержки отладчики используют программные точки останова.
Прекращение работы файла GTA5.exe
это только для стим версии?
В директории Steamapps нет файла error.log. В способе использования командной строки, максимальное число процессоров можно поставить только 6. Что делать?
Отключит дискректную видюху и попробуй запустить. Мне помогло.
А когда игра запустится снова включи. Но так придётся делать каждый раз. Когда заходишь в игру.
Знакомство с WinDBG – Часть 2
В первой части мы получили базовое представление об отладчике WinDBG. Во второй части мы углубим свои знания, чтобы вы уже смогли начать отладку программ.
Автор: Брэд Антониевич (Brad Antoniewicz)
В первой части мы получили базовое представление об отладчике WinDBG. Во второй части мы углубим свои знания, чтобы вы уже смогли начать отладку программ.
Перечень всех статей, входящих в этот цикл:
Точки останова можно выставить как внутри приложения, так и внутри процессора (аппаратно). Рассмотрим оба этих способа:
Программные точки останова
Перед выполнением программа сначала загружается в память, что позволяет нам временно модифицировать участок памяти, связанный с программой, без влияния на процесс ее выполнения. Именно так и работают программные точки останова. Отладчик запоминает ассемблерную инструкцию, где должна быть вставлена точка останова, затем заменяет ее на ассемблерную инструкцию INT 3 (0xcc), которая заставляет процессор остановить выполнение программы. Как только точка останова достигнута, отладчик считывает текущий адрес памяти, достает ранее записанную инструкцию и показывает ее пользователю. Пользователю кажется, что программа остановился на этой инструкции, однако процессор не имеет ни малейшего представления о ее существовании.
В WinDBG программные точки останова устанавливаются при помощи команд bp, bm, или bu. Команда bp (Break Point), вероятно, наиболее часто используемая команда, при помощи которой устанавливаются точки останова. В самом простейшем случае достаточно указать один адрес, по которому должна быть установлена точка останова:
Адрес, передаваемый команде bp, должен быть участком памяти с исполняемым кодом. Поскольку команда bp работает с памятью, где хранятся данные, то в некоторых случаях могут возникнуть проблемы, так как отладчик перезаписывает информацию, которая находится в участке памяти. Во избежание проблем компания Microsoft рекомендует использовать команду ba (о ней мы поговорим дальше) в случае, если вы работаете с памятью, где хранятся данные.
Давайте рассмотрим, как устанавливать программные точки останова на примере приложения notepad.exe, которое мы будем запускать через WinDBG. По умолчанию, при запуске программы через WinDBG, отладчик устанавливает точку останова в самом начале программы. Для начала найдем адрес памяти, куда загрузился notepad.exe:
Рисунок 1: Нахождение адреса загрузки notepad.exe
Рисунок 2: Нахождение точки входа программы
Теперь устанавливаем точку останова в точку входа (адрес загрузки + 0x3689):
Рисунок 3: Установление точки останова
В большинстве случаев вы будете использовать программные точки останова, однако иногда вам понадобятся аппаратные точки останова (например, когда у памяти установлен атрибут «только чтение» или когда информация защищена и т. д.).
Аппаратные точки останова
Внутри большинства процессоров существуют специальные отладочные регистры, которые можно использовать для хранения адресов точек останова и специальных условий доступа, по которым срабатывают эти точки останова (например, на чтение, запись или выполнение). Точки останова, хранящиеся в таких регистрах, называются аппаратными (или процессорными) точками останова. Когда процессор доходит до адреса памяти, которые определен внутри отладочного регистра и выполняются условия доступа, программа останавливается.
В WinDBG аппаратные точки останова устанавливаются при помощи команды ba (Break on Access). Обычно в эту команду передается три аргумента:
0:001> ba e 1 00453689
При помощи этой команды, вероятно, можно было добиться того же самого, что и в примере с командой bp, но только не в случае с аппаратными точками останова (вскоре мы узнаем почему). Первый аргумент e – тип доступа к памяти (на выполнение), второй аргумент – размер (всегда 1 для этого типа доступа). Последний аргумент – адрес. Давайте рассмотрим установку аппаратной точки останова, учитывая то, что наши адреса загрузки различаются из-за ASLR.
Из-за способа, при помощи которого Windows сбрасывает контексты потока, и места, где появляется WinDBG после порождения процесса, мы не сможем установить точку останова тем же самым способом, как делали это в предыдущем примере. Ранее мы устанавливали точку останова во входной точке приложения, но если сделать так же и здесь, то возникнет ошибка:
0:000> lmf m notepad
start end module name
00e60000 00e90000 notepad notepad.exe
0:000> ba e 1 00e63689
^ Unable to set breakpoint error
The system resets thread contexts after the process
breakpoint so hardware breakpoints cannot be set.
Go to the executable’s entry point and set it then.
‘ba e 1 00e63689’
Для решения этой проблемы нам нужно использовать команду g, чтобы программа добралась до определенного адреса памяти. Когда мы устанавливали программную точку останова, то делали примерно то же самое, но не совсем. Таким образом, мы заставляем WinDBG дойти до начального контекста потока, что впоследствии позволит нам устанавливать аппаратные точки останова.
0:000> g 00e63689
ModLoad: 76be0000 76bff000 C:\Windows\system32\IMM32.DLL
ModLoad: 76c00000 76ccc000 C:\Windows\system32\MSCTF.dll
eax=77081162 ebx=7ffd7000 ecx=00000000 edx=00e63689 esi=00000000 edi=00000000
eip=00e63689 esp=0022fbb4 ebp=0022fbbc iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
notepad!WinMainCRTStartup:
00e63689 e8c5f9ffff call notepad!__security_init_cookie (00e63053)
Теперь мы можем установить аппаратную точку останова:
Рисунок 5: Установка корректной аппаратной точки останова
Чтобы убедиться в том, что точка останова хранится в регистре процессора, можно использовать команду r (подробнее о ней мы поговорим позже). Атрибут M нужен для использования маски регистра 0x20:
Рисунок 6: Просмотр отладочных регистров
Из Рисунка 6 видно, что что-то мы сделали не так, и во всех регистрах находятся нули! Такое произошло потому, что WinDBG еще ничего не занес ни в один из этих регистров. После того, как вы продвинетесь на один шаг вперед, используя команду p (подробнее об этом поговорим чуть позже), то в регистр dr0 установится адрес нашей точки останова:
Рисунок 7: При продвижении вперед на один шаг, в отладочный регистр устанавливается адрес аппаратной точки останова
Команды для работы с точками останова
Теперь, когда вы познакомились с базовой информацией о точках останова, мы рассмотрим некоторые команды для работы с ними, которые могут быть полезны во время отладки.
Просмотр точек останова
Для просмотра всех точек установленных точек останова используется команда bl (Breakpoint List).
0:000> bl
0 e 00523689 e 1 0001 (0001) 0:**** notepad!WinMainCRTStartup
Результат выполнения команды разделен на несколько колонок. Рассмотрим назначение каждой из них:
Удаление точек останова
Чтобы удалить точку останова, используйте команду bc:
В команду передается только один параметр – идентификатор точки останова (можно узнать, выполнив команду bl). По желанию можно указать символ *, чтобы удалить все точки останова.
Некоторые трюки при работе с точками останова
Существует несколько трюков, которыми я обычно пользуюсь при работе с точками останова. Ниже приводятся некоторые из них. Если вы также пользуетесь какими-либо трюками, расскажите о них в комментариях!
Самый простейший трюк при работе с точками останова – вычисление адреса памяти. Вместо того чтобы производить эти вычисления в голове, вы можете сделать это прямо в WinDBG. К примеру, в вышеупомянутых примерах мы знаем адрес загрузки notepad.exe и смещение входной точки программы (0x3689). Теперь мы можем вычислить адрес для установки точки останова:
0:000> lmf m notepad
start end module name
00770000 007a0000 notepad notepad.exe
0:000> bp 00770000 + 3689
0:000> bl
0 e 00773689 0001 (0001) 0:**** notepad!WinMainCRTStartup
Использование имен и смещений в качестве адресов
Символы (о которых мы говорили в первой части) особенно хороши тем, что дают нам информацию о местонахождении известных функций. Таким образом, мы можем использовать смещения к этим функциям в качестве адресов в точках останова. Для того чтобы выяснить смещение, используйте команду u. Команда u возьмет информацию по указанному адресу и отобразит ее в виде ассемблерных инструкций. Кроме того, команда u выводит смещение до ближайшего символа:
0:000> u 00770000 + 3689
notepad!WinMainCRTStartup:
00773689 e8c5f9ffff call notepad!__security_init_cookie (00773053)
0077368e 6a58 push 58h
Теперь мы знаем, что имя notepad!WinMainCRTStartup более красивый аналог адресу 00770000 + 3689. Поскольку в конце этого имени не стоит числового смещения, мы можем сделать вывод, что для этой функции существуют символы. Давайте проверим инструкцию, которая следует сразу за первой функцией:
0:000> u 0077368e
notepad!_initterm_e+0x61:
0077368e 6a58 push 58h
В этот раз мы получили имя функции notepad!_initterm_e плюс смещение (+0x61). Я точно не знаю, почему WinDBG добавляет смещение к notepad!_initterm_e вместо notepad!WinMainCRTStartup. Вероятно, влияет порядок сортировки во время поиска символов. Тем не менее, мы можем добавить смещение к notepad!WinMainCRTStartup, чтобы сослаться на ту же самую область памяти:
0:000> u notepad!WinMainCRTStartup+0x5
notepad!_initterm_e+0x61:
0077368e 6a58 push 58h
Вся фишка в том, что мы можем использовать это смещение во время установки точки останова, и эти смещения всегда корректны, даже когда работает ASLR. То есть нам не нужно высчитывать адреса при каждом запуске.
0:000> bp notepad!WinMainCRTStartup+0x5
0:000> bl
0 e 0077368e 0001 (0001) 0:**** notepad!_initterm_e+0x61
Прерывание загрузки модуля
На практике может возникнуть необходимость в установке точки останова во время загрузки модуля. К сожалению, не существует очевидного решения этой задачи в рамках использования стандартных команд (если вам знаком такой способ, поделитесь им в комментариях). Зато есть немного замысловатый путь, когда мы добавляем подобную точку останова, путем установки исключения при помощи команды sxe, возникающего во время загрузки модуля:
0:000> sxe ld IMM32.DLL
Выполняя эту команду, мы установили first chance исключение (sxe) во время загрузки модуля (ld) и определили конкретный модуль (IMM32.DLL), в котором возникает это исключение.
Мы можем увидеть все установленные исключения, используя команду sx (Set Exceptions). Если посмотреть на список под именем Load Module, то можно увидеть прерывание на модуле IMM32.DLL.
Рисунок 8: Прерывание на модуле IMM32.DLL
Убрать исключение можно при помощи команды sxi (Set Exception Ignore):
0:000> sxi ld IMM32.DLL
Выполнение команд при срабатывании точки останова
Может возникнуть такая ситуация, что при срабатывании точки останова будет необходимо выполнить определенные команды. К примеру, нужно узнать, что находится в стеке. В WinDBG весь процесс можно автоматизировать при помощи выполнения цепочки команд, привязанных к точке останова. В нашем примере мы будем выводить на экран информацию из стека при помощи команды dd (более подробно поговорим о ней позже). Также обратите внимание, как отображается наша команда при просмотре перечня точек останова:
0:000> bp notepad!WinMainCRTStartup «.echo \»Here are the values on the stack:\n\»; dd esp;»
0:000> bl
0 e 00ae3689 0001 (0001) 0:**** notepad!WinMainCRTStartup «.echo \»Here are the values on the stack:\n\»; dd esp;»
Теперь давайте посмотрим, что произойдет при срабатывании точки останова:
Рисунок 9: При срабатывании точки останова отображается информация из стека
Как и ожидалось, выполнилась команда, и отобразилась информация из стека. Только не забывайте экранировать кавычки, находящиеся внутри внешних кавычек. Вы даже можете добавить в такую цепочку команду g, чтобы после выполнения команд программа продолжила свою работу. Это позволит вам анализировать состояние программы во время ее работы, вместо того, чтобы каждый раз прерываться.
Оставайтесь на связи
В следующей статье мы рассмотрим инспектирование памяти и пошаговую отладку программы! Не переключайтесь!
Полный Точка останова достигнута Windows 10, 8.1, 7
По словам пользователей, иногда эта проблема может возникнуть, если ваша система заражена вредоносным ПО. Для решения проблемы рекомендуется выполнить полное сканирование системы и проверить, решает ли это вашу проблему. Имейте в виду, что полное сканирование системы может занять около часа, поэтому вам придется набраться терпения.
Чтобы решить эту проблему, рекомендуется найти и удалить сторонние заставки со своего ПК. Несколько пользователей сообщили, что причиной этой проблемы были заставки, но после их удаления проблема была решена.
Многие пользователи разгоняют свое оборудование для достижения лучшей производительности, но иногда разгон оборудования может привести к таким программным проблемам, как этот. После того, как вы удалите настройки разгона на вашей видеокарте, проверьте, сохраняется ли проблема.
В случае, если это не сработает, следующим шагом будет чистая загрузка. Как вы, возможно, знаете, многие приложения запускаются автоматически с Windows 10, и иногда эти приложения могут вызывать проблемы при запуске.
Чтобы точно определить причину проблемы, необходимо отключить все запускаемые приложения, выполнив следующие действия:
После перезагрузки компьютера проверьте, не устранена ли проблема. Если проблема не появляется, это означает, что проблема была вызвана одним из запускаемых приложений или служб. Чтобы найти причину, вам нужно включить службы и приложения в группах, пока вам не удастся воссоздать проблему.
Помните, что вам придется перезагружать компьютер каждый раз, когда вы включаете приложение или службу, чтобы применить изменения. Как только вы найдете проблемное приложение, удалите его или оставьте его отключенным, и проблема должна быть решена.
Решение 5. Удалите все недавно установленные приложения.
Решение 6. Убедитесь, что приложение, которое вы пытаетесь запустить, обновлено
Иногда Достигнута точка останова может появиться ошибка из-за поврежденной учетной записи пользователя. Ваша учетная запись может быть повреждена по разным причинам, и если это произойдет, вы можете столкнуться с различными проблемами. Чтобы решить эту проблему, рекомендуется создать новую учетную запись пользователя и проверить, появляется ли проблема и там. Чтобы создать новую учетную запись пользователя, выполните следующие действия:
Решение 8. Убедитесь, что ваша система обновлена
Windows 10 обычно устанавливает отсутствующие обновления автоматически, но вы всегда можете проверить наличие обновлений самостоятельно, выполнив следующие действия:
Теперь Windows проверит наличие доступных обновлений и установит их автоматически. После установки обновлений проверьте, не устранена ли проблема.
Чтобы выполнить восстановление системы, вам просто нужно сделать следующее:
После того, как вы восстановите свою систему, проверьте, сохраняется ли проблема.
Полный Точка останова достигнута Windows 10, 8.1, 7
Сообщение точка останова может иногда появляться на вашем ПК при попытке запустить определенное приложение или при попытке выключить компьютер. Это сообщение может быть довольно раздражающим, и в сегодняшней статье мы покажем вам, как это исправить.
Точка останова была достигнута сообщение об ошибке, как это исправить?
Решение 1 – Сканировать ваш компьютер на наличие вредоносных программ
По словам пользователей, иногда эта проблема может возникнуть, если ваша система заражена вредоносным ПО. Для решения проблемы рекомендуется выполнить полное сканирование системы и проверить, решает ли это вашу проблему. Имейте в виду, что полное сканирование системы может занять около часа, поэтому вам придется набраться терпения.
Решение 2 – Удалить сторонние заставки
Иногда Достигнута точка останова может появиться из-за сторонних заставок на вашем ПК. Похоже, что сторонние заставки могут как-то мешать работе Windows 10, и это приведет к появлению этого сообщения об ошибке.
Чтобы решить эту проблему, рекомендуется найти и удалить сторонние заставки со своего ПК. Несколько пользователей сообщили, что причиной этой проблемы были заставки, но после их удаления проблема была решена.
Решение 3 – Удалить настройки разгона
Многие пользователи разгоняют свое оборудование для достижения лучшей производительности, но иногда разгон оборудования может привести к таким программным проблемам, как этот. После того, как вы удалите настройки разгона на вашей видеокарте, проверьте, сохраняется ли проблема.
Решение 4 – Отключить проблемные приложения
В случае, если это не сработает, следующим шагом будет чистая загрузка. Как вы, возможно, знаете, многие приложения запускаются автоматически с Windows 10, и иногда эти приложения могут вызывать проблемы при запуске.
Чтобы точно определить причину проблемы, необходимо отключить все запускаемые приложения, выполнив следующие действия:
После перезагрузки компьютера проверьте, не устранена ли проблема. Если проблема не появляется, это означает, что проблема была вызвана одним из запускаемых приложений или служб. Чтобы найти причину, вам нужно включить службы и приложения в группах, пока вам не удастся воссоздать проблему.
Помните, что вам придется перезагружать компьютер каждый раз, когда вы включаете приложение или службу, чтобы применить изменения. Как только вы найдете проблемное приложение, удалите его или оставьте его отключенным, и проблема должна быть решена.
Решение 5. Удалите все недавно установленные приложения.
Если вы не знаете, программное обеспечение для удаления – это специальное приложение, которое может легко удалить любое программное обеспечение с вашего компьютера. Помимо удаления нужного приложения, программа удаления также удалит все файлы и записи реестра, связанные с приложением. Тем самым вы предотвратите появление этой проблемы в будущем.
Решение 6. Убедитесь, что приложение, которое вы пытаетесь запустить, обновлено
Если эта проблема возникает при попытке запустить определенное приложение, возможно, существует ошибка, которая вызывает эту ошибку. Чтобы это исправить, рекомендуется убедиться в актуальности приложения, которое вы пытаетесь запустить.
Если вы даже не можете запустить приложение для его обновления, рекомендуется переустановить его и проверить, решает ли это проблему. Обязательно скачайте и установите последнюю версию. После этого проверьте, не появилось ли сообщение об ошибке.
Решение 7 – Создать новую учетную запись пользователя
Иногда Достигнута точка останова может появиться ошибка из-за поврежденной учетной записи пользователя. Ваша учетная запись может быть повреждена по разным причинам, и если это произойдет, вы можете столкнуться с различными проблемами. Чтобы решить эту проблему, рекомендуется создать новую учетную запись пользователя и проверить, появляется ли проблема и там. Чтобы создать новую учетную запись пользователя, выполните следующие действия:
Как только вы создадите новую учетную запись пользователя, переключитесь на нее и проверьте, сохраняется ли проблема. Если проблема не появляется, проблема, скорее всего, связана с вашей учетной записью. Поскольку не существует простого способа исправить вашу учетную запись, переместите ваши личные файлы в новую и начните использовать ее вместо старой.
Решение 8. Убедитесь, что ваша система обновлена
Если эта проблема продолжает появляться, возможно, причина связана с вашей системой.Ошибки и сбои могут появляться время от времени, и если вы сталкиваетесь с ними, лучший способ справиться с ними – убедиться, что ваша операционная система обновлена.
Windows 10 обычно устанавливает отсутствующие обновления автоматически, но вы всегда можете проверить наличие обновлений самостоятельно, выполнив следующие действия:
Теперь Windows проверит наличие доступных обновлений и установит их автоматически. После установки обновлений проверьте, не устранена ли проблема.
Решение 9 – Выполнить восстановление системы
Чтобы выполнить восстановление системы, вам просто нужно сделать следующее:
После того, как вы восстановите свою систему, проверьте, сохраняется ли проблема.
Знакомство с WinDBG – Часть 2
В первой части мы получили базовое представление об отладчике WinDBG. Во второй части мы углубим свои знания, чтобы вы уже смогли начать отладку программ.
Автор: Брэд Антониевич (Brad Antoniewicz)
В первой части мы получили базовое представление об отладчике WinDBG. Во второй части мы углубим свои знания, чтобы вы уже смогли начать отладку программ.
Перечень всех статей, входящих в этот цикл:
Точки останова можно выставить как внутри приложения, так и внутри процессора (аппаратно). Рассмотрим оба этих способа:
Программные точки останова
Перед выполнением программа сначала загружается в память, что позволяет нам временно модифицировать участок памяти, связанный с программой, без влияния на процесс ее выполнения. Именно так и работают программные точки останова. Отладчик запоминает ассемблерную инструкцию, где должна быть вставлена точка останова, затем заменяет ее на ассемблерную инструкцию INT 3 (0xcc), которая заставляет процессор остановить выполнение программы. Как только точка останова достигнута, отладчик считывает текущий адрес памяти, достает ранее записанную инструкцию и показывает ее пользователю. Пользователю кажется, что программа остановился на этой инструкции, однако процессор не имеет ни малейшего представления о ее существовании.
В WinDBG программные точки останова устанавливаются при помощи команд bp, bm, или bu. Команда bp (Break Point), вероятно, наиболее часто используемая команда, при помощи которой устанавливаются точки останова. В самом простейшем случае достаточно указать один адрес, по которому должна быть установлена точка останова:
Адрес, передаваемый команде bp, должен быть участком памяти с исполняемым кодом. Поскольку команда bp работает с памятью, где хранятся данные, то в некоторых случаях могут возникнуть проблемы, так как отладчик перезаписывает информацию, которая находится в участке памяти. Во избежание проблем компания Microsoft рекомендует использовать команду ba (о ней мы поговорим дальше) в случае, если вы работаете с памятью, где хранятся данные.
Давайте рассмотрим, как устанавливать программные точки останова на примере приложения notepad.exe, которое мы будем запускать через WinDBG. По умолчанию, при запуске программы через WinDBG, отладчик устанавливает точку останова в самом начале программы. Для начала найдем адрес памяти, куда загрузился notepad.exe:
Рисунок 1: Нахождение адреса загрузки notepad.exe
Рисунок 2: Нахождение точки входа программы
Теперь устанавливаем точку останова в точку входа (адрес загрузки + 0x3689):
Рисунок 3: Установление точки останова
Наконец, после всех вышеперечисленных манипуляций, мы возобновляем запуск программы, используя команду g (подробнее о ней мы поговорим позже) до тех пор, пока поток выполнения не дойдет до точки останова. Как только это произойдет, на экране появится сообщение:
Рисунок 4: Сообщение, появляющееся по достижении точки останова
В большинстве случаев вы будете использовать программные точки останова, однако иногда вам понадобятся аппаратные точки останова (например, когда у памяти установлен атрибут «только чтение» или когда информация защищена и т. д.).
Аппаратные точки останова
Внутри большинства процессоров существуют специальные отладочные регистры, которые можно использовать для хранения адресов точек останова и специальных условий доступа, по которым срабатывают эти точки останова (например, на чтение, запись или выполнение). Точки останова, хранящиеся в таких регистрах, называются аппаратными (или процессорными) точками останова. Когда процессор доходит до адреса памяти, которые определен внутри отладочного регистра и выполняются условия доступа, программа останавливается.
В WinDBG аппаратные точки останова устанавливаются при помощи команды ba (Break on Access). Обычно в эту команду передается три аргумента:
0:001> ba e 1 00453689
При помощи этой команды, вероятно, можно было добиться того же самого, что и в примере с командой bp, но только не в случае с аппаратными точками останова (вскоре мы узнаем почему). Первый аргумент e – тип доступа к памяти (на выполнение), второй аргумент – размер (всегда 1 для этого типа доступа). Последний аргумент – адрес. Давайте рассмотрим установку аппаратной точки останова, учитывая то, что наши адреса загрузки различаются из-за ASLR.
Из-за способа, при помощи которого Windows сбрасывает контексты потока, и места, где появляется WinDBG после порождения процесса, мы не сможем установить точку останова тем же самым способом, как делали это в предыдущем примере. Ранее мы устанавливали точку останова во входной точке приложения, но если сделать так же и здесь, то возникнет ошибка:
0:000> lmf m notepad
start end module name
00e60000 00e90000 notepad notepad.exe
0:000> ba e 1 00e63689
^ Unable to set breakpoint error
The system resets thread contexts after the process
breakpoint so hardware breakpoints cannot be set.
Go to the executable’s entry point and set it then.
‘ba e 1 00e63689’
Для решения этой проблемы нам нужно использовать команду g, чтобы программа добралась до определенного адреса памяти. Когда мы устанавливали программную точку останова, то делали примерно то же самое, но не совсем. Таким образом, мы заставляем WinDBG дойти до начального контекста потока, что впоследствии позволит нам устанавливать аппаратные точки останова.
0:000> g 00e63689
ModLoad: 76be0000 76bff000 C:\Windows\system32\IMM32.DLL
ModLoad: 76c00000 76ccc000 C:\Windows\system32\MSCTF.dll
eax=77081162 ebx=7ffd7000 ecx=00000000 edx=00e63689 esi=00000000 edi=00000000
eip=00e63689 esp=0022fbb4 ebp=0022fbbc iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
notepad!WinMainCRTStartup:
00e63689 e8c5f9ffff call notepad!__security_init_cookie (00e63053)
Теперь мы можем установить аппаратную точку останова:
Рисунок 5: Установка корректной аппаратной точки останова
Чтобы убедиться в том, что точка останова хранится в регистре процессора, можно использовать команду r (подробнее о ней мы поговорим позже). Атрибут M нужен для использования маски регистра 0x20:
Рисунок 6: Просмотр отладочных регистров
Из Рисунка 6 видно, что что-то мы сделали не так, и во всех регистрах находятся нули! Такое произошло потому, что WinDBG еще ничего не занес ни в один из этих регистров. После того, как вы продвинетесь на один шаг вперед, используя команду p (подробнее об этом поговорим чуть позже), то в регистр dr0 установится адрес нашей точки останова:
Рисунок 7: При продвижении вперед на один шаг, в отладочный регистр устанавливается адрес аппаратной точки останова
В данном конкретном случае мы, вероятно, никогда не достигнем установленной точки останова, поскольку уже находимся в точке входа приложения. Однако если бы наша точка останова стояла на функции, которая вызывается несколько раз во время выполнения программы, или на участке памяти, где хранится часто используемая переменная, наша точка останова сработала бы, и мы получили бы соответствующее сообщение, как и в случае с программной точкой останова.
Команды для работы с точками останова
Теперь, когда вы познакомились с базовой информацией о точках останова, мы рассмотрим некоторые команды для работы с ними, которые могут быть полезны во время отладки.
Просмотр точек останова
Для просмотра всех точек установленных точек останова используется команда bl (Breakpoint List).
0:000> bl
0 e 00523689 e 1 0001 (0001) 0:**** notepad!WinMainCRTStartup
Результат выполнения команды разделен на несколько колонок. Рассмотрим назначение каждой из них:
Удаление точек останова
Чтобы удалить точку останова, используйте команду bc:
В команду передается только один параметр – идентификатор точки останова (можно узнать, выполнив команду bl). По желанию можно указать символ *, чтобы удалить все точки останова.
Некоторые трюки при работе с точками останова
Существует несколько трюков, которыми я обычно пользуюсь при работе с точками останова. Ниже приводятся некоторые из них. Если вы также пользуетесь какими-либо трюками, расскажите о них в комментариях!
Самый простейший трюк при работе с точками останова – вычисление адреса памяти. Вместо того чтобы производить эти вычисления в голове, вы можете сделать это прямо в WinDBG. К примеру, в вышеупомянутых примерах мы знаем адрес загрузки notepad.exe и смещение входной точки программы (0x3689). Теперь мы можем вычислить адрес для установки точки останова:
0:000> lmf m notepad
start end module name
00770000 007a0000 notepad notepad.exe
0:000> bp 00770000 + 3689
0:000> bl
0 e 00773689 0001 (0001) 0:**** notepad!WinMainCRTStartup
Использование имен и смещений в качестве адресов
Символы (о которых мы говорили в первой части) особенно хороши тем, что дают нам информацию о местонахождении известных функций. Таким образом, мы можем использовать смещения к этим функциям в качестве адресов в точках останова. Для того чтобы выяснить смещение, используйте команду u. Команда u возьмет информацию по указанному адресу и отобразит ее в виде ассемблерных инструкций. Кроме того, команда u выводит смещение до ближайшего символа:
0:000> u 00770000 + 3689
notepad!WinMainCRTStartup:
00773689 e8c5f9ffff call notepad!__security_init_cookie (00773053)
0077368e 6a58 push 58h
Теперь мы знаем, что имя notepad!WinMainCRTStartup более красивый аналог адресу 00770000 + 3689. Поскольку в конце этого имени не стоит числового смещения, мы можем сделать вывод, что для этой функции существуют символы. Давайте проверим инструкцию, которая следует сразу за первой функцией:
0:000> u 0077368e
notepad!_initterm_e+0x61:
0077368e 6a58 push 58h
В этот раз мы получили имя функции notepad!_initterm_e плюс смещение (+0x61). Я точно не знаю, почему WinDBG добавляет смещение к notepad!_initterm_e вместо notepad!WinMainCRTStartup. Вероятно, влияет порядок сортировки во время поиска символов. Тем не менее, мы можем добавить смещение к notepad!WinMainCRTStartup, чтобы сослаться на ту же самую область памяти:
0:000> u notepad!WinMainCRTStartup+0x5
notepad!_initterm_e+0x61:
0077368e 6a58 push 58h
Вся фишка в том, что мы можем использовать это смещение во время установки точки останова, и эти смещения всегда корректны, даже когда работает ASLR. То есть нам не нужно высчитывать адреса при каждом запуске.
0:000> bp notepad!WinMainCRTStartup+0x5
0:000> bl
0 e 0077368e 0001 (0001) 0:**** notepad!_initterm_e+0x61
Прерывание загрузки модуля
На практике может возникнуть необходимость в установке точки останова во время загрузки модуля. К сожалению, не существует очевидного решения этой задачи в рамках использования стандартных команд (если вам знаком такой способ, поделитесь им в комментариях). Зато есть немного замысловатый путь, когда мы добавляем подобную точку останова, путем установки исключения при помощи команды sxe, возникающего во время загрузки модуля:
0:000> sxe ld IMM32.DLL
Выполняя эту команду, мы установили first chance исключение (sxe) во время загрузки модуля (ld) и определили конкретный модуль (IMM32.DLL), в котором возникает это исключение.
Мы можем увидеть все установленные исключения, используя команду sx (Set Exceptions). Если посмотреть на список под именем Load Module, то можно увидеть прерывание на модуле IMM32.DLL.
Рисунок 8: Прерывание на модуле IMM32.DLL
Убрать исключение можно при помощи команды sxi (Set Exception Ignore):
0:000> sxi ld IMM32.DLL
Выполнение команд при срабатывании точки останова
Может возникнуть такая ситуация, что при срабатывании точки останова будет необходимо выполнить определенные команды. К примеру, нужно узнать, что находится в стеке. В WinDBG весь процесс можно автоматизировать при помощи выполнения цепочки команд, привязанных к точке останова. В нашем примере мы будем выводить на экран информацию из стека при помощи команды dd (более подробно поговорим о ней позже). Также обратите внимание, как отображается наша команда при просмотре перечня точек останова:
0:000> bp notepad!WinMainCRTStartup «.echo \»Here are the values on the stack:\n\»; dd esp;»
0:000> bl
0 e 00ae3689 0001 (0001) 0:**** notepad!WinMainCRTStartup «.echo \»Here are the values on the stack:\n\»; dd esp;»
Теперь давайте посмотрим, что произойдет при срабатывании точки останова:
Рисунок 9: При срабатывании точки останова отображается информация из стека
Как и ожидалось, выполнилась команда, и отобразилась информация из стека. Только не забывайте экранировать кавычки, находящиеся внутри внешних кавычек. Вы даже можете добавить в такую цепочку команду g, чтобы после выполнения команд программа продолжила свою работу. Это позволит вам анализировать состояние программы во время ее работы, вместо того, чтобы каждый раз прерываться.
Оставайтесь на связи
В следующей статье мы рассмотрим инспектирование памяти и пошаговую отладку программы! Не переключайтесь!