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

 eXeL@B —› Основной форум —› Что за антиотладка?
Посл.ответ Сообщение


Ранг: 238.8 (наставник), 67thx
Активность: 0.20
Статус: Участник
CyberHunter

Создано: 26 января 2009 23:05
· Личное сообщение · #1

Господа, объясните принцип работы следующего кода:

Code:
  1. 00438000    55                         PUSH EBP
  2. 00438001    8BEC                     MOV EBP,ESP
  3. 00438003    83EC 48                SUB ESP,48
  4. 00438006    56                         PUSH ESI
  5. 00438007    57                         PUSH EDI
  6. 00438008    64:A1 30000000  MOV EAX,DWORD PTR FS:[30]
  7. 0043800E    8B70 08               MOV ESI,DWORD PTR DS:[EAX+8]
  8. 00438011    8975 E0               MOV DWORD PTR SS:[EBP-20],ESI
  9. 00438014    8B40 0C               MOV EAX,DWORD PTR DS:[EAX+C]
  10. 00438017    8B40 1C               MOV EAX,DWORD PTR DS:[EAX+1C]
  11. 0043801A    8B00                    MOV EAX,DWORD PTR DS:[EAX]
  12. 0043801C    8B40 08              MOV EAX,DWORD PTR DS:[EAX+8]
  13. 0043801F    8945 E4               MOV DWORD PTR SS:[EBP-1C],EAX
  14. 00438022    64:A1 18000000  MOV EAX,DWORD PTR FS:[18]
  15. 00438028    8360 34 00          AND DWORD PTR DS:[EAX+34],0
  16. 0043802C    C745 F8 7882430>MOV DWORD PTR SS:[EBP-8],438278
  17. 00438033    8B45 F8                 MOV EAX,DWORD PTR SS:[EBP-8]
  18. 00438036    8B40 63                 MOV EAX,DWORD PTR DS:[EAX+63]
  19. 00438039    8945 F4                 MOV DWORD PTR SS:[EBP-C],EAX
  20. 0043803C    CD 2C           INT 2C ; Исключения не возникает! Под отладкой и без возвращает разные значения регистров.
  21. 0043803E    57              PUSH EDI
  22. 0043803F    5F              POP EDI
  23. 00438040    33C0            XOR EAX,EAX
  24. 00438042    8A02            MOV AL,BYTE PTR DS:[EDX] ; Т.о. в EDX получается не то что ожидали, вычисления идут неверные!
  25. 00438044    8845 EF         MOV BYTE PTR SS:[EBP-11],AL
  26. 00438047    0F6EF0          MOVD MM6,EAX
  27. 0043804A    0F73D6 02       PSRLQ MM6,2
  28. 0043804E    0F7EF0          MOVD EAX,MM6


Данный код встретился на пинче (прикрепил в аттаче) так что аккуратнее!

Впринципе методом изъебств, я уже добралсо до OEP, но хотелось бы точно знать что происходит в этом коде и почему.

2ae4_26.01.2009_CRACKLAB.rU.tgz - pinch.rar

-----
Nulla aetas ad discendum sera




Ранг: 42.1 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 27 января 2009 00:09
· Личное сообщение · #2

Старый трюк с int 2C. Читай анализ: zairon.wordpress.com/2007/12/19/beware-of-int-2c-instruction/



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

Создано: 27 января 2009 00:22 · Поправил: Clerk
· Личное сообщение · #3

Прерывание 0x2C.
Имя KiSetLowWaitHighThread - неверный сервис, всегда возвращает ошибку STATUS_NO_EVENT_PAIR.
Антитрассировка основана на следующей особенности. На стороне ядра для возвращения в юзермод из данного прерывания используется известная функция KiServiceExit().
Последняя юзается к примеру для возврата из сервиса.

_KiSystemCallExit:
iretd ; return
_KiSystemCallExit2:
test dword ptr [esp+8], EFLAGS_TF
jne short _KiSystemCallExit
pop edx ; pop EIP
add esp, 4 ; Remove CS
and dword ptr [esp], NOT EFLAGS_INTERRUPT_MASK ; Disable interrupts in the flags
popfd
pop ecx ; pop ESP
sti ; sysexit does not reload flags
sysexit

Особенность в том, что если вход в прерывание/sysenter исполняется с взведённым TF, то выполняется в ядре проверка, если трассировка не исполняется, то регистр Edx содержит указатель на адрес возврата в юзермод, это для sysenter экспорт KiFastSystemCallRet(), для Int это адрес следующей инструкции. Регистр Ecx содержит указатель на стек, значение это было при входе в прерывание в регистре Esp, для Sysenter в регистре Edx.
Если TF был взведён, то регистры перед возвратом не восстанавливаются, а перед этим в них закружаются значения:
В регистр Ecx загружаются четыре байта начиная с ETHREAD.PreviousMode, по дефолту там 0x101.
В регистр Edx загружается указатель на сех, но так как он не установлен там будет -1.
В приведённом коде видно как выполняется возврат.

С учётом сказанного значения регистров по возврату из данного прерывания.
Если TF сброшен:
> Eax = STATUS_NO_EVENT_PAIR
> Ecx = Esp
> Edx = Eip + 2
Если TF взведён:
> Eax = STATUS_NO_EVENT_PAIR
> Ecx = 0x101(DWORD [ETHREAD.PreviousMode])
> Edx = -1

Соответственно далее, если трассировки нет, то инструкция MOV AL,BYTE PTR DS:[EDX] загрузит в регистр Al опкод PUSH EDI, это 0x57.
Иначе, если трассировка выполняется будет сгенерировано исключение с кодом STATUS_ACCESS_VIOLATION.
У данного способа один минус – нужно было автору его использовать не push edi, а pushfd, что далобы возможность дополнительной проверки по EFLAGS.TF. Проверка сводится к отлову не только трассировки, но и обнаружения точки останова после Int.




Ранг: 238.8 (наставник), 67thx
Активность: 0.20
Статус: Участник
CyberHunter

Создано: 27 января 2009 00:30
· Личное сообщение · #4

Вот спасибо Теперь все прояснилось!

-----
Nulla aetas ad discendum sera



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


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