DetectHypervisor

Тема в разделе "WASM.SOURCES & 2LZ", создана пользователем Ahimov, 3 май 2025.

  1. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    254
    С ядра 8-ки вырезал кодес.
     

    Вложения:

    • hv.zip
      Размер файла:
      3,8 КБ
      Просмотров:
      213
    alex_dz, Research, MaKsIm и ещё 1-му нравится это.
  2. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    254
    Граф.
     

    Вложения:

    • gpf.png
      gpf.png
      Размер файла:
      246,4 КБ
      Просмотров:
      99
    shanya0xff нравится это.
  3. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    254
    Декомпильнул вручную, не до конца, код жесть :wacko:

    Тут тоже не обошлось без чудо-конструкций :swoon:

    Код (Text):
    1.     if EDX
    2.         EDX--
    3.         if EDX
    4.             EDX--
    5.             if EDX
    6.                 EDX--
    7.             fi
    8.         fi
    9.     fi
    10.     rdtsc
    - у rdtsc нет входных параметров и она переписывает edx.
    --- Сообщение объединено, 4 май 2025 ---
    Вот так вроде правильно. Как эта логика работает хз.
     

    Вложения:

    • a2.txt
      Размер файла:
      1,4 КБ
      Просмотров:
      81
    • a3.txt
      Размер файла:
      1,3 КБ
      Просмотров:
      76
  4. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    393
    Код (Text):
    1. // Hypervisor Detection via Timing Variance Heuristic - Pseudocode
    2.  
    3. // Initialize variables
    4. I = 0                  // Sample counter
    5. X1 = 0                 // Variance accumulator
    6.  
    7. // Get initial performance counter
    8. F0 = PFC()             // Initial performance counter value
    9.  
    10. BeginMeasurement:
    11.     // Take time stamp counter reading before operation
    12.     T0 = TSC()
    13.  
    14.     // Small computation to measure timing variance
    15.     EAX = I
    16.     EDX = Sign(EAX)    // Sign extend EAX into EDX (0 or -1)
    17.     EDX:EAX = EDX:EAX / 4  // Division with remainder in EDX
    18.  
    19.     // Check remainder and perform conditional decrements
    20.     // This creates predictable branch patterns
    21.     if EDX != 0
    22.         EDX--
    23.         if EDX != 0
    24.             EDX--
    25.             if EDX != 0
    26.                 EDX--
    27.             endif
    28.         endif
    29.     endif
    30.  
    31.     // Take time stamp counter reading after operation
    32.     T = TSC()
    33.  
    34.     // Get current performance counter
    35.     F = PFC()
    36.  
    37.     // Calculate and store TSC delta in buffer
    38.     dTSC = T - T0
    39.     Bu[I*8] = dTSC     // Store timing measurement
    40.  
    41.     // Increment sample counter
    42.     I++
    43.  
    44.     // Check if we have 1000 samples
    45.     if I >= 1000
    46.         goto ProcessMeasurements
    47.     endif
    48.  
    49.     // Check if enough time has elapsed (F - F0 >= 20)
    50.     elapsed = F - F0
    51.     if elapsed >= 20
    52.         goto ProcessMeasurements
    53.     endif
    54.  
    55.     // Continue measurement
    56.     goto BeginMeasurement
    57.  
    58. ProcessMeasurements:
    59.     M = I               // Total sample count
    60.  
    61.     // Initialize values for finding minimum
    62.     min_value = Bu[0]   // First sample as initial minimum
    63.     min_index = 0       // Index of minimum
    64.     X2 = 0              // Sum of all samples
    65.  
    66.     // Find minimum sample and calculate sum
    67.     for J = 1 to M-1
    68.         current = Bu[J*8]
    69.  
    70.         // Check if current sample is smaller than minimum
    71.         if current < min_value
    72.             min_value = current
    73.             min_index = J
    74.         endif
    75.  
    76.         // Add to sum
    77.         X2 = X2 + current
    78.     next J
    79.  
    80.     // If we have more than one sample, replace minimum with last sample
    81.     if M > 1
    82.         // Replace minimum with last sample
    83.         Bu[min_index*8] = Bu[(M-1)*8]
    84.  
    85.         // Decrement sample count and adjust sum
    86.         M--
    87.         X2 = X2 - min_value
    88.     endif
    89.  
    90.     // Calculate mean
    91.     X0 = X2 / M
    92.  
    93.     // Calculate variance (sum of squared differences)
    94.     X1 = 0
    95.     for N = 0 to M-1
    96.         // Calculate (sample - mean)^2
    97.         diff = Bu[N*8] - X0
    98.         X1 = X1 + (diff * diff)
    99.     next N
    100.  
    101.     // Calculate final variance value
    102.     variance = (X1 / M) / X0
    103.  
    104.     // Check if variance exceeds threshold (5000)
    105.     if variance > 5000
    106.         return TRUE     // Hypervisor detected
    107.     else
    108.         return FALSE    // No hypervisor
    109.     endif
    110.  
    Так что ли?
     
    Ahimov нравится это.
  5. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    254
    galenkane,

    Во втором всё правильно.

    Это что то похожее на тему про серию call's. Ведётся таблица, в которую сохраняется дельта времени, что там дальше сходу не понять. Есть ещё холостая конструкция ECX = 1, врядле этот мусор компилер вставил.

    Для начала надо бы потестить, это вообще работает ?

    Есть ещё с cr3, но то ядерное. Что интересно опять же rdtsc с не используемым аргументом.

    INIT:00910EDC mov eax, cr3
    INIT:00910EDF rdtsc

    wtf!?
     

    Вложения:

    • cr3.txt
      Размер файла:
      3,8 КБ
      Просмотров:
      78
    Последнее редактирование: 4 май 2025
  6. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    393
    vmware не детектит
     
  7. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    254
    galenkane,

    Варю я тестил на днях. Идея была в замере числа итераций 2-х циклов за одинаковый интервал и вычисление их отношения. Даже системные инструкции не меняют отношение таймингов как на хосте, что очень странно.
     
  8. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    393
    TestHypervisorDetection вот через бит детектится) но тайминг чето не
     

    Вложения:

    • t1.zip
      Размер файла:
      66,7 КБ
      Просмотров:
      78
    Ahimov нравится это.
  9. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    254
    galenkane,

    ExpDetectHypervisorCpuId:

    Код (Text):
    1. INIT:00910F55                 xor     eax, eax
    2. INIT:00910F57                 inc     eax
    3. INIT:00910F58                 xor     ecx, ecx
    4. INIT:00910F5A                 cpuid
    5. INIT:00910F5C                 lea     esi, [ebp-18h]
    6. INIT:00910F5F                 mov     [esi], eax
    7. INIT:00910F61                 mov     [esi+4], ebx
    8. INIT:00910F64                 mov     [esi+8], ecx
    9. INIT:00910F67                 mov     [esi+0Ch], edx
    10. INIT:00910F6A                 test    dword ptr [ebp-10h], 80000000h
    AMD SDM:
    Код (Text):
    1. Bits Field Name Description
    2. 31 — RAZ. Reserved for use by hypervisor to indicate guest status
     
  10. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    393
    можно и так
    --- Сообщение объединено, 4 май 2025 ---
    на вари ровно показывает
     

    Вложения:

    • кеш.zip
      Размер файла:
      73,2 КБ
      Просмотров:
      74
    Ahimov нравится это.
  11. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    254
    Вот интересно, что дает чтение cr3?
     
  12. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    393
    1. Уровни привилегий: В нормальной системе без виртуализации приложения пользовательского режима (ring 3) не могут напрямую читать CR3 - это вызывает исключение защиты (#GP). Только код в режиме ядра (ring 0) имеет право читать/изменять регистры CR0-CR4.
      • Если чтение не вызывает исключение защиты, это означает, что система виртуализирована
      • Если происходит исключение, то система, скорее всего, работает на "голом железе"
     
  13. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    254
    galenkane,

    Я имею ввиду fetch_cr3 - rdtsc.
    --- Сообщение объединено, 4 май 2025 ---
    Наверно с этим связано:

     
    Последнее редактирование: 4 май 2025
    galenkane нравится это.
  14. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    393
    В виртуализированной среде доступ к CR3 занимает значительно больше времени, чем в нативной
    --- Сообщение объединено, 4 май 2025 ---
    да,связано
    --- Сообщение объединено, 4 май 2025 ---
    Вот набросал идеи,может какие и зайдут. Нужно тестить.
     

    Вложения:

    • think.zip
      Размер файла:
      68,4 КБ
      Просмотров:
      76
    alex_dz и Ahimov нравится это.
  15. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    254
    galenkane,

    Если сравнить тайминг rdtsc VS iret, получается 4%5 на хосте и варе. Причём:

    Но это наверно не важно. rdtsc VS cpuid на хосте 2, на варе 40, не зависимо включен vmx или нет.

    Код (Text):
    1. Entry proc С
    2.     xor esi,esi
    3.     invoke GetTickCount
    4.     lea ebx,D[eax+1000]
    5.     .repeat
    6.         inc esi
    7.         xor eax,eax
    8.         rdtsc
    9.         invoke GetTickCount
    10.     .until Eax >= Ebx
    11.     push esi
    12.  
    13.     xor edi,edi
    14.     invoke GetTickCount
    15.     lea esi,D[eax+1000]
    16.     .repeat
    17.         inc edi
    18.         xor eax,eax
    19.     ;    pushfd
    20.     ;    push cs
    21.     ;    push offset Lb
    22.     ;    iretd
    23. Lb:
    24.         cpuid
    25.         rdtsc
    26.         invoke GetTickCount
    27.     .until Eax >= Esi
    28.     pop esi
    esi:edi. Отношение числа итераций соответственно равно отношению таймингов.
     
  16. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    393
    да, вроде работает.

    vmware
    - RDTSC vs CPUID timing ratio heuristic: Yes
    (RDTSC:CPUID ratio = 95:1, threshold = 10)

    windows host
    - RDTSC vs CPUID timing ratio heuristic: No
    (RDTSC:CPUID ratio = 5:1, threshold = 10)
     

    Вложения:

    Ahimov нравится это.
  17. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    254
    Решил проверить исполнение - запись кода, но что то странное. Идея такая, есть две инструкции, которые исполняются на первом cpu, второй их изменяет одной инструкцией:

    Код (Text):
    1. ; 1st thread.
    2. P:
    3.     mov eax,12345678
    4.     mov edx,87654321
    5.  
    6. ; 2st thread.
    7.     mov eax,33BA8765h
    8.     xchg D[P][3],eax
    9.         -->
    10.     mov eax,87655678
    11.     mov edx,87654333
    По идеи проц должен выбрать первую инструкцию, затем измененную вторую, что привеёт к рассинхрону. На деле такого не происходит, получается бесконечный цикл. Как такое происходит, проц выбирает на исполнение две инструкции за раз ??

    Код (Text):
    1. pThread proc p1:dword
    2. P::
    3.     mov eax,12345678h
    4.     mov edx,87654321h
    5.  
    6.     .if ((Eax == 12345678h) && (Edx != 87654321h)) || ((Eax == 87655678h) && (Edx != 87654333h))
    7.         int 3
    8.     .endif
    9.  
    10. ; Wait for end-of-quantum.
    11.     mov ax,fs
    12.     .if Ax == 53h        ; WOW
    13.         xor eax,eax
    14.         mov fs,ax
    15.         .repeat
    16.             mov ax,fs
    17.         .until Ax
    18.     .else            ; Native
    19.         fwait
    20.         .repeat
    21.             smsw ax
    22.             test ax,1000B
    23.         .until !Zero?
    24.     .endif
    25.     jmp P
    26. pThread endp
    27.  
    28. Entry proc
    29. Local Tid:ULONG
    30.     invoke CreateThread, 0, 0, addr pThread, 0, 0, addr Tid
    31.     invoke SetThreadAffinityMask, Eax, 10B
    32.     invoke SetThreadAffinityMask,  -2, 01B
    33.  
    34.     mov eax,33BA8765h
    35. @@:
    36.     xchg D[P][3],eax
    37.     jmp @b
    --- Сообщение объединено, 5 май 2025 ---
    Интересно получается. Это конвеер?

    Код (Text):
    1. Iter:
    2. ;    xor eax,eax
    3.     xor eax,eax
    4.     xor eax,eax
    5.     xor eax,eax
    6.     xor eax,eax
    7.     xor eax,eax
    8.     xor eax,eax
    9.     xor eax,eax
    10.     xor eax,eax
    11.     xor eax,eax
    12.     xor eax,eax
    13.     xor eax,eax
    14.     xor eax,eax
    15.     xor eax,eax
    16.     xor eax,eax
    17.     xor eax,eax
    18.     xor eax,eax
    19.     xor eax,eax
    20.     xor eax,eax
    21.     xor eax,eax
    22.     xor eax,eax
    23.     xor eax,eax
    24.     xor eax,eax
    25.     xor eax,eax
    26.     xor eax,eax
    27.     xor eax,eax
    28.     xor eax,eax
    29.     xor eax,eax
    30.     xor eax,eax
    31.     xor eax,eax
    32.     xor eax,eax
    33.     xor eax,eax
    34.     xor eax,eax
    35.     xor eax,eax
    36.     xor eax,eax
    37.     xor eax,eax
    38.     xor eax,eax
    39.     xor eax,eax
    40.     xor eax,eax
    41.     xor eax,eax
    42.     xor eax,eax
    43.     xor eax,eax
    44.     xor eax,eax
    45.     xor eax,eax
    46.     xor eax,eax
    47.     xor eax,eax
    48.     xor eax,eax
    49.     xor eax,eax
    50.     xor eax,eax
    51.     xor eax,eax
    52.     xor eax,eax
    53.     xor eax,eax
    54.     xor eax,eax
    55.     xor eax,eax
    56.     xor eax,eax
    57.     xor eax,eax
    58.     xor eax,eax
    59.     xor eax,eax
    60.     xor eax,eax
    61.     xor eax,eax
    62. P::
    63.     mov eax,12345678h
    64.     mov edx,87654321h
    - так крутится, если добавить ещё одну из комента, возникает рассинхрон и останов :umnik:

    На этом можно отличный детект построить.
    --- Сообщение объединено, 5 май 2025 ---
    На варе у конвеера длины нет похоже вовсе, на 300 инструкциях останова нет.
    --- Сообщение объединено, 5 май 2025 ---
    upd:
    У меня на варе крутится тк affinity = 1, хотя в настройках 2. Впрочем варя после бсодов немного повредилась, нужно на норм проверить.
    --- Сообщение объединено, 5 май 2025 ---
    Если в серию вставить jmp short, останов. Если вставить iret:
    Код (Text):
    1.     pushfd
    2.     push cs
    3.     push offset Li
    4.     iretd
    5. Li:
    - конвеер сбрасывается и останова нет. Короче забавная штука :)
     
  18. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    393
    Pipeline behavior ?
     
  19. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    254
    galenkane,

    Не знаю пока, возможно нет. Это как то от выравнивания зависит на границу 64.

    Последнее время что не тема, то какое то гадание. Такое чувство что процессор живёт своей жизнью :)
     
  20. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    393
    align 16 мб?