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

Вниз

Кто писал отладчик?????   Найти похожие ветки 

 
Alex134 ©   (2003-04-20 20:06) [0]

Пишу простой отладчик, задача которого ставить breakpoint на выполнение команды опр. с адресом. Написал я этот код "по мотивам" статьи "Использование Debug API пример перехвата вызовов функций" (автор Ketmar):

const
EFLAGS_TRACE = $100;

type
TThreadList= array[0..99] of
record
Id, Handle, Flag: DWORD;
end;

var
ThreadList: TThreadList;

procedure AddThreadToList(List: TThreadList; ThreadId, ThreadH: DWord);
var
i : integer;
begin
i:=-1;
repeat
inc(i);
until List[i].Flag=0;
List[i].Handle:=ThreadH;
List[i].Id:=ThreadId;
end;

procedure DeleteThreadFromList(List: TThreadList; ThreadId: DWord);
var
i : integer;
begin
for i:=0 to 99 do
if List[i].Id=ThreadId then
begin
List[i].Id:=0;
List[i].Handle:=0;
List[i].Flag:=0;
end;
end;

function GetThreadHandleFromList(List: TThreadList; ThreadId: DWord): DWord;
var
i : integer;
begin
Result:=0;
for i:=0 to 99 do
if List[i].Id=ThreadId then
begin
Result:=List[i].Handle;
Break;
end;
end;

function WriteInt3(PrcH: THandle; n: DWord):byte;
var
BreakByte, A : Byte;
Count : DWord;
begin
A:=$CC;
Result:=0;
if ReadProcessMemory(PrcH, Ptr(n), @BreakByte, 1, Count) then
begin
if WriteProcessMemory(PrcH, Ptr(n), @A, 1, Count) then Result:=BreakByte;
end;
end;

function WriteByte(PrcH: THandle; n: DWord; B: Byte):byte;
var
Count : DWord;
begin
Result:=0;
if WriteProcessMemory(PrcH, Ptr(n), @B, 1, Count) then Result:=1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
ProcID : DWord;
lpDebugEvent : TDebugEvent;
WindowH, ProcHandle, CurThread : THandle;
Bp1 : DWORD;
B1 : Byte;
Context : TContext;
RestoreBreak: Boolean;
begin
FillChar(ThreadList, SizeOf(ThreadList), 0);
Bp1:=StrToInt(Edit2.Text);
RestoreBreak := False;

WindowH:=FindWindow(nil, "testdebug");
if WindowH=0 then
begin
ShowMessage("Окно не найдено! Невозможно пролучить ID процесса.");
Exit;
end;
GetWindowThreadProcessID(WindowH, @ProcID);
ProcHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);

B1:=WriteInt3(ProcHandle, Bp1);
if B1=0 then
begin
ShowMessage("Невозможно установить breakpoint");
Exit;
end;


DebugActiveProcess(ProcID);
while true do
begin
if not WaitForDebugEvent(lpDebugEvent, INFINITE) then Break;
CurThread := GetThreadHandleFromList(ThreadList, lpDebugEvent.dwThreadId);
case lpDebugEvent.dwDebugEventCode of
CREATE_PROCESS_DEBUG_EVENT: AddThreadToList(ThreadList, lpDebugEvent.dwThreadId, lpDebugEvent.CreateProcessInfo.hThread);
CREATE_THREAD_DEBUG_EVENT: AddThreadToList(ThreadList, lpDebugEvent.dwThreadId, lpDebugEvent.CreateThread.hThread);
EXIT_THREAD_DEBUG_EVENT: DeleteThreadFromList(ThreadList, lpDebugEvent.dwThreadId);
EXCEPTION_DEBUG_EVENT:
begin
if (lpDebugEvent.Exception.ExceptionRecord.ExceptionCode=EXCEPTION_BREAKPOINT) then begin
Context.ContextFlags := CONTEXT_CONTROL or CONTEXT_INTEGER or CONTEXT_SEGMENTS;
GetThreadContext(CurThread, Context);
if (Bp1 <> 0) and (Context.EIP = Bp1 + 1) then
begin
Memo1.Lines.Add("Breakpoint EIP=0x"+IntToStr(Context.EIP)+" EXC=0x"+IntToStr(Context.Ecx));
Context.EIP := Bp1;
WriteByte(ProcHandle, Bp1, B1);
Context.EFlags := Context.EFlags or EFLAGS_TRACE;
Context.ContextFlags := CONTEXT_CONTROL;
SetThreadContext(CurThread, Context);
RestoreBreak := True;
end else Memo1.Lines.Add("INT EIP="+IntToStr(Context.EIP)+" EXC="+IntToStr(Context.Ecx));
ContinueDebugEvent(lpDebugEvent.dwProcessId, lpDebugEvent.dwThreadId, DBG_Continue);
end else ContinueDebugEvent(lpDebugEvent.dwProcessId, lpDebugEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED);
end;
EXCEPTION_SINGLE_STEP:
if RestoreBreak and (Context.EIP >= Bp1) and (Context.EIP <= Bp1 + 32) then
begin
Context.ContextFlags := CONTEXT_CONTROL;
GetThreadContext(CurThread, Context);
B1:=WriteInt3(ProcHandle, Bp1);
Context.EFlags := Context.EFlags and not EFLAGS_TRACE;
Context.ContextFlags := CONTEXT_CONTROL;
SetThreadContext(CurThread, Context);
RestoreBreak := False;
end;
EXIT_PROCESS_DEBUG_EVENT: Break;
end;
if lpDebugEvent.dwDebugEventCode<>EXCEPTION_DEBUG_EVENT then ContinueDebugEvent(lpDebugEvent.dwProcessId, lpDebugEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED);
end;
CloseHandle(ProcHandle);
end;

B1 - адрес точкки останова (я его ввожу из Edit"a). Когда отлаживаемая программа доходит до места куда мы ставим int 3 она начинает глючить - попробуйте сами! Не могу найти ошибку :(


 
Songoku ©   (2003-04-20 20:25) [1]

Это ты пытаешься отладить савё приложение???


 
Alex134 ©   (2003-04-20 23:12) [2]


> Songoku © (20.04.03 20:25)
> Это ты пытаешься отладить савё приложение???

Нет конечно



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

Текущий архив: 2003.06.30;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.013 c
14-97837
Dr. Death
2003-06-11 00:32
2003.06.30
RUS-OFFICE .ORG Project


3-97548
_Andrew_
2003-06-07 02:05
2003.06.30
Ускорение поиска


4-97920
Diamond Cat
2003-03-09 03:56
2003.06.30
Scrollbar, или спасите люди добрые


14-97793
Danilka
2003-06-11 13:24
2003.06.30
хех, Вопрос НЕверящим в загробную жизнь.


3-97522
Виталий Панасенко
2003-06-06 10:20
2003.06.30
LocalSQL