Ищете способ перехватить инструкции CPUID - PullRequest
1 голос
/ 17 сентября 2009

Я ищу удобный способ заманить в ловушку инструкцию CPUID Linux-процессов. Поиграл с ptrace () и исправил все коды операций cpuid во всех исполняемых областях mmap, созданных процессом, заменив их на int3. Это не сработало, так как байты кода CPUID довольно часто появляются как части других более длинных кодов операции.

Так что в основном я ищу какой-то способ, который позволил бы мне установить точку останова не по определенному адресу памяти, а вместо этого при каждом вызове кода операции. У кого-нибудь есть хорошая идея, как это сделать?

Ответы [ 2 ]

2 голосов
/ 18 сентября 2009

В общем, единственный способ сделать это на произвольном коде x86 и перехватить все угловые случаи - это либо:

  • пошагово и проверять каждую инструкцию перед ее выполнением (PTRACE_SINGLESTEP, см. Ниже); или
  • полностью эмулирует набор команд x86.

Первый способ, вероятно, лучше.

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

Для реализации одноступенчатого метода каждый раз, когда отслеживаемый процесс останавливается, вы должны использовать PTRACE_GETREGS для получения дочерних регистров, а затем использовать значение регистра %eip дочернего элемента в качестве адреса для передачи на PTRACE_PEEKTEXT, получая следующее слово, которое будет выполнено. Изучите это слово, чтобы увидеть, является ли оно инструкцией CPUID - если это так, эмулируйте инструкцию, изменив набор дочерних регистров (включая продвижение %eip после инструкции CPUID). Затем позвоните PTRACE_SINGLESTEP, чтобы процесс продолжился.

1 голос
/ 17 сентября 2009

Нет простого приятного способа сделать это, о чем я знаю.

Гадким способом может быть использование API сценариев Python GDB для автоматического пошагового выполнения программы с проверкой каждой инструкции перед ее выполнением.

Другим неприятным способом может быть получение исходного кода для чего-то вроде Bochs , эмулятора x86 с открытым исходным кодом, и его изменение таким образом, чтобы оно делало то, что вы хотите, когда выполняются интересующие вас инструкции.

...