Время выполнения

RDTSC, GetTickCount

Тайминговые атаки очень эффективны против отладчиков. Когда отладчик присутствует, и выполняет пошаговую трассировку, есть существенная задержка между выполнением отдельных команд, по сравнению с обычным выполнением. Эта задержка может быть измерена, при помощи нескольких способов.

  • команда RDTSC (Read Time-Stamp Counter)

Это ассемблерная инструкция для платформы x86, читающая счетчик TSC (Time Stamp Counter) и возвращающая в регистрах EDX:EAX 64-битное количество тактов с момента последнего сброса процессора. rdtsc поддерживается в процессорах Pentium и более новых. Опкод: 0F 31. В многозадачных операционных системах инструкция может быть превращена в привилегированную (установлен 3 бит в управляющем регистре CR4), и ее использование приведет к генерации исключения в программе.
Для того чтобы использовать инструкцию RDTSC в антиотладочных целях, необходимо выполнить ее дважды: до и после выполнения кода, для которого будет производиться замер:

ADDRESS_1: RDTSC и запоминаем EAX как значение_1
ADDRESS_2: выполняемый код
ADDRESS_3: RDTSC и запоминаем EAX как значение_2
ADDRESS_4: значение2 - значение 1 и сравниваем с некой константой

Есть разновидность метода с RDTSC – делать RDTSC, потом генерить исключение, но без использования регистра EAX, и уже в предварительно поставленном обработчике исключения делать второй RDTSC и сравнивать со значением из CONTEXT.EAX.

  • функция GetTickCount() из kernel32

Функция DWORD WINAPI GetTickCount(void) - возвращает количество миллисекунд, прошедших с момента запуска системы.
Принцип работы тот же, что и у команды RDTSC. Надо сделать два замера и разницу сравнить с некой константой
(время, за которое выполняется отслеживаемый нами кусок кода без отладчика)

Обратно к содержанию

Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License