Сейчас на форуме: UniSoft, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› DebugAPI трассировка
Посл.ответ Сообщение

Ранг: 16.9 (новичок)
Активность: 0.020
Статус: Участник

Создано: 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;




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 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





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 08 декабря 2010 09:48
· Личное сообщение · #3

Ты б хыть написал, что не работает и тд. Сам хоть что-нибудь сделал кроме того, что содрал код откуда-то?



Ранг: 16.9 (новичок)
Активность: 0.020
Статус: Участник

Создано: 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, спс за инфу.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 08 декабря 2010 10:59
· Личное сообщение · #5

Почему ты думаешь, что на одном месте то крутится? Ты отлаживал этот код? По идее он должен шагать по 1 инструкции и шагать, судя по всему, бесконечно. Нет под рукой дельфей, чтобы собрать и поглядеть.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 08 декабря 2010 11:00 · Поправил: PE_Kill
· Личное сообщение · #6

Что значит крутится? Eip не меняется что ли? Такое может быть только если не тому потоку сообщения отправляешь, а тут код как раз однопоточной реализации.

ЗЫ Хотя с одним потоком такого быть не может, тогда твой отладчик просто бы завис. Сталобыть я вообще не понимаю в чем проблема, трассировка должна быть.

-----
Yann Tiersen best and do not fuck





Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 08 декабря 2010 16:39 · Поправил: daFix
· Личное сообщение · #7

А после исключения EXCEPTION_BREAKPOINT ты восстанавливаешь оригинальный байт? И EIP на единичку уменьшать надо при этом. Вот как это сделано у меня:

Code:
  1. int __fastcall DebugThread::BPHandler(int Addr)
  2. {
  3.          if (IfMyBreak(Addr))
  4.          {
  5.                  Log("Handed BreakPiont at " + IntToHex(Addr,8));
  6.                  PrevStep();
  7.                  RemBP(Addr);
  8.                  dwContinueStatus = DBG_CONTINUE;
  9.                  return 1;
  10.          }
  11.          else
  12.          {
  13.                  if (isFirst)
  14.                  {
  15.                          isFirst=false;
  16.                          Log("System BreakPiont at " + IntToHex(Addr,8));
  17.                          dwContinueStatus = DBG_CONTINUE;
  18.                          return 1;
  19.                  }
  20.                  Log("Unhanded BreakPiont at " + IntToHex(Addr,8));
  21.                  dwContinueStatus = DBG_EXCEPTION_NOT_HANDLED;
  22.          }
  23.          return 0;
  24. }


Думаю что из названий функций всё понятно

PS. Archer, ступил

-----
Research For Food





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 08 декабря 2010 18:07
· Личное сообщение · #8

daFix
Походу, ты сорцы даж не глядел?
if Context.eip - 1 = EntryPoint then
begin
Context.eip := Context.eip - 1;
WriteProcessMemory(pi.hProcess, Pointer(EntryPoint), @old, 1, NumOfRead);




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 08 декабря 2010 22:00 · Поправил: VodoleY
· Личное сообщение · #9

50Hz_220B_1200W както много лет назад искал дебугер на делфе. таки нашел. он не совершенен но есть сорцы если не найдешь сам пиши в личку вышлю.
З.Ы. Ща занят шо пипец, так что это пару дней. На основе этих сорцов лепил свой дебугер под себя.

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....


| Сообщение посчитали полезным: 50Hz_220B_1200W
 eXeL@B —› Программирование —› DebugAPI трассировка
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати