Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];

Вниз

Отладчик - Вопрос серьезный, для Мастеров   Найти похожие ветки 

 
Alex134   (2003-04-29 00:42) [0]

Пишу отладчик, используя Debug API. Проблема в следующем:
Все программы отлаживаются нормально, но при отладке некоторой программы programX она в определенный момент повисает вместе с моим отладчиком. Разобрался в чем причина - отлаживаемая программа в определенный момент времени генерирует EXCEPTION_DEBUG_EVENT,
ExceptionCode которого равен E06D7363. EIP в этот момент =7800AC4E. Инструкция с этим адресом пренадлежит загруженой прогой библиотеке msvcrt.dll, а если конкретнее то в ее функции _CxxThrowException. После этого все и виснет (независимо от того какой я устанавливаю флаг в функции ContinueDebugEvent - DBG_EXCEPTION_NOT_HANDLED или DBG_CONTINUE).
Вот даже код этой функции вытянул:
7800AC1A public _CxxThrowException
7800AC1A _CxxThrowException proc near ;
7800AC1A ;
7800AC1A
7800AC1A var_20 = dword ptr -20h
7800AC1A var_1C = dword ptr -1Ch
7800AC1A var_10 = dword ptr -10h
7800AC1A var_C = byte ptr -0Ch
7800AC1A var_8 = dword ptr -8
7800AC1A var_4 = dword ptr -4
7800AC1A arg_0 = dword ptr 8
7800AC1A arg_4 = dword ptr 0Ch
7800AC1A
7800AC1A push ebp
7800AC1B mov ebp, esp
7800AC1D sub esp, 20h
7800AC20 mov eax, [ebp+arg_0]
7800AC23 push esi
7800AC24 push edi
7800AC25 push 8
7800AC27 pop ecx
7800AC28 mov esi, offset unk_780
7800AC2D lea edi, [ebp+var_20]
7800AC30 repe movsd
7800AC32 mov [ebp+var_8], eax
7800AC35 mov eax, [ebp+arg_4]
7800AC38 mov [ebp+var_4], eax
7800AC3B lea eax, [ebp+var_C]
7800AC3E push eax
7800AC3F push [ebp+var_10]
7800AC42 push [ebp+var_1C]
7800AC45 push [ebp+var_20]
7800AC48 call ds:RaiseException
7800AC4E pop edi
7800AC4F pop esi
7800AC50 leave
7800AC51 retn 8
7800AC51 _CxxThrowException endp


 
Alex134   (2003-04-29 00:45) [1]

---------------------------------------
И еще код моего простенького "отладчика":

unit Debug1;

...

procedure TForm1.Button1Click(Sender: TObject);
begin
FillChar(ThreadList, SizeOf(ThreadList), 0);
x:=StrToInt(Edit2.Text);
E_Break:=false;

WinHandle:=FindWindow(nil, "CashFiesta Login"); //CashFiesta Login
if WinHandle=0 then
begin
ShowMessage("Окно не найдено! Невозможно пролучить ID процесса.");
Exit;
end;
GetWindowThreadProcessID(WinHandle, @ProcId);
ProcH := OpenProcess(PROCESS_ALL_ACCESS, true, ProcId);
if ProcId=0 then begin ShowMessage("ProcID=0"); Halt(1); end;
if ProcH=0 then begin ShowMessage("ProcH=0"); Halt(1); end;

//if not readprocessmemory(ProcH, pointer(x),@b[0],1,i) then Halt(1); //запоминаем байт
Memo1.Lines.Add(IntToStr(b[0]));
//writeprocessmemory(ProcH,pointer(x),@b[1],1,i); //пишем $cc
BreakpointOff:=false;
if not DebugActiveProcess(ProcId) then begin ShowMessage("can""t DebugActiveProcess"); Halt(1); end;

