Сейчас на форуме: laslo, UniSoft, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Обработка memory (и не только) break'ов с помощью VEH
<< . 1 . 2 . 3 .
Посл.ответ Сообщение

Ранг: 7.7 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 ноября 2011 21:43 · Поправил: GoldenJoe
· Личное сообщение · #1


Как я себе это представляю:
1. Прога ставит бряки и внедряет либу в процесс-жертву
2. Либа устанавливает VEH
3. Когда возникает исключение, прога должна каким-то образом получить от внедренной DLL-ки EXCEPTION_RECORD с кодом исключения и прочей инфой. Прога должна проверить, а наш ли это бряк (а, может, совсем даже не бряк ) и неведомым образом сообщить внедренной либе, что делать дальше (CONTINUE_SEARCH или CONTINUE_EXECUTION вернуть, например).

По первым двум пунктам вопросов нет. С 3 пунктом посложнее. Есть именованный FileMapping да event-ы, есть сокеты. А КРАСИВЫХ решений, я так понимаю, нет?



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

Создано: 19 ноября 2011 20:16
· Личное сообщение · #2

PE_Kill пишет:
мне пох

мне тож. только ваш срач насчет детекта с клеркой шел ведь не за юзермод.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 19 ноября 2011 20:24 · Поправил: PE_Kill
· Личное сообщение · #3

PE_Kill пишет:
Дальше пошло нереализуемое в юзермоде гавно.

Как видишь с точностью до наоборот. Я никогда не лезу в ядро, поэтому в принципе его не обсуждаю.

ЗЫ А че так вм то всех заинтересовала?

-----
Yann Tiersen best and do not fuck




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

Создано: 19 ноября 2011 20:30
· Личное сообщение · #4

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



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

Создано: 19 ноября 2011 20:37
· Личное сообщение · #5

бональный кодеc
wbinvd
push 12345678
invd
cmp [esp],12345678
je vm
палит все вм



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 19 ноября 2011 20:53 · Поправил: HiEndsoft
· Личное сообщение · #6

spinz пишет:
бональный кодеc

однако r0, где бональнее можно извратиться

-----
продавец резиновых утёнков




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

Создано: 19 ноября 2011 20:54
· Личное сообщение · #7

HiEndsoft пишет:
однако r0

сосредоточьтесь. я говорил что едро



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

Создано: 19 ноября 2011 21:04 · Поправил: spinz
· Личное сообщение · #8

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



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

Создано: 19 ноября 2011 21:09
· Личное сообщение · #9

spinz пишет:
wbinvd
push 12345678
invd
cmp [esp],12345678
je vm

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



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

Создано: 19 ноября 2011 22:11
· Личное сообщение · #10

spinz пишет:
бональный кодеcwbinvdpush 12345678invdcmp [esp],12345678je vmпалит все вм

И с вероятностью 1/5 вешает хост систему или роняет ее в бсод. Только что проверено.
Проверялось на драйвере содержащем следующий код:

Code:
  1. .text:0000000000011000 IsVM            proc near               ; CODE XREF: DriverEntry+4p
  2. .text:0000000000011000
  3. .text:0000000000011000
  4. .text:0000000000011000                 xor     rax, rax
  5. .text:0000000000011003                 cli
  6. .text:0000000000011004                 wbinvd
  7. .text:0000000000011006                 push    12345678h
  8. .text:000000000001100B                 invd
  9. .text:000000000001100D                 cmp     dword ptr [rsp], 12345678h
  10. .text:0000000000011014                 setz    al
  11. .text:0000000000011017                 add     rsp, 8
  12. .text:000000000001101B                 sti
  13. .text:000000000001101C                 retn
  14. .text:000000000001101C IsVM            endp
  15. .text:000000000001101C
  16. .text:000000000001101C ; ---------------------------------------------------------------------------
  17. .text:000000000001101D                 align 20h
  18. .text:0000000000011020
  19. .text:0000000000011020 ; =============== S U B R O U T I N E =======================================
  20. .text:0000000000011020
  21. .text:0000000000011020
  22. .text:0000000000011020 ; NTSTATUS __stdcall DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
  23. .text:0000000000011020                 public DriverEntry
  24. .text:0000000000011020 DriverEntry     proc near               ; DATA XREF: .pdata:ExceptionDiro
  25. .text:0000000000011020                 sub     rsp, 28h
  26. .text:0000000000011024                 call    IsVM
  27. .text:0000000000011029                 lea     rcx, Format     ; "IsVM() == %d\n"
  28. .text:0000000000011030                 mov     edx, eax
  29. .text:0000000000011032                 call    DbgPrint_0
  30. .text:0000000000011037                 mov     eax, 0C0000001h
  31. .text:000000000001103C                 add     rsp, 28h
  32. .text:0000000000011040                 retn
  33. .text:0000000000011040 DriverEntry     endp

