как вы перехватываете адрес инструкции, которая пишет в сегмент памяти? - PullRequest
0 голосов
/ 23 января 2020

Представьте, что у нас есть обычная инструкция, такая как эта

mov [eax], ebx

, и eax содержит некоторый адрес, на который мы хотели бы написать.

Идея состоит в том, чтобы написать c Программа, которая сообщает вам, какой адрес содержит инструкцию, если мы уже знаем адрес, на который она будет записываться.

Реальный вопрос: напишите программу c, используя бесплатный sony pspsdk, который выполнит sh то же самое.

psp использует MIPS III / IV, и инструкция будет выглядеть примерно так:

sw a0 $00(t0)
##which literally spells out store register a0 at offset t0 + 0 bytes. where t0 would
## contain something like 0x08800000

отказ от ответственности: все еще полезно знать, как это сделать на windows , так что если кто-то знает, как это сделать только на windows или даже на osx, это все равно будет оценено, поскольку он может предоставить соответствующую информацию о подобных методах программирования для выполнения sh этой конкретной задачи.

1 Ответ

1 голос
/ 23 января 2020

Перехват инструкции, записывающей по определенному адресу, не является обычной деятельностью в программах.

Это функция, предоставляемая некоторыми отладчиками. Существует по крайней мере три способа, которыми отладчики могут сделать это:

  • Отладчик может исследовать программный код и найти, куда конкретная инструкция записывает определенный адрес. На самом деле это чрезвычайно сложное занятие, требующее интерпретации инструкций. Часто отладчик не может сделать это полностью; так как это в целом эквивалентно полной интерпретации и выполнению программы так же, как процессор компьютера, и это очень медленно в программном обеспечении. Вместо этого отладчик может планировать часть выполнения программы и помещать точку останова в месте, где он не может легко продолжить, например, в инструкции перехода, которая зависит от значения, которое отладчик не готов вычислить , Точка останова - это специальная инструкция, которая прерывает выполнение программы и в этом случае операционная система передает управление отладчику. В это время отладчик удаляет точку останова, запрашивает одноступенчатую инструкцию (чтобы процессор выполнил одну инструкцию, а затем немедленно прервал выполнение программы), проверяет результат и продолжает работу.
  • Отладчик может пометьте страницу памяти, содержащую нужный адрес, как отсутствие доступа. Затем, когда программа обращается к этой памяти, аппаратное обеспечение прерывает выполнение программы, и операционная система передает управление отладчику. Отладчик проверяет инструкцию, которая вызвала прерывание. Если инструкция обращается к целевому адресу, на это действует отладчик. Если это не так, отладчик изменяет защиту памяти, чтобы разрешить доступ, запрашивает одноступенчатую инструкцию, изменяет защиту памяти, чтобы запретить доступ, и возобновляет программу для ожидания следующего прерывания. (Вместо того, чтобы выполнять пошаговую инструкцию, отладчик может просто эмулировать ее, поскольку это может избежать изменения защиты памяти дважды, что может быть дорогостоящим.)
  • Некоторые модели компьютерных процессоров имеют функции для поддержки такого рода отладки. характерная черта. Отладчик может запросить мониторинг части памяти, чтобы аппаратное обеспечение прерывало выполнение программы при обращении к определенному адресу, а не при обращении к какой-либо части всей страницы памяти.

Я не могу поговорите с платформой Sony, которую вы используете. Вы должны будете проверить его документацию или спросить других относительно доступности таких функций. Поскольку эта функция чаще всего используется отладчиками, изучение документации об отладке может быть способом выяснить, поддерживает ли система такую ​​функцию.

...