Сейчас на форуме: tyns777 (+4 невидимых)

 eXeL@B —› Программирование —› Возврат в KiUserExceptionDispatcher из ISR
Посл.ответ Сообщение


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 03 августа 2010 14:19
· Личное сообщение · #1

Привет всем добрым людям, вопрос следующего характера: недавно дебажил какой-то Хасповский драйвер, перехватывающий _KiTrap06. Для тех, кто не повторял такие подвиги, скажу, что периодически приложение, защищённое хаспом (правда, справедливо для старых версий) генерит исключение Invalid Opcode, которое перехватывается хасповским дровом, далее идёт работа с ключом (но нам сейчас это неинтересно), а потом происходит возврат из исключения банально через IRET. НО! При таком раскладе исключение не разворачивается в юзермоде. Т.е. для NT-систем не происходит передачи управления на KiUserExceptionDispatcher. Скажите, люди добрые, как можно обработать исключение (или прерывание, думаю, тут не принципиально) так, чтоб возврат в вышеупомянутую юзермодную функцию всё-таки осуществился?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 03 августа 2010 14:28
· Личное сообщение · #2

Сделать свой драйвер и ловить (через хук) KiDispatchException




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 03 августа 2010 14:41
· Личное сообщение · #3

А как же его ловить, если он, собственно, и не вызывается? Может, его надо как-то вызывать? Сейчас вписал в гугль "KiDispatchException" и получил всё, кроме того, что нужно (( Тут, по-хорошему, прототипчик бы помог и IRQL, на котором это вызывается, или какая-то ссылочка толковая...

-----
Stuck to the plan, always think that we would stand up, never ran.




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

Создано: 03 августа 2010 14:46
· Личное сообщение · #4

wrk




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 03 августа 2010 14:55
· Личное сообщение · #5

n0name
А там (в этих долбаных мегабайтах кода) оно всё есть? А то я прямо сейчас не могу проверить...

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 03 августа 2010 15:00
· Личное сообщение · #6

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




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

Создано: 03 августа 2010 15:03
· Личное сообщение · #7

Лучше скажи, что для чего надо. Проще снять хук, может?
Вообще странно несколько, как они работают с кодом, который патчит ядро. И как на это смотрит х64 с патчгардом и подписью дров.



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

Создано: 03 августа 2010 16:16
· Личное сообщение · #8

Code:
  1.  
  2. VOID
  3. KiDispatchException (
  4.     IN PEXCEPTION_RECORD ExceptionRecord,
  5.     IN PKEXCEPTION_FRAME ExceptionFrame,
  6.     IN PKTRAP_FRAME TrapFrame,
  7.     IN KPROCESSOR_MODE PreviousMode,
  8.     IN BOOLEAN FirstChance
  9.     )
  10.  
  11. /*++
  12.  
  13. Routine Description:
  14.  
  15.     This function is called to dispatch an exception to the proper mode and
  16.     to cause the exception dispatcher to be called. If the previous mode is
  17.     kernel, then the exception dispatcher is called directly to process the
  18.     exception. Otherwise the exception record, exception frame, and trap
  19.     frame contents are copied to the user mode stack. The contents of the
  20.     exception frame and trap are then modified such that when control is
  21.     returned, execution will commense in user mode in a routine which will
  22.     call the exception dispatcher.
  23.  
  24. Arguments:
  25.  
  26.     ExceptionRecord - Supplies a pointer to an exception record.
  27.  
  28.     ExceptionFrame - Supplies a pointer to an exception frame. For NT386,
  29.         this should be NULL.
  30.  
  31.     TrapFrame - Supplies a pointer to a trap frame.
  32.  
  33.     PreviousMode - Supplies the previous processor mode.
  34.  
  35.     FirstChance - Supplies a boolean value that specifies whether this is
  36.         the first (TRUE) or second (FALSE) chance for the exception.
  37.  
  38. Return Value:
  39.  
  40.     None.
  41.  
  42. --*/




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

Создано: 03 августа 2010 16:38 · Поправил: V0ldemAr
· Личное сообщение · #9

Вызов KeUserExceptionDispatcher будет тогда если исключение небыло обработано в кернел моде вы же сами сказали что хасп драйвер хучит int6 и возвращается через IRET из этого логично предположить что KiDispatchException небудет вызвано. Как вариант вызовите свое int6 исключение и отследите как хасп это обработает должен впринцыпе передать управление ISR в ntoskrnl. (только не ставте бряк на первую инструкцию так как отладчик свалится)

Archer пишет:
И как на это смотрит х64 с патчгардом и подписью дров.

Неработает т.е. непотдерживается... большинство старых донгл защит только x86



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

Создано: 03 августа 2010 18:04
· Личное сообщение · #10

ARCHANGEL
> При таком раскладе исключение не разворачивается в юзермоде.
Фолт доставляется в лузермод если он возник в нём и не обработан ядром или отладчиком.
> возврат из исключения банально через IRET.
Это делается средствами Kei386EoiHelper().




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 03 августа 2010 22:18
· Личное сообщение · #11

Sources of UCL's Hasp emulator driver. Fixed to compile and work under Win2K. No binaries included. Provided to educational purposes only!

mamaich.uni.cc/files/MeteoFixed.rar

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




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

Создано: 03 августа 2010 22:53 · Поправил: Clerk
· Личное сообщение · #12

mak
Там внесистемный трап процессинг, за который автору руки отсечь. Конечно можно поступить как предложил Грейт(использовать KINTERRUPT), вот только это не решит проблему - ENTER_INTERRUPT макро инициирует цепочку сех, изза этого исключения возникающий в этом хэндлере не будут обрабатываться сех, так как цепочка сех предыдущего ISR завершена.
Необходимо сформировать код формирующий трап фрейм, после чего могут быть размаскированы прерывания и использоваться сех и подкачиваемая память. А код этот различен в версиях, хотя не проблема некоторые необходимые смещения найти вручную.
Тут http://files.virustech.org/indy/Code/XcptIp/ лежит семпл по теме:
Code:
  1. ; Надстройка выполняет обработку #UD, возникшего в U-mode. Об
  2. ; рабатывается инструкция Ud2(0F0B) без префиксов: Eax - соде
  3. ; ржит ссылку на инструкцию. Длина этой инструкции определяет
  4. ; ся и возвращается в регистре Eax. При обнаружении инвалидно
  5. ; й ссылки в юзермоде разворачивается #STATUS_ILLEGAL_INSTRUC
  6. ; TION(можно изменить код на #AV).






Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 04 августа 2010 16:27
· Личное сообщение · #13

он достаточно старый сам по себе, писался давно, как бы не было думаю поможет Архангелу внести немного ясности в вопрос, тем более непострадественно с хаспом работают, тему по перехвату 6 инта как то тут заводил Hook & Revers int 6 , но задача была специфична, да и тема далеко не пошла. Поэтому мне кажется если сам не разберешься то дело туго ... а подсмотреть было бы классно

Интересно , нужно глянуть твой код =)

ПС. Не знаю куда ты ложишь свои работы на народ или виртех, но на народе нет такой расфасовки классной как на вир техе) в плане удобства.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




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

Создано: 04 августа 2010 17:03 · Поправил: Clerk
· Личное сообщение · #14

mak
Так всё просто, даже если ISR свои ставить.
Исключение разворачивается системой как и сказали выше в KiDispatchException(). Но она не экспортируется, а при трап-процессинге ядро использует стабы для неё, это CommonDispatchExceptionXX(). Они также не экспортируются, но поиск их очень прост:
Code:
  1. ;++
  2. ;
  3. ; CommonDispatchException
  4. ;
  5. ; Routine Description:
  6. ;
  7. ; This routine allocates exception record on stack, sets up exception
  8. ; record using specified parameters and finally sets up arguments
  9. ; and calls _KiDispatchException.
  10. ;
  11. ; NOTE:
  12. ;
  13. ; The purpose of this routine is to save code space. Use this routine
  14. ; only if:
  15. ; 1. ExceptionRecord is NULL
  16. ; 2. ExceptionFlags is 0
  17. ; 3. Number of parameters is less or equal than 3.
  18. ;
  19. ; Otherwise, you should use DISPATCH_EXCEPTION macro to set up your special
  20. ; exception record.
  21. ;
  22. ; Arguments:
  23. ;
  24. ; (eax) = ExcepCode - Exception code to put into exception record
  25. ; (ebx) = ExceptAddress - Addr of instruction which the hardware exception occurs
  26. ; (ecx) = NumParms - Number of additional parameters
  27. ; (edx) = Parameter1
  28. ; (esi) = Parameter2
  29. ; (edi) = Parameter3
  30. ;
  31. ; Return Value:
  32. ;
  33. ; None.
  34. ;
  35. ;--
  36. CommonDispatchException0Args:
  37.         xor     ecx, ecx                ; zero arguments
  38.         call    CommonDispatchException
  39.  
  40. CommonDispatchException1Arg0d:
  41.         xor     edx, edx                ; zero edx
  42. CommonDispatchException1Arg:
  43.         mov     ecx, 1                  ; one argument
  44.         call    CommonDispatchException ; there is no return
  45.  
  46. CommonDispatchException2Args0d:
  47.         xor     edx, edx                ; zero edx
  48. CommonDispatchException2Args:
  49.         mov     ecx, 2                  ; two arguments
  50.         call    CommonDispatchException ; there is no return
  51.  
  52.       public CommonDispatchException
  53. align dword
  54. CommonDispatchException proc
  55. cPublicFpo 0, ExceptionRecordLength/4
  56. ;
  57. ; Set up exception record for raising exception
  58. ;
  59.  
  60.         sub     esp, ExceptionRecordLength
  61.                                         ; allocate exception record
  62.         mov     dword ptr [esp]+ErExceptionCode, eax
  63.                                         ; set up exception code
  64.         xor     eax, eax
  65.         mov     dword ptr [esp]+ErExceptionFlags, eax
  66.                                         ; set exception flags
  67.         mov     dword ptr [esp]+ErExceptionRecord, eax
  68.                                         ; set associated exception record
  69.         mov     dword ptr [esp]+ErExceptionAddress, ebx
  70.         mov     dword ptr [esp]+ErNumberParameters, ecx
  71.                                         ; set number of parameters
  72.         cmp     ecx, 0
  73.         je      short de00
  74.  
  75.         lea     ebx, [esp + ErExceptionInformation]
  76.         mov     [ebx], edx
  77.         mov     [ebx+4], esi
  78.         mov     [ebx+8], edi
  79. de00:
  80. ;
  81. ; set up arguments and call _KiDispatchException
  82. ;
  83.  
  84.         mov     ecx, esp                ; (ecx)->exception record
  85.  
  86. .errnz (EFLAGS_V86_MASK AND 0FF00FFFFh)
  87.         test    byte ptr [ebp]+TsEFlags+2,EFLAGS_V86_MASK/010000h
  88.         jz      short de10
  89.  
  90.         mov     eax,0FFFFh
  91.         jmp     short de20
  92.  
  93. de10:   mov     eax,[ebp]+TsSegCs
  94. de20:   and     eax,MODE_MASK
  95.  
  96. ; 1 - first chance TRUE
  97. ; eax - PreviousMode
  98. ; ebp - trap frame addr
  99. ; 0 - Null exception frame
  100. ; ecx - exception record addr
  101.  
  102.         stdCall _KiDispatchException,<ecx, 0, ebp, eax, 1>
  103.  
  104.         mov     esp, ebp                ; (esp) -> trap frame
  105.         jmp     _KiExceptionExit
  106.  
  107. CommonDispatchException endp

trap.asm, модель вызова не меняется в версиях. В кодосекции ядра ищется код [CommonDispatchException0Args % CommonDispatchException] используя маску для процедурных ветвлений. Отсюда можно найти KiDispatchException(), хотя стабов достаточно.
-
Второй способ доставить фолт в лузермод - непосредственно переход по нужному вектору в IDT. Очищается текущий ядерный стек(пользовательский переключается на него из TSS.Esp0, он уже переключен в ISR) и формируется на его дне IRET-фрейм, после чего выполняется переход по нужному вектору в IDT(например на KiTrap0E для #PF), просто извлекая адрес для перехода из соответствующего дескриптора.
-
Только вот как и говорил вся проблема в формировании трап-фрейма.


 eXeL@B —› Программирование —› Возврат в KiUserExceptionDispatcher из ISR
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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