Точная причина не ясна, но ясно что инвалидация кэша бесследно не проходит и так делать нельзя. Возможно инвалидируются внешние кэши других процессоров, возможно инвалидация асинхронна, надо читать мануалы и пробовать. По-любому получается этот код в 5 строчек не уложится.

-----
PGP key <0x1B6A24550F33E44A>




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

Создано: 19 ноября 2011 22:31
· Личное сообщение · #11

ntldr пишет:
Точная причина не ясна, но ясно что инвалидация кэша бесследно не проходит и так делать нельзя.

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



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

Создано: 19 ноября 2011 22:35
· Личное сообщение · #12

в любом случае идея прозрачна. и она не эмулируется практически. допили под несколько ядер и это будет работать на любой вм



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

Создано: 19 ноября 2011 23:06
· Личное сообщение · #13

подскажу даже куда копать. между wbinvd и invd другое едро производит операцию с памятью, допустим обыный call. после invd стек невалиден. надо, очевидно тормозить другие ядра. непросто, но универсально




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

Создано: 19 ноября 2011 23:09
· Личное сообщение · #14

Узри ты уже правку то, наконец.



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

Создано: 19 ноября 2011 23:19
· Личное сообщение · #15

Спс, за оценку зрения. читать не разучился. а вот читать коменты разучился, ибо их нет. нтлдр задает грамотные вопросы, остальные видимо просто не поняли суть



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

Создано: 19 ноября 2011 23:51
· Личное сообщение · #16

Сделал синхронизацию:

Code:
  1. extern int IsVM();
  2.  
  3. static volatile long in_lock;
  4. static volatile long out_lock;
  5.  
  6. static ULONG_PTR IpiCallFunc( IN ULONG_PTR  Argument )
  7. {
  8.          _InterlockedDecrement(&in_lock);
  9.          while (in_lock);
  10.  
  11.          if (KeGetCurrentProcessorNumber() == 0)
  12.          {
  13.                  DbgPrint("IsVM() == %d\n", IsVM());
  14.                  KeStallExecutionProcessor(50);
  15.                  out_lock = 1;
  16.          }
  17.          while (out_lock == 0);
  18.  
  19.          return 0;
  20. }
  21.  
  22.  
  23. NTSTATUS DriverEntry(DRIVER_OBJECT *drv_obj, UNICODE_STRING *reg_path)
  24. {
  25.          in_lock = KeQueryActiveProcessorCount(NULL);
  26.          KeIpiGenericCall(IpiCallFunc, 0);
  27.  
  28.          return STATUS_UNSUCCESSFUL;
  29. }

Теперь работает стабильно, но не различает host и guest для Microsoft Hyper-V (на хосте IsVM() == 1). Дело в том что гиперв запускает хост внутри гипервизора и многие методы детекта аппаратного гипервизора дают фолс. Есть идеи как их различить?

-----
PGP key <0x1B6A24550F33E44A>




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

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

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



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

Создано: 20 ноября 2011 22:14
· Личное сообщение · #18

spinz пишет:
т.е. в отдельных случаях надо отличать где хост-винда, а где гипервизор

Обязательно надо. Фолс-детекты недопустимы, лучше пропустить какую-нибудь вм чем зафолсить на Hyper-V сервере. Будут идеи как сделать надежный детект без обращения к гиперв через WMI?

-----
PGP key <0x1B6A24550F33E44A>




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

Создано: 22 ноября 2011 00:05
· Личное сообщение · #19

На ум пока приходят 2 пути
1) Как то заюзать тот факт, что хосту разрешен direct i/o. Идеи есть, проверить пока не на чем.
2) В госте не эмулится unreal mode, можно использовать это для детекта. Правда инфа старая и не проверенная.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 23 ноября 2011 22:25
· Личное сообщение · #20

Всёже есть решение 2.3, хотябы чисто гипотетическое ?

spinz
Вот вы вернулись к ответу выше - использовать I/O. Апик эмулится наверно всем чем тока можно. Вдобавок не следует забывать про непосредственное исполнение кода на камне, как в варе.


<< . 1 . 2 . 3 .
 eXeL@B —› Программирование —› Обработка memory (и не только) break'ов с помощью VEH
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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