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

 eXeL@B —› Программирование —› "Передача" исключения в отлаживаемую прогу
Посл.ответ Сообщение

Ранг: 4.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 19 января 2007 01:34
· Личное сообщение · #1

Доброе время суток!
Понадобилось накатать лекарство в виде дебаггера. Все бы ничего, но жертва выпаливает местами свои исключения, которые мне нафиг не сдались. В нормальных дебагерах есть фича "pass exception to debuggee".
Вопрос: как она реализуется?
Пробовано:
отдавать DBG_EXCEPTION_NOT_HANDLED в ContinueDebugEvent - жертва отваливается. В случае DBG_CONTINUE - пофиг, оно снова вылезает то же и там же. Может, надо как-то править контекст потока или что-то делать с EXCEPTION_RECORD-ами?
Тычок в исходники какого-нить дебагера приветствуется.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 19 января 2007 01:42
· Личное сообщение · #2

а в чём сложность? непонятно, всё должно работать

цикл =)
IsExcept:=False;
if WaitForDebugEvent(DE,INFINITE) then
begin
// обрабатываем кучу событий
if DE.dwDebugEventCode = EXCEPTION_DEBUG_EVENT then // исключение
begin
IsExcept:=True;
case DE.Exception.ExceptionRecord.ExceptionCode of
EXCEPTION_SINGLE_STEP:ExceptionSingleStep(DE); // проверяем может наш бряк
EXCEPTION_BREAKPOINT :ExceptionBreakPont(DE); // проверяем может наш бряк
else ContinueDebugEvent(DE.dwProcessId,DE.dwThreadId, DBG_EXCEPTION_NOT_HANDLED);
// иначе отдаём исключение проге
end;
end;
end;
If (not IsExcept) then ContinueDebugEvent(DE.dwProcessId,DE.dwThreadId,DBG_CONTINUE);
// обрабатываем исключения
end;


-----
[nice coder and reverser]




Ранг: 4.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 19 января 2007 03:00
· Личное сообщение · #3

>> else ContinueDebugEvent(DE.dwProcessId,DE.dwThreadId, DBG_EXCEPTION_NOT_HANDLED);
Я так и сделал! Но тут-то и проблема - жертва завершается.
А когда я ее руками протаскиваю в IDA (там тоже вылетает то же самое исключение - FP_INEXACT_RESULT, кое, имхо, является нормальным для ВБ, но мне на него чихать), то изменение реакции на это исключение (снятие Stоp и установка pass) решает дело - стопов нет, жертва работает, до нужного бряка доходит.

Обнаружение отладчиков в жертве, конечно же отключено




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 19 января 2007 03:25
· Личное сообщение · #4

всё должно работать, смотри внимательнее ты где-то накосячил)))

-----
[nice coder and reverser]





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 19 января 2007 03:39
· Личное сообщение · #5

Возможно имеет место быть не одному потоку и ты передаешь исключение не тому.

-----
Yann Tiersen best and do not fuck




Ранг: 4.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 19 января 2007 03:41
· Личное сообщение · #6

Да там пока косячить-то негде.... В консоль выводится инфа где и какое вывалилось исключение...
Единственное, где я мог накосячить - это с контекстом потока.
Там точно не надо eip корректировать?
Хотя, ExceptionAddress==Context.Eip.....




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 19 января 2007 04:37
· Личное сообщение · #7

не надо, если это не твоё исключение только
майби прогу выложишь, ато надоело уже гадать?

-----
[nice coder and reverser]




Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 19 января 2007 07:17
· Личное сообщение · #8

entusiast
Может в проге антидебаг есть. Что происходит, если под олькой отлаживать эту прогу.




Ранг: 105.9 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 25 января 2007 01:26
· Личное сообщение · #9

Черт, та же проблемма. Самое смешное, что весь последний месяц только с Debug Api и приходилось работать.. А сейчас сел за голый комп и туплю по полной. Простейший пример и не работает. Уже несколько часов не могу найти где провтыкал.


Procedure Handler2;
var
DE:_Debug_event;

begin
While true do
Begin
application.ProcessMessages;
WaitForDebugEvent(de,INFINITE);

case DE.dwDebugEventCode of

CREATE_PROCESS_DEBUG_EVENT: begin
ContinueDebugEvent(DE.dwProcessId, DE.dwThreadid,DBG_CONTINUE);
end;

EXCEPTION_DEBUG_EVENT: begin
if de.Exception.ExceptionRecord.ExceptionCode=Exception_Breakpoint then
ContinueDebugEvent(DE.dwProcessId, DE.dwThreadid,DBG_CONTINUE)
else
ContinueDebugEvent(DE.dwProcessId, DE.dwThreadid,DBG_EXCEPTION_NOT_HANDLED);
end;

LOAD_DLL_DEBUG_EVENT: begin
ContinueDebugEvent(DE.dwProcessId, DE.dwThreadid,DBG_EXCEPTION_NOT_HANDLED);
end;
EXIT_PROCESS_DEBUG_EVENT: begin
break;
end;


else
ContinueDebugEvent(DE.dwProcessId, DE.dwThreadid,DBG_EXCEPTION_NOT_HANDLED);
end;
end;
end;

.......
GetMem(pComm,Max_path);
StrPCopy(pComm,Cdir+'VstH.exe'+' '+'XXX.dll');
if Createprocess(nil,pComm,nil,nil,false,CREATE_DEFAULT_ERROR_MODE or
DEBUG_ONLY_THIS_PROCESS , nil, nil, StI, lpPI)=False then
begin
Messsage('0001');
exit;
end;
FreeMem(pComm);
handler2;
....




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 25 января 2007 06:53
· Личное сообщение · #10

seeq пишет:
LOAD_DLL_DEBUG_EVENT: begin
ContinueDebugEvent(DE.dwProcessId, DE.dwThreadid,DBG_EXCEPTION_NOT_HANDLED);


и чё это такое? с какого перепоя DBG_EXCEPTION_NOT_HANDLED?

-----
[nice coder and reverser]



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


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