Сейчас на форуме: zombi-vadim, zds (+4 невидимых)

 [email protected] —› Программирование —› TSC.
Посл.ответ Сообщение


Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 24 октября 2013 13:45 · Поправил: Dr0p
· Личное сообщение · #1

Нужно мониторить Rdtsc. При выполнении в юзермоде. Причём под дпортом(KDR не вызывается в этом случае). Больше в ядре ничего нельзя изменять в кодосекциях и IDT. Можно запрещать tsc, но сделать это нужно локально для процесса(тоесть чтобы фолт обрабатывать в VEH), а не глобально во всей системе. По дефолту на сколько помню некоторые системные процессы непрерывно юзают тск(svchost ?).

Как такое провернуть ?



Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 24 октября 2013 16:22
· Личное сообщение · #2

давай уже, выкладывай свой новый мотор




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 24 октября 2013 19:42
· Личное сообщение · #3

Что мешает:
Взять оригинальный фантом и
Со стороны плагина Фантом. В буфере IOCTL есть DeltaRDTSC по смещению 4. Добавить по смещению 8 pid отлаживаемого процесса.
Со стороны драйвера. В обработчике фолта добавить проверку пида. Если пид не тот, возвращаем действительные edx:eax
? Мы можем узнать, в каком процессе произошёл фолт?

-----
IZ.RU





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 25 октября 2013 02:17
· Личное сообщение · #4

DenCoder

Не удивительно что ты вопроса не понимаешь.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 25 октября 2013 02:21
· Личное сообщение · #5

rmn

Тут не аверлаб




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 27 октября 2013 21:25
· Личное сообщение · #6

Dr0p пишет:
DenCoder Не удивительно что ты вопроса не понимаешь.

Желание понять этот вопрос возникнет, если узнаю, почему нельзя сделать проще. Например, как я написал. Узнавать своими силами пока нет охоты, вот и спросил специалиста.

-----
IZ.RU





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 05 ноября 2013 12:37
· Личное сообщение · #7

rdtsc юзает на w7 шедулер. Это значит, что после формирования трап фрейма и размаскировки прерываний поток свопнется и возникнет фолт в самом шедулере, рекурсивно. Значит низя прерывания разрешать. Ну ладно.
Ставим свою ловушку. Но нужно обратиться к памяти для проверки инструкции, а в ловушке высочайший иркл и !IF, тоесть подкачка не робит, а память отгружаема, особенно юзермодная. Единственный вариант ещё поставить ловушек на #PF etc и откатывать фолты. Но это какой то изврат.

Я не сморел как от той говнотулзы дров робит, но скорее всего синька будет через раз возникать.




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 05 ноября 2013 12:45
· Личное сообщение · #8

Dr0p пишет:
после формирования трап фрейма и размаскировки прерываний поток свопнется и возникнет фолт в самом шедулере, рекурсивно.

Теперь понятно. Ранее не проводил таких исследований. Будет время или встанет связанная задача, подумаю.

Dr0p пишет:
Я не сморел как от той говнотулзы дров робит, но скорее всего синька будет через раз возникать

был бсод, что-то там связано с некорректным аттачем при закрытии отладки. То есть пользоваться можно, но крайне осторожно.

-----
IZ.RU





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 05 ноября 2013 12:50 · Поправил: Dr0p
· Личное сообщение · #9

DenCoder

Где слить дров ?
Все ссылки битые, либо без дрова.

Хотя не, она на нулевом кпл фолт не кидает. хм




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 05 ноября 2013 13:29 · Поправил: DenCoder
· Личное сообщение · #10

Dr0p пишет:
Где слить дров ?

аттач

дров в ресурсах фантома, извлекается в ...\local settings\Temp\

1358_05.11.2013_EXELAB.rU.tgz - rdtsc.sys

-----
IZ.RU





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 05 ноября 2013 14:39
· Личное сообщение · #11

DenCoder

Спасибо, заценил:

Code:
  1. ; [Esp]:
  2. ; ErrorCode
  3. ; rEip
  4. ; rCs
  5. ; rEFlags
  6. ; - ring transitions -
  7. ; rEsp
  8. ; rSs
  9. ; - v8086 -
  10. ; rEs
  11. ; rDs
  12. ; rFs
  13. ; rGs
  14.  
  15. IRET_FRAME struct                  ; VFRAME
  16.          ErrorCode               DWORD ?        ; + 0x2C
  17.          rEip         PVOID ?   ; + 0x30
  18.          rCs            ULONG ?    ; + 0x34
  19.          rEFlags          DWORD ? ; + 0x38
  20.          rEsp         PVOID ?   ; + 0x3C
  21.          rSs            ULONG ?    ; + 0x40
  22.          rEs            ULONG ?
  23.          rDs            ULONG ?
  24.          rFs            ULONG ?
  25.          rGs            ULONG ?
  26. IRET_FRAME ends
  27. PIRET_FRAME typedef ptr IRET_FRAME
  28.  
  29. ; pushad
  30. ;
  31. RGP struct
  32. rEdi         DWORD ?
  33. rEsi         DWORD ?
  34. rEbp         DWORD ?
  35. rEsp         DWORD ?
  36. rEbx         DWORD ?
  37. rEdx         DWORD ?
  38. rEcx         DWORD ?
  39. rEax         DWORD ?
  40. RGP ends
  41. PRGP typedef ptr RGP
  42.  
  43. VFRAME struct
  44.          Rgp         RGP <>
  45.          rFs         ULONG ?         ; + 0x20
  46.          rEs         ULONG ?         ; + 0x24
  47.          rDs         ULONG ?         ; + 0x28
  48.          Ir           IRET_FRAME <>         ; + 0x2C
  49. VFRAME ends
  50. PVFRAME typedef ptr VFRAME
  51.  
  52. .data
  53. TscLo    ULONG ?     ; D109E0
  54. TscHi    ULONG ?     ; D109E4
  55. pKiTrap01         PVOID ? ; D109EC
  56. pKiTrap0D         PVOID ? ; D10A00
  57.  
  58. .code
  59. ; #GP
  60. ;
  61. GP_TRAP proc C
  62.          push    ds
  63.          push    es
  64.          push    fs
  65.          pushad
  66.          
  67.          mov ax,KGDT_R3_DATA or RPL_MASK
  68.          mov ds,ax
  69.          mov es,ax
  70.          
  71.          mov ax,KGDT_R0_PCR
  72.          mov fs,ax
  73.          
  74.          test VFRAME.Ir.rCs[esp],RPL_MASK
  75.          .if Zero?
  76.                  popa
  77.                  pop fs
  78.                  pop es
  79.                  pop ds
  80.                  jmp pKiTrap0D
  81.          .endif
  82.          
  83.          mov eax,VFRAME.Ir.rEip[esp]
  84.          invoke LPFX, Eax
  85.          add eax,VFRAME.Ir.rEip[esp]
  86.          cmp W[eax],310FH ; Rdtsc
  87.          jne loc_105D7
  88.          add eax,2
  89.          mov VFRAME.Ir.rEip[esp],eax
  90.          rdtsc
  91.          and eax,0FFH
  92.          add eax,dword_109E8
  93.          add TscLo,eax
  94.          .if Carry?
  95.                  inc TscHi
  96.          .endif
  97.          push edi
  98.          sidt F[esp - 2]  ; Limit[16]: Base[32]
  99.          pop edi ; IDT base.
  100.          lea edi,[edi + 8]         ; #DB
  101.  
  102.          mov ax,W[edi + 6]         ; Offset [31 % 16]
  103.          shl eax,16
  104.          mov ax,W[edi]       ; Offset [15 % 0]
  105.          mov pKiTrap01,eax
  106.          popa
  107.          mov eax,TscLo
  108.          mov edx,TscHi
  109.          pop fs
  110.          pop es
  111.          pop ds
  112.          add esp,IRET_FRAME.rEip   ; ~ Error code.
  113.          test IRET_FRAME.rEFlags[esp - 4],EFLAGS_TF
  114.          .if Zero?
  115.                  iret
  116.          .endif
  117.          jmp pKiTrap01
  118. GP_TRAP endp
  119.  
  120. LPFX proc Ip:PVOID
  121.          mov edx,Ip
  122.          xor eax,eax
  123. @@:
  124.          mov cl,B[edx]
  125.          .if (Cl == PREFIX_ES) \
  126.          || (Cl == PREFIX_CS) \
  127.          || (Cl == PREFIX_SS) \
  128.          || (Cl == PREFIX_DS) \
  129.          || (Cl == PREFIX_FS) \
  130.          || (Cl == PREFIX_GS) \
  131.          || (Cl == PREFIX_DATA_SIZE) \
  132.          || (Cl == PREFIX_ADDR_SIZE) \
  133.          || (Cl == PREFIX_LOCK) \
  134.          || (Cl == PREFIX_REPNZ) \
  135.          || (Cl == PREFIX_REP)
  136.                  inc eax
  137.                  inc edx
  138.                  jmp @b
  139.          .endif
  140.          ret
  141. LPFX endp


Бсодогенератор

На границе страницы генерим #GP и всё должно слететь. Да и префиксы необходимо считать. Также есно что не обязательно база сегмента нулевая..




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 05 ноября 2013 16:08
· Личное сообщение · #12

Зачем префиксы считать? Для перевала за 15 байтов? Тогда уже не GP будет.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 05 ноября 2013 18:06 · Поправил: Dr0p
· Личное сообщение · #13

Archer

Lock rdtsc приведёт к #UD. Или например 15 префиксов тоже. Годный детектор эмуляции.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 05 ноября 2013 18:21
· Личное сообщение · #14

И? А зачем в данном коде префиксы необходимо считать, если это обработчик только GP?




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 06 ноября 2013 01:03
· Личное сообщение · #15

Archer

Чтобы небыло детекта и синева. Понимаешь ?

Да и вообще за такой код руки отрезать надо, по самые яйца.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 06 ноября 2013 09:35
· Личное сообщение · #16

В каком именно случае тут будет детект и синево без подсчёта префиксов? В случае UD сработает UD, а данный код управления не получит, зачем ему считать префиксы? Я согласен, что будет синька на границе страницы. И согласен, что не учитывается база сегмента. Но зачем считать префиксы?




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 06 ноября 2013 12:14 · Поправил: Dr0p
· Личное сообщение · #17

Archer

try
db F0 0F 31
except

Вот и детект. "#UD If the LOCK prefix is used".

Обработка должна быть такой:
Code:
  1. SEL_TABLE_MASK    equ 100B
  2.  
  3. DESCRIPTOR_TABLE_ENTRY struct
  4. Selector          ULONG ?
  5. Descriptor        DWORD 2 DUP (?) ; LDT_ENTRY
  6. DESCRIPTOR_TABLE_ENTRY ends
  7. PDESCRIPTOR_TABLE_ENTRY typedef ptr DESCRIPTOR_TABLE_ENTRY
  8.  
  9. ; +
  10. ; Трансляция логического адреса в линейный.
  11. ;
  12. ; o Code segment!
  13. ;
  14. ; OUT:
  15. ; Eax: base, Ecx: limit(last byte addr).
  16. ;
  17. LogicToLinear proc pNtQueryInformationThread:PVOID, Selector:ULONG, SegOffset:ULONG
  18. Local T:DESCRIPTOR_TABLE_ENTRY
  19.          mov eax,Selector
  20.          xor ecx,ecx
  21.          .if Eax == KGDT_R3_CODE or RPL_MASK         ; Default, fast.
  22.                  mov eax,SegOffset
  23.                  dec ecx
  24.                  jmp Exit
  25.          .endif
  26.          lea edx,T
  27.          mov T.Selector,eax
  28.          push ecx
  29.          push sizeof(DESCRIPTOR_TABLE_ENTRY)
  30.          push edx
  31.          push ThreadDescriptorTableEntry
  32.          push NtCurrentThread
  33.          Call pNtQueryInformationThread
  34.          test eax,eax
  35.          mov ecx,D T.Descriptor[4]
  36.          jnz Fail
  37.          and ecx,1111100000000000B ; P, DPL, S, TYPE[1XXX]
  38.          mov eax,D T.Descriptor[0]
  39.          cmp ecx,1111100000000000B
  40.          mov edx,D T.Descriptor[4]
  41.          jne Fail
  42.          shrd eax,edx,16
  43.          shld eax,edx,8
  44.          movzx ecx,W T.Descriptor[0]
  45.          ror eax,8        ; Base
  46.          and edx,11110000000000000000B
  47.          or ecx,edx       ; Limit
  48.          bt D T.Descriptor[4],23   ; G
  49.          .if !Carry?      ; Bytes
  50.                  cmp SegOffset,ecx
  51.                  ja Fail         ; Offset > Limit
  52.          .else
  53.                  shl ecx,12
  54.                  or ecx,(X86_PAGE_SIZE - 1)
  55.                  cmp SegOffset,ecx
  56.                  ja Fail
  57.          .endif
  58.          add ecx,eax
  59.          .if Carry?
  60. Fail:
  61.                  xor eax,eax
  62.                  xor ecx,ecx
  63.          .else
  64.                  add eax,SegOffset
  65.          .endif
  66. Exit:
  67.          ret
  68. LogicToLinear endp