While WaitForDebugEvent(DE, INFINITE) do
Begin
//application.ProcessMessages;
Memo1.Lines.Add("DebugEventCode="+IntToStr(de.dwDebugEventCode));
CurThread := GetThreadHandleFromList(ThreadList, DE.dwThreadId);
case de.dwDebugEventCode of
CREATE_PROCESS_DEBUG_EVENT: AddThreadToList(ThreadList, DE.dwThreadId, DE.CreateProcessInfo.hThread);
CREATE_THREAD_DEBUG_EVENT: AddThreadToList(ThreadList, DE.dwThreadId, DE.CreateThread.hThread);
EXIT_THREAD_DEBUG_EVENT: DeleteThreadFromList(ThreadList, DE.dwThreadId);
EXIT_PROCESS_DEBUG_EVENT: begin Memo1.Lines.Add("EXIT_PROCESS_DEBUG_EVENT"); Break; end;
EXCEPTION_DEBUG_EVENT:
begin
cont.ContextFlags:=CONTEXT_CONTROL; //3765269347
GetThreadContext(CurThread, cont); //eip=2013310030
if DE.Exception.ExceptionRecord.ExceptionCode=EXCEPTION_BREAKPOINT then
begin
cont.ContextFlags:=CONTEXT_CONTROL;
GetThreadContext(CurThread, cont);
Memo1.Lines.Add("BREAKPOINT Addr="+IntToStr(x)+" EIP="+IntToStr(cont.Eip));
if cont.eip-1=x then
Begin
Memo1.Lines.Add("INT3 Addr="+IntToStr(x)+" EIP="+IntToStr(cont.Eip));
cont.eip:=cont.eip-1;
cont.EFlags:=cont.EFlags or $100;
setThreadContext(CurThread,cont);
writeprocessmemory(ProcH,pointer(x),@b[0],1,i);
BreakpointOff:=true;
end;
end else
if DE.Exception.ExceptionRecord.ExceptionCode=EXCEPTION_SINGLE_STEP then
Begin
cont.ContextFlags:=CONTEXT_CONTROL;
GetThreadContext(CurThread,cont);
if (cont.Eip>x) and (cont.eip<=x+32) then
begin
writeprocessmemory(lppi.hProcess,pointer(x),@b[1],1,i); //пишем $cc
Cont.EFlags := Cont.EFlags and not EFLAGS_TRACE;
SetThreadContext(CurThread,cont);
BreakpointOff:=false;
end;
end;
end;
end;
if (de.dwDebugEventCode=EXCEPTION_DEBUG_EVENT) and (DE.Exception.ExceptionRecord.ExceptionCode=EXCEPTION_BREAKPOINT) and (E_Break=false) then
begin
ContinueDebugEvent(DE.dwProcessId, DE.dwThreadId,DBG_CONTINUE);
E_Break:=true;
end else ContinueDebugEvent(DE.dwProcessId, DE.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);
end;
//Application.Terminate;
end;

end.


 
Alex134   (2003-04-29 12:55) [2]

"^
/|\ up
_|_


 
Alex134   (2003-04-29 18:28) [3]

OK! Зададим вопрос по-другому. Где можно взять исходники нормального отладчика на Delphi?


 
NetBreaker666   (2003-04-29 18:37) [4]

Тебе неужно Кэш-фиесту похакать ? Так бы сразу и сказал... ко мне в мыло, чувак :)


 
NetBreaker666   (2003-04-29 18:38) [5]

Тебе неужно Кэш-фиесту похакать ? Так бы сразу и сказал... ко мне в мыло, чувак :)



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.007 c
1-59733
SiJack
2003-05-06 08:30
2003.05.19
Как получить из делфи список всех листов в документе Excel ?


14-59908
NetBreaker666
2003-04-29 18:05
2003.05.19
Непонятный эффект подвисания


1-59764
Vint
2003-05-06 10:14
2003.05.19
RX


1-59708
Alexeyss
2003-05-05 08:56
2003.05.19
Расположение компонентов.


6-59836
sils
2003-03-23 13:42
2003.05.19
Tracert ????????





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский