Форум: "Потрепаться";
Текущий архив: 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