Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых) |
![]() |
eXeL@B —› Программирование —› "Передача" исключения в отлаживаемую прогу |
Посл.ответ | Сообщение |
|
Создано: 19 января 2007 01:34 · Личное сообщение · #1 Доброе время суток! Понадобилось накатать лекарство в виде дебаггера. Все бы ничего, но жертва выпаливает местами свои исключения, которые мне нафиг не сдались. В нормальных дебагерах есть фича "pass exception to debuggee". Вопрос: как она реализуется? Пробовано: отдавать DBG_EXCEPTION_NOT_HANDLED в ContinueDebugEvent - жертва отваливается. В случае DBG_CONTINUE - пофиг, оно снова вылезает то же и там же. Может, надо как-то править контекст потока или что-то делать с EXCEPTION_RECORD-ами? Тычок в исходники какого-нить дебагера приветствуется. ![]() |
|
Создано: 19 января 2007 01:42 · Личное сообщение · #2 а в чём сложность? непонятно, всё должно работать
----- [nice coder and reverser] ![]() |
|
Создано: 19 января 2007 03:00 · Личное сообщение · #3 >> else ContinueDebugEvent(DE.dwProcessId,DE.dwThreadId, DBG_EXCEPTION_NOT_HANDLED); Я так и сделал! Но тут-то и проблема - жертва завершается. А когда я ее руками протаскиваю в IDA (там тоже вылетает то же самое исключение - FP_INEXACT_RESULT, кое, имхо, является нормальным для ВБ, но мне на него чихать), то изменение реакции на это исключение (снятие Stоp и установка pass) решает дело - стопов нет, жертва работает, до нужного бряка доходит. Обнаружение отладчиков в жертве, конечно же отключено ![]() ![]() |
|
Создано: 19 января 2007 03:25 · Личное сообщение · #4 |
|
Создано: 19 января 2007 03:39 · Личное сообщение · #5 |
|
Создано: 19 января 2007 03:41 · Личное сообщение · #6 |
|
Создано: 19 января 2007 04:37 · Личное сообщение · #7 |
|
Создано: 19 января 2007 07:17 · Личное сообщение · #8 |
|
Создано: 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; .... ![]() |
|
Создано: 25 января 2007 06:53 · Личное сообщение · #10 |
![]() |
eXeL@B —› Программирование —› "Передача" исключения в отлаживаемую прогу |