galenkane, Я хотел в динамике определить, но это так просто не работает: Код (Text): ; 1st thread. ;P: ; mov eax,12345678 ; mov edx,87654321 ; 2st thread. ; mov eax,33BA8765h ; xchg D[P][3],eax ; --> ; mov eax,87655678 ; mov edx,87654333 PIPE_MAX equ 61+64 ; Pipeline max(61) SHED_MAX equ 16 ; Quant's Pp: ; mb align 64 dw PIPE_MAX dup (0C031h) ; inc eax Pipeline proc C P:: mov eax,12345678h mov edx,87654321h .if ((Eax == 12345678h) && (Edx != 87654321h)) || ((Eax == 87655678h) && (Edx != 87654333h)) int 3 not edi lea eax,[edi][PIPE_MAX][1] jmp Exit .endif ; Wait for end-of-quantum. mov ax,fs .if Ax == 53h ; WOW xor eax,eax mov fs,ax .repeat mov ax,fs .until Ax .else ; Native fwait .repeat smsw ax test ax,1000B .until !Zero? .endif ; push offset Pp ; retn dec esi jnz Sjmp mov esi,SHED_MAX ; Quant's dec ebx ; P dec ebx ; P dec edi ; Length jnz Sjmp xor eax,eax Exit: mov Psize,eax popad ret 4 ; ~Arg Pent:: lea ebx,P mov esi,SHED_MAX mov edi,PIPE_MAX Sent: pushad Sjmp: jmp Ebx Pipeline endp --- Сообщение объединено, 6 май 2025 --- Pp: dw PIPE_MAX dup (0C031h) Pipeline proc C - останов. nop Pp: - останов. nop nop Pp: - останов. nop nop nop Pp: - бесконечный цикл. --- Сообщение объединено, 6 май 2025 --- И ещё не понятное. Этот семпл выше не корректный, но при отладке он работает, хотя не должен так. Происходит ожидание окончания поточного кванта, затем должен быть цикл на переменных. Но, без такого цикла в течении ~5 квантов происходит останов. Как это такое может быть опять же хз.
Если Gemini дать дамп, обьясняет подробно, теперь стало понятно как это работает. На счет конструкции: Код (Text): jz short loc_911C1F dec edx jz short loc_911C1F dec edx jz short loc_911C1F dec edx loc_911C1F:
Формально дефект (в контексте данной системы защиты) происходит не как «ошибка» в коде, а как **нарушение инварианта временной области**. Вот формальное объяснение того, как система детектирует вмешательство, разбитое на логические уровни: ### 1. Формальная модель времени Система опирается на два источника времени: * [math]T_{hw}[/math]: Аппаратный счетчик (`CNTVCT_EL0`). Он тикает с частотой процессора и **не может быть остановлен** программно из пользовательского режима. * [math]T_{sw}[/math]: Системное время ОС (`KUSER_SHARED_DATA` или API). Оно зависит от планировщика задач и может быть изменено или «заморожено» отладчиком. **Нормальное состояние (Инвариант):** Разница между временем начала ([math]t_1[/math]) и конца ([math]t_2[/math]) выполнения элементарной операции должна укладываться в детерминированный интервал [math]\Delta t_{norm}[/math]: [math]\Delta t = T_{hw}(t_2) - T_{hw}(t_1) \leq Threshold[/math] Где [math]Threshold[/math] — это максимально допустимое количество тактов для данной инструкции без учета прерываний. --- ### 2. Механизм возникновения дефекта (Атака) Дефект возникает, когда внешний агент (отладчик, эмулятор, хук) нарушает поток выполнения инструкции. #### Сценарий А: Пошаговая отладка (Single-Stepping) — Tier 1 * **Действие атакующего:** Отладчик ставит точку останова или включает режим пошагового выполнения (`TF` флаг в регистре статуса). Процессор после каждой инструкции генерирует исключение, передавая управление отладчику. * **Физический эффект:** 1. Выполняется инструкция `ReadCNTVCT_EL0` (начало). 2. Выполняется целевая инструкция (например, `XOR`). 3. **Срыв потока:** Вместо немедленного выполнения следующей инструкции, процессор останавливается, сохраняет контекст, переключается в кольцо ядра/отладчика, ждет действия пользователя. 4. Проходят тысячи или миллионы тактов. 5. Выполняется инструкция `ReadCNTVCT_EL0` (конец). * **Результат измерения:** [math]\Delta t_{attack} = T_{hw}(end) - T_{hw}(start) \gg Threshold[/math] Поскольку [math]T_{hw}[/math] продолжает тикать, пока отладчик «думает», разница становится аномально большой. * **Вердикт:** `TIME_CHECK_FATAL` срабатывает, так как условие [math]\Delta t \leq Threshold[/math] ложно. #### Сценарий Б: Заморозка потока (Freezing) — Tier 2 * **Действие атакующего:** Отладчик ставит обычную точку останова (Breakpoint). Поток выполнения останавливается полностью на неопределенное время. * **Физический эффект:** * [math]T_{sw}[/math] (системное время в памяти): Часто обновляется по таймеру или при возврате управления. Если поток заморожен, значение в памяти может устареть или обновляться иначе. * [math]T_{hw}[/math] (аппаратный счетчик): Продолжает расти линейно. * **Расчет дрейфа (Drift):** Система сравнивает «грубое» время (из памяти) и «точное» время (из железа) в момент возврата управления: [math]Drift = | T_{precise} - T_{coarse} |[/math] В норме дрейф минимален (< 200 мкс). При заморозке на 5 секунд: [math]Drift_{attack} \approx 5,000,000 \text{ мкс}[/math] * **Вердикт:** Если [math]Drift > Threshold[/math], фиксируется манипуляция временем. #### Сценарий В: Эмуляция/Виртуализация — Tier 3 * **Действие атакующего:** Код выполняется в виртуальной машине (QEMU, эмулятор), где доступ к железу эмулируется гипервизором. * **Физический эффект:** * На реальном железе интервалы между чтениями счетчика имеют случайный шум (джиттер) из-за конвейера процессора, кэшей и прерываний: [math]\sigma^2 > 0[/math]. * В эмуляторе чтение регистра часто эмулируется детерминировано или с постоянной задержкой. Интервалы становятся слишком равномерными. * **Статистический анализ:** Система вычисляет стандартное отклонение ([math]\sigma[/math]) серии замеров: [math]\sigma = \sqrt{\frac{1}{N}\sum_{i=1}^{N} (\Delta t_i - \mu)^2}[/math] * **Вердикт:** Если [math]\sigma < \sigma_{min}[/math] (слишком идеально) или количество нулевых дельт велико, система считает среду виртуальной. --- ### 3. Формальное описание состояния дефекта Дефект считается произошедшим в момент времени [math]t_{detect}[/math], когда выполняется логическое условие: [math]Defect(t) = \begin{cases} 1, & \text{если } (T_{hw}(t_{end}) - T_{hw}(t_{start})) > C_{max} \\ 1, & \text{если } |T_{api}(t) - T_{shared}(t)| > D_{max} \\ 1, & \text{если } \sigma(\Delta t_{samples}) < J_{min} \\ 0, & \text{иначе (норма)} \end{cases}[/math] Где: * [math]C_{max}[/math] — порог тактов для пошаговой отладки. * [math]D_{max}[/math] — порог рассинхронизации часов. * [math]J_{min}[/math] — минимальный ожидаемый аппаратный шум. ### Резюме Дефект происходит формально потому, что **время выполнения кода является физической величиной**, которую невозможно подделать программно, не изменив саму физику работы процессора. Любая попытка вмешаться в выполнение (остановить, изменить, эмулировать) неизбежно добавляет задержку ([math]\Delta t[/math]), которая выходит за рамки математически вычисленного «коридора нормы».