Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.19;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
14-59931
RelakS
2003-04-28 22:14
2003.05.19
Хорошие форумы по VC++


1-59663
Anna
2003-05-07 11:03
2003.05.19
Преобразовать строку в предложение Паскаля


14-59936
vajo
2003-04-30 06:43
2003.05.19
Web сайт c помощью дельфи


14-59872
Snap
2003-04-28 12:37
2003.05.19
Помогите, Линукс не ставится


3-59578
BJValentine
2003-04-25 20:09
2003.05.19
ConnectionTimeOut в ADO