Сейчас на форуме: Magister Yoda (+3 невидимых) |
eXeL@B —› Основной форум —› Что за антиотладка? |
Посл.ответ | Сообщение |
|
Создано: 26 января 2009 23:05 · Личное сообщение · #1 Господа, объясните принцип работы следующего кода: Code:
Данный код встретился на пинче (прикрепил в аттаче) так что аккуратнее! Впринципе методом изъебств, я уже добралсо до OEP, но хотелось бы точно знать что происходит в этом коде и почему. 2ae4_26.01.2009_CRACKLAB.rU.tgz - pinch.rar ----- Nulla aetas ad discendum sera |
|
Создано: 27 января 2009 00:09 · Личное сообщение · #2 |
|
Создано: 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. |
|
Создано: 27 января 2009 00:30 · Личное сообщение · #4 |
eXeL@B —› Основной форум —› Что за антиотладка? |