Найдите и переместите обработчики VEH с Олли?


2

Я искал способ добраться до обработчика VEH (указанный при обращении приложения), который вызывается при возникновении исключения. Я прочитал вопрос this, и он объясняет некоторые вещи красиво, но моя ситуация немного отличается. Код я шагая/выполнение бросает исключение:

enter image description here

В этой ситуации, что я могу сделать, чтобы добраться до кода обработчика и шаг его с Олли (кроме статически анализировать исполняемый файл и ищет AddVectoredExceptionHandler и друзья)?

2

Если вы используете только символы таблицы экспорта (по умолчанию), то лучшим вариантом будет установка точки останова на ntdll!KiUserExceptionDispatcher(). Когда он вызывается, вы можете проследить его, чтобы найти список обработчиков векторов. С другой стороны, если у вас есть публичные символы PDB ntdll.dll, вы можете сразу найти список обработчиков векторов, посмотрев на _LdrpVectorHandlerList.

Честно говоря, вероятно, проще просто установить контрольную точку регистрации на AddVectoredExceptionHandler() и записать каждую запись VEH по мере ее добавления.

  0

выполняет _LdrpVectorHandlerList удержание или кодированный указатель?у вас есть какие-либо ссылки/документация. 09 мар. 152015-03-09 19:40:03

  0

Закодированный указатель, поэтому проще просто записывать вызовы в 'AddVectoredExceptionHandler()'. 09 мар. 152015-03-09 20:05:16

  0

BTW, @blabb, мне нравится ваш ответ WinDbg! Не уверен, что szczurcio хочет сделать это целиком в OllyDbg, но если нет, ваш подход выглядит солидно! 09 мар. 152015-03-09 20:10:34

+1

Спасибо за подтверждение о закодированном указателе. Я задавался вопросом, что вы подразумеваете под этим **, вы можете найти список обработчиков напрямую ** в своем ответе, если он хочет сделать это только в ollydbg, и xp является приемлемым, есть olly plugin ollylkd, который может помочь ему 10 мар. 152015-03-10 06:09:09


2

_LdrpVectorHandlerList, кажется, без документов, а также может быть недоступны в хр

Я не мог даже посадить половину пола подлинного гугловским о своей внутренней деятельности

что мало я мог найти о _LdrpVectorHandlerList, кажется, указует что это EncodedPointer, а не фактический обработчик

DecodePointer это за процесс и выполнение DecodePointer в отладчике (с помощью плагинов/расширений и т.д.) не декодирует отлаживаемых EncodedPointer можно прочитать память процесса, чтобы получить отлаживаемых EncodedPointer HandlerList.

OllyDbg 1.10 до exisitance из VEH поэтому он знает только о SEH в окне цепи view-> SEH

OllyDbg 2.01 покажет закодированную ссылку указателя, а не фактический обработчик в view-> SEH окна цепи , как вставил ниже

VEH/SEH chain of main thread 
Index Type   Link   Handler 
1 Vectored   00153848   Invalid 
2 Vectored   001537F8   Invalid 
3 Vectored   00153820   Invalid 
4 SEH   0013FF60   00401880 _except_handler4 
5 SEH   0013FFB0   00401880 _except_handler4 
6 SEH   0013FFE0   7C839AD8 _except_handler3 

найти фактические Векли обработчик я обработал файл летучей мыши, который использует отладку локального ядра Windbg в (используются в XP SP3 только не уверен, если это все еще держит в новой ОС), вы можете проверить его

:type c:\findveh.bat 
kd -kl -c " $>a< c:\findveh.txt %1 ;q" | findstr /I eval 

:type c:\findveh.txt 
.foreach /pS 1 /ps 200 (place{ !process 0 0$ { $arg1}}){.process /p /r place}
!list -t ntdll!_SINGLE_LIST_ENTRY.Next -x "? poi(@$ extret+8)^@@(@ $proc->Cookie)" @@masm(ntdll!RtlpCalloutEntryList); 
!list -t ntdll!_SINGLE_LIST_ENTRY.Next -x "? poi(@$ extret)" @@masm(ntdll!RtlpCalloutEntryList); 

вывода битого файла (вторая команда списка! Добавлена ​​только, чтобы показать связанные EncodedPointers для сравнения не требуется)

объяснения сценария

набора процессы Контекста уместного процесса, для которого мы хотим найти Вег обработчики пересекают SINGLE_LIST_ENTRY и распечатать фактические обработчики по xorring в EncodedPointer с конкретным ProcessCookie

код veh.exe является копией пасты образца документации MSDN с помощью Вег обработчиков

:findveh.bat veh.exe 

:kd -kl -c "$>a< c:\findveh.txt veh.exe ;q" | findstr /I eval 
Evaluate expression: -169753474 = f5e1c47e 
Evaluate expression: -4290768896 = ffffffff'00401000 
Evaluate expression: -4290768848 = ffffffff'00401030 
Evaluate expression: -4290768800 = ffffffff'00401060 
Evaluate expression: 1390664 = 00153848 
Evaluate expression: 1390584 = 001537f8 
Evaluate expression: 1390624 = 00153820 
Evaluate expression: 2090329024 = 7c97e3c0