Сейчас на форуме: UniSoft, bartolomeo (+6 невидимых) |
eXeL@B —› Программирование —› DebugAPI трассировка |
Посл.ответ | Сообщение |
|
Создано: 08 декабря 2010 08:31 · Личное сообщение · #1 Доброго времени суток! Вопщем код, нашел на просторах интернета. Вроде работает, ... но не работает! Вопщем смысл в том, что необходимо сделать трассировку *.ехе, пробежаться по джампам в ходе выполнения программы. Подскажите куда копать мож что почитать, в общем хелп ми. Если есть исходник простого трассировщика, то буду очень благодарен. В DebugAPI новичок. Заранее спасибо. var fName: PChar = 'P.exe'; old : BYTE; int3 : BYTE = $CC; procedure ХХХ; var hFile : THandle; hFileMap : THandle; ImageDosHeader : PImageDosHeader; ImageFileHeader : PImageFileHeader; ImageOptionalHeader: PImageOptionalHeader; EntryPoint : DWORD; si : TStartupInfo; pi : TProcessInformation; DbgEvent : _DEBUG_EVENT; Context : _CONTEXT; NumOfRead : DWORD; begin hFile := FileOpen(fName, fmOpenReadWrite or fmShareDenyNone); hFileMap := CreateFileMapping(hFile, nil, PAGE_READWRITE, 0, 0, nil); ImageDosHeader := MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0); ImageFileHeader := Pointer(Cardinal(ImageDosHeader) + ImageDosHeader._lfanew); ImageOptionalHeader := Pointer(Cardinal(ImageFileHeader) + SizeOf(ImageFileHeader^) + 4); EntryPoint := ImageOptionalHeader.AddressOfEntryPoint + ImageOptionalHeader.ImageBase; UnmapViewOfFile(ImageDosHeader); CloseHandle(hFileMap); CloseHandle(hFile); Memo1.Lines.Add('Entry Point: ' + IntToHex(EntryPoint, 8)); ZeroMemory(@si, SizeOf(si)); if not CreateProcess(nil, fName, nil, nil, False, DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS, nil, nil, si, pi) then begin Memo1.Lines.Add('Error: Cannot to create process!'); Exit; end; while WaitForDebugEvent(DbgEvent, INFINITE) do begin Application.ProcessMessages; //Sleep(55); case DbgEvent.dwDebugEventCode of EXIT_PROCESS_DEBUG_EVENT: begin CloseHandle(pi.hProcess); CloseHandle(pi.hThread); ExitProcess(0); end; CREATE_PROCESS_DEBUG_EVENT: begin ReadProcessMemory(pi.hProcess, Pointer(EntryPoint), @old, 1, NumOfRead); WriteProcessMemory(pi.hProcess, Pointer(EntryPoint), @int3, 1, NumOfRead); end; EXCEPTION_DEBUG_EVENT: begin case DbgEvent.Exception.ExceptionRecord.ExceptionCode of EXCEPTION_BREAKPOINT: begin Context.ContextFlags := CONTEXT_CONTROL; GetThreadContext(pi.hThread, Context); // if Context.eip - 1 = EntryPoint then begin Context.eip := Context.eip - 1; WriteProcessMemory(pi.hProcess, Pointer(EntryPoint), @old, 1, NumOfRead); //Context.EFlags := Context.EFlags and not $100; //- снятие трассировки //флаг $100 показывает что установлена трассировка Context.EFlags := Context.EFlags or $100; SetThreadContext(pi.hThread, Context); //Memo1.Lines.Add(IntToHex (DWord (Cont.Eip), 8)); end; ContinueDebugEvent(pi.dwProcessId, pi.dwThreadId, DBG_CONTINUE); end; // EXCEPTION_BREAKPOINT EXCEPTION_SINGLE_STEP: begin Context.ContextFlags := CONTEXT_CONTROL; GetThreadContext(pi.hThread, Context); //Memo1.Lines.Add(IntToHex (DWord (Context.Eip), 8)); //Context.EFlags := Context.EFlags and not $100; Context.EFlags := Context.EFlags or $100; SetThreadContext(pi.hThread, Context); ContinueDebugEvent(pi.dwProcessId, pi.dwThreadId, DBG_CONTINUE); end; // EXCEPTION_SINGLE_STEP end; // case DbgEvent.Exception.ExceptionRecord.ExceptionCode end; // end case of EXCEPTION_DEBUG_EVENT end; // case DbgEvent.dwDebugEventCode ContinueDebugEvent(pi.dwProcessId, pi.dwThreadId, DBG_EXCEPTION_NOT_HANDLED); end; // while WaitForDebugEvent end; |
|
Создано: 08 декабря 2010 09:44 · Личное сообщение · #2 Если новичок в Debug API нужно изучить Iczelion, пер. Aquila - Win32 API. Урок 28. Win32 Debug API I www.wasm.ru/article.php?article=1001028 Iczelion, пер. Aquila - Win32 API. Урок 28. Win32 Debug API II www.wasm.ru/article.php?article=1001029 Iczelion, пер. Aquila - Win32 API. Урок 28. Win32 Debug API III www.wasm.ru/article.php?article=1001030 ----- Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes |
|
Создано: 08 декабря 2010 09:48 · Личное сообщение · #3 |
|
Создано: 08 декабря 2010 10:16 · Личное сообщение · #4 Чесно сознался что взял из интернета и начал над ним работать. Не получается следующее: после записи $CC в MemoryAddress срабатывает BP (EXCEPTION_BREAKPOINT), далее в контекст записываю флаг $100, и далее все это крутится в бесконечном цикле между EXCEPTION_DEBUG_EVENT и EXCEPTION_SINGLE_STEP. Крутится до тех пор пока Context.EFlags := Context.EFlags And Not $100. Т.е. программа не выполняется, а "крутится на одном месте". Coderess, спс за инфу. |
|
Создано: 08 декабря 2010 10:59 · Личное сообщение · #5 |
|
Создано: 08 декабря 2010 11:00 · Поправил: PE_Kill · Личное сообщение · #6 Что значит крутится? Eip не меняется что ли? Такое может быть только если не тому потоку сообщения отправляешь, а тут код как раз однопоточной реализации. ЗЫ Хотя с одним потоком такого быть не может, тогда твой отладчик просто бы завис. Сталобыть я вообще не понимаю в чем проблема, трассировка должна быть. ----- Yann Tiersen best and do not fuck |
|
Создано: 08 декабря 2010 16:39 · Поправил: daFix · Личное сообщение · #7 А после исключения EXCEPTION_BREAKPOINT ты восстанавливаешь оригинальный байт? И EIP на единичку уменьшать надо при этом. Вот как это сделано у меня: Code:
Думаю что из названий функций всё понятно PS. Archer, ступил ----- Research For Food |
|
Создано: 08 декабря 2010 18:07 · Личное сообщение · #8 |
|
Создано: 08 декабря 2010 22:00 · Поправил: VodoleY · Личное сообщение · #9 50Hz_220B_1200W както много лет назад искал дебугер на делфе. таки нашел. он не совершенен но есть сорцы если не найдешь сам пиши в личку вышлю. З.Ы. Ща занят шо пипец, так что это пару дней. На основе этих сорцов лепил свой дебугер под себя. ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... | Сообщение посчитали полезным: 50Hz_220B_1200W |
eXeL@B —› Программирование —› DebugAPI трассировка |