Code:
  1.          mov eax,D[ebp + 3*4]
  2.          assume eax:PMMVALIDATION
  3.          mov ecx,[eax].Ip
  4.          mov esi,[eax].Limit
  5.          mov edi,15
  6.          .repeat
  7.                  cmp ecx,esi
  8.                  jnb Epilog
  9.                  mov dl,B[ecx]
  10.                  .if Dl == 0FH
  11.                         cmp B[ecx + 1],31H
  12.                         jne Epilog
  13.                         mov [eax].Result,ecx
  14.                         jmp Epilog
  15.                  .endif
  16.                  cmp dl,PREFIX_LOCK
  17.                  je Epilog
  18.                  cmp dl,PREFIX_ES
  19.                  je Next
  20.                  cmp dl,PREFIX_CS
  21.                  je Next
  22.                  cmp dl,PREFIX_SS
  23.                  je Next
  24.                  cmp dl,PREFIX_DS
  25.                  je Next
  26.                  cmp dl,PREFIX_FS
  27.                  jb Next
  28.                  cmp dl,PREFIX_ADDR_SIZE
  29.                  jbe Next
  30.                  cmp dl,PREFIX_REPNZ
  31.                  je Next
  32.                  cmp dl,PREFIX_REP
  33.                  jne Epilog
  34.          Next:
  35.                  inc ecx
  36.                  dec edi
  37.          .until Zero?
  38. Epilog:


Code:
  1. Tsc:
  2.          movzx eax,W[esi].rCs
  3.          push [esi].rEip
  4.          push eax
  5.          push [ebx].Rtl.pNtQueryInformationThread
  6. ; Umode
  7.          Call LogicToLinear
  8.          mov edx,[ebx].Rtl.pMmUserProbeAddress
  9.          test eax,eax
  10.          mov edx,D[edx]
  11.          jz Chain
  12.          cmp eax,edx
  13.          jnb Chain
  14.          lea edx,[ebx].Sh
  15.          invoke IsRdtsc, [Ebx].Rtl.pRtlNtStatusToDosError, Edx, Eax, Ecx
  16.          test eax,eax
  17.          jz Chain
  18.          add eax,2
  19. ; Rdtsc
  20.          mov [edi].rEip,eax
  21.          rdtsc
  22.          mov [edi].rEax,eax
  23.          mov [edi].rEdx,edx
  24.          jmp Load





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 06 ноября 2013 12:34
· Личное сообщение · #18

В аттаче модифицированный(добавлена обработка тск) сиде мотор.

PEB TEB RESULT
0 X Handled
1 0 #PRIV_INSTR, Filter()
1 1 Handled

Initialize prto NtImageBase:PVOID, Flags:DWORD

PEB_DBG_FLAG equ X86_PAGE_SIZE - 4
TEB_DBG_FLAG equ X86_PAGE_SIZE - 4

FLG_T0 000001B Сервисы ядра.
FLG_T10 000010B Сервисы ядра для GUI.
FLG_T11 000100B Сервисы шадова.
FLG_STPT 001000B STPT KDR.
FLG_TF 010000B FSTATEX(сброс TF). Не юзать в данном билде!
FLG_TSC 100000B Монитор TSC.

FSTATE struct
Ip PVOID ?
Args PVOID ?
FSTATE ends

Filter:
mov edx,0BADC0DEH
Int 2EH

3b6b_06.11.2013_EXELAB.rU.tgz - SIDE.obj




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 09 ноября 2013 00:20 · Поправил: Dr0p
· Личное сообщение · #19

Вот готовое




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 15 ноября 2013 00:17
· Личное сообщение · #20

Доделал патч. Задаётся лимит числа инструкций(rdtsc), по достижению лимита инструцкия в памяти модифицируется и далее уже нет тормозных фолтов. Единственный минут - ограничение на число инструкций(52) и память в нулях становится читаемой.



f9cd_15.11.2013_EXELAB.rU.tgz - Dll.zip

| Сообщение посчитали полезным: ajax


Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 15 ноября 2013 00:18 · Поправил: Dr0p
· Личное сообщение · #21

Вот принцип:


d95c_15.11.2013_EXELAB.rU.tgz - FastTsc.png


 [email protected] —› Программирование —› TSC.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати