· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› VEH - для всех

Посл.отвђт Сообщенiе


Дата: Июл 30, 2004 08:49:48 · Поправил: Sem

Небольшое вступление:

Читая замечательную статью "Об упаковщиках в последний раз" от Volodya / HI-TECH, NEOx / UINC.RU впервые узнал о VEH, заинтересовался, сходил по линку - да и только. Но прошло время, сел писать прогу и знаете ли вспомнилось. Вспомнил о AddVectoredExceptionHandler и RemoveVectoredExceptionHandler, апишки описанные на указанном линке. Все хорошо - да SEH своим
 push fs:[0]
 mov fs:[0],esp 

уж больно понравился. Ну и ...

Исследования:

Лезу в ntdll.dll (а куда ж ещё), нахожу почти что искал - те же две функции, но с префиксом Rtl (не беда - аналогично, например, ZeroMemory -> RtlZeroMemory). Если честно, то ожидал увидеть, что то типа:
 mov eax,XXX
 mov edx,7FFXXXXX
 call edx

edx:
 mov edx,esp
 sysenter

(кто смотрел ntdll - поймет меня) и тогда уже все вопросы к Four-F (огромный респект за уникальные статьи - так держать). Ничего подобного - строчек сорок понятного кода и всё, даже и не верится. В общем, смысл такой: имеется двусвязный (Microsoft, блин) список исключений, указатель на первый элемент находится по определенному адресу (об этом ниже), формат элемента таков:

+0: указатель на запись следующего обработчика
+4: указатель на запись предыдущего обработчика
+8: собственно указатель на ваш обработчик (VectorExceptionHandler)

как добавить\убрать свой обработчик- думаю ясно (можно посмотреть в аттаче). Что можно делать в VEH'е: по моим наблюдения получается, что по [esp+18h] имеем CONTEXT (сугубо IMHO),
ну и немного посмотрев на код после ret'a отрубаем SEH (or eax,-1), думаю, минимум необходимого соблюдён, всё.

Плюсы, минусы, замечания:
+:
Как говорилось в статье "Об упаковщиках ..." VEH имеет приоритет над SEH, первым обрабатывается (developer'ы защит, virmake'ры обратите внимание!)

Для вышеперечисленных особ, only: в данной реализации трудно локализовать (по коду размыть - как два пальца).

По желанию из VEH можно SEH отрубить нахрен:)

Не надо никаких апи - всё довольно просто и по дзенски

-:
Наверное, самый "-", то, что адрес головы VEH'a - константа. Что это значит: скорее всего от версии к версии (а может и от билда к билду) он будет изменятся. Как её получать (кроме как ручками) я пока не знаю, г-да researcher'ы может вы что скажите. У меня Windows Server 2003 Enterprise Edition, здесь 77FC2430 (в WinXP SP1 v1081 - 77FC32C0)

Использование только на платформах XP+ (з-з-зх 95\98 пролетает).

Ну и для самых ленивых, как определить адрес указателя на первый VEH: дизассемблим ntdll, смотрим в RtlAddVectoredExceptionHandler. После RtlEnterCriticalSection идет что-то вроде:
 cmp dword ptr [esp+0c],0
 je XXXXXXXX
 mov eax,dword ptr [77FXXXXX]

где 77FXXXXX и есть искомый адрес.


Подобную инфу не встречал (сорри если уже было и старо), ризёчил сам, так что задавайте вопросы, указывайте на ошибки и неточности.
Благодарю за внимание, с уважением Sem.

Небольшой и простенький пример использования VEH (и SEH - для сравнения) в аттаче, результат смотреть в отладчике.

474805310__VEH.rar


Дата: Июл 30, 2004 15:02:26

а еще проще врезаться в KiUserExceptionDispatcher и организовать свое подобие veh.
получается универсальный вариант для всех платформ NT+


Дата: Авг 2, 2004 12:35:38

Да с адресами туго - в той же XP SP1 только билд постарше - 2600 адрес уже 77FC3210. Так что надо или пройтись по ntdll на предмет вхождений этой константы либо ждать статью Питерека о VEH. Кто нибудь знает насколько широко винда его использует?


Дата: Авг 4, 2004 17:20:32

В общем кроме вышеуказанных функций с этим работает RtlDispatchException (которая вызывается из KiUserExceptionDispatcher). Для XР в самом начале вызывается RtlCallVectoredExceptionHandlers которая собственно начиная с головы пробегается по зарегистрированным обработчикам исключений.
Единственно засмущал меня код немного
RtlCallVectoredExceptionHandlers proc near
.text:77F60C26 ; CODE XREF: RtlDispatchException+Ep
.text:77F60C26 push ebp
.text:77F60C27 mov ebp, esp
.text:77F60C29 push ecx
.text:77F60C2A push ecx
.text:77F60C2B push edi
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.text:77F60C2C mov edi, offset VEH_HEAD
.text:77F60C31 cmp VEH_HEAD, edi
.text:77F60C37 jnz loc_77F7F485
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.text:77F60C3D xor al, al
.text:77F60C3F
.text:77F60C3F loc_77F60C3F: ; CODE XREF: .text:77F7F4C7j
.text:77F60C3F pop edi
.text:77F60C40 leave
.text:77F60C41 retn 8
.text:77F60C41 RtlCallVectoredExceptionHandlers endp

VEH_HEAD - адрес головы списка на моей платформе.77FC3210

Очень на заглушку похоже - разбирался с этим кто-нибудь?


Дата: Авг 4, 2004 22:26:29

Xornet
.text:77F60C2C mov edi, offset VEH_HEAD 
.text:77F60C31 cmp VEH_HEAD, edi 
.text:77F60C37 jnz loc_77F7F485


Такой код обычно встечается в программах которые внедряются в чужой процесс в качестве DLL. Мне кажется что в секции reloc есть запись только для mov, а для cmp нету. Так что если библиотека окажется загружена по другому адресу, переход вполне может сработать.


Дата: Авг 5, 2004 11:15:57

Согласен - вполне логично. Но библиотека как бы NTDLL.DLL - и грузится то скорее всего будет по своей базе. Тем более что основной код как раз и выполняется по переходу.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.059