Сейчас на форуме: Lohmaty (+7 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Можно ли по средствам винды отключить подсчет тактов, или изменить значение на фиксированное? |
Посл.ответ | Сообщение |
|
Создано: 04 октября 2018 08:53 · Личное сообщение · #1 |
![]() Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 04 октября 2018 09:15 · Личное сообщение · #2 |
|
Создано: 04 октября 2018 12:37 · Личное сообщение · #3 |
|
Создано: 04 октября 2018 12:53 · Личное сообщение · #4 |
|
Создано: 04 октября 2018 12:56 · Личное сообщение · #5 |
|
Создано: 04 октября 2018 13:03 · Поправил: f13nd · Личное сообщение · #6 Ее логика такая Code:
When in protected or virtual 8086 mode, the time stamp disable (TSD) flag in register CR4 restricts the use of the RDTSC instruction as follows. When the TSD flag is clear, the RDTSC instruction can be executed at any privilege level; when the flag is set, the instruction can only be executed at privilege level 0. CR4 устанавливается одним из форматов инструкции mov и только в 0 кольце: Moves the contents of a control register (CR0, CR2, CR3, or CR4) to a general-purpose register or vice versa. The operand size for these instructions is always 32 bits, regardless of the operandsize attribute. (See “Control Registers” in Chapter 2 of the IA-32 Intel Architecture Software Developer’s Manual, Volume 3, for a detailed description of the flags and fields in the control registers.) This instruction can be executed only when the current privilege level is 0. ----- 2 оттенка серого ![]() |
|
Создано: 04 октября 2018 13:26 · Личное сообщение · #7 |
|
Создано: 04 октября 2018 13:36 · Личное сообщение · #8 |
|
Создано: 04 октября 2018 14:19 · Личное сообщение · #9 Проще будет хукать код, который юзает RDTSC. Другой вариант - драйвер типа того, что выкладывал Archer Ну и, наверняка, у Indy есть свой вариант. ----- EnJoy! ![]() |
|
Создано: 04 октября 2018 14:24 · Личное сообщение · #10 |
|
Создано: 04 октября 2018 16:39 · Личное сообщение · #11 |
|
Создано: 04 октября 2018 18:47 · Личное сообщение · #12 Точно отбенчить код можно в ядре. Знаю такой трюк: Code:
Используем perfomance counter'ы в MSR регистрах. Их три штуки: один считает все такты, другой только такты затраченные на исполнение кода, третий - выполненные инструкции. Если брать третий счетчик и тестируемый код оборачивать в cli / sti, то результат всегда сходится цифра в цифру. Если брать значимые такты - немного плавает. Если брать все такты - скачет как мартовский заяц из-за смены режимов энергопотребления процессора. ----- PGP key ![]() |
|
Создано: 01 ноября 2018 20:50 · Личное сообщение · #13 Jupiter > Ну и, наверняка, у Indy есть свой вариант. Конечно же. Есть калибровочный источник данных, который расположен в разделяемой ядром памяти и ядро там значение апдейтит. Есть пользовательский поток выборок(DF) к данной области. Для решения задачи могут быть использованы два пути: 1. Установка ловушки на область. Дикий способ, учитывая что ловушек всего четыре. 2. Трек выборки. Адресный декодер обнаруживает выборку из целевой области и тогда в зависимости от импл. выполняется подмена данных. Могу пример показать если интересно. ----- vx ![]() |
|
Создано: 02 ноября 2018 00:53 · Личное сообщение · #14 |
|
Создано: 03 ноября 2018 12:10 · Поправил: difexacaw · Личное сообщение · #15 Jupiter У юзер кода как таковой производительности нет. Общий профайл определяется ядром, там потоки большую часть времени спят в ожидании синхрособытий. Драйвера не панацея, нет никаких проблем отключить таймеры(tsc или сервисные) и в драйвере нужные значения возвращать. Вот только есть один нюанс, что ту же тск можно заменить на любые асм примитивы. Тоесть счётчики возвращают абсолютное время, можно сравнить два цикла на число итераций и так получится относительное время, без использования таймеров. Это просто обычно не используется. А счётчики в USD никак по простому не изменить. У ядра нет интерфейсов, что бы там значение калибровать, так же и манипуляции с этой областью из юм невозможны. В простейшем случае нужно анмапить из км эту область и замапить туда свою, где реализовать свой таймер. Это из области извратов. Делается просто - отслеживаем выборку и подменяем значение. Не трогая ядро. Профайл зависит от имплементации. ----- vx ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Можно ли по средствам винды отключить подсчет тактов, или изменить значение на фиксированное? |