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

 eXeL@B —› Программирование —› Не срабатывает hardware breakpoint на Delphi
Посл.ответ Сообщение


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

Создано: 19 июля 2012 01:07
· Личное сообщение · #1

Тут нашёл пример установки subj, но что-то не срабатывает. Подскажите пожалуйста, где может быть косяк?
Переложил сюда. Там же скомпилированный EXE. Проверял на этом пытаясь поставить бряк на messagebox по адресу 45325E.

Вот основная часть кода:
Code:
  1. type
  2.   PBreakPoint = ^TBreakPoint;
  3.   TBreakPoint = record
  4.     dwPID:DWORD;
  5.     dwAddress:DWORD;
  6.   end;
  7.  
  8. var  info:PBreakPoint;
  9.  
  10. const THREAD_ALL_ACCESS = $0002 or $0200 or $0008 or $0100 or $0040 or $0800 or $0010 or $0020 or $0400 or $0080 or $0001;
  11. reg0set= $3;
  12. reg1set= $C;
  13. reg2set= $30;
  14. reg3set= $c0;
  15. reg0w=   $10000;
  16. reg0len4=$c0000;
  17.  
  18. function InitDebug(adr:Pointer):DWORD;stdcall;
  19. var
  20. nfo:PBreakPoint;
  21. event:_DEBUG_EVENT;
  22. TE32:TThreadEntry32;
  23. snap,tid:THandle;
  24. cont:TCONTEXT;
  25. cn:Integer;
  26. begin
  27. nfo:=adr;
  28. cn:=0;
  29. if DebugActiveProcess(nfo^.dwPID) then
  30. begin
  31.   snap:=CreateToolHelp32SnapShot(TH32CS_SNAPTHREAD,0);
  32.   TE32.dwSize:=Sizeof(TThreadEntry32);
  33.   Thread32First(snap,TE32);
  34.   repeat
  35.       if TE32.th32OwnerProcessID=nfo^.dwPID then
  36.         begin
  37.         tid:=OpenThread(THREAD_ALL_ACCESS,false,TE32.th32ThreadID);
  38.         SuspendThread(tid);
  39.         GetThreadContext(tid,cont);
  40.         cont.ContextFlags:=CONTEXT_DEBUG_REGISTERS;
  41.         cont.Dr0:=nfo^.dwAddress;
  42.         cont.Dr7:=reg0set or reg1set or reg2set or reg3set;
  43.         SetThreadContext(tid,cont);
  44.         ResumeThread(tid);
  45.         end;
  46.   until Thread32Next(snap,TE32)=false;
  47.   CloseHandle(snap);
  48.   CloseHandle(tid);
  49.  
  50. repeat
  51. WaitForDebugEvent(event,INFINITE);
  52. inc(cn);
  53. Form1.Caption:=IntToStr(cn);
  54. if event.Exception.ExceptionRecord.ExceptionCode=EXCEPTION_SINGLE_STEP then
  55. begin
  56. OutPut('BREAKPOINT DETECTED','$'+IntToHex(DWORD(event.Exception.ExceptionRecord.ExceptionAddress),8));
  57. ContinueDebugEvent(event.dwProcessId,event.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);
  58. end;
  59. ContinueDebugEvent(event.dwProcessId,event.dwThreadId,DBG_CONTINUE);
  60.  
  61. until 3=4;
  62.  
  63. end
  64. else ShowMessage('Could not attach to requested process');
  65. Result:=0;
  66. end;
  67.  
  68. procedure TForm1.SetBkrClick(Sender: TObject);
  69. var PID,tid:DWORD;
  70. begin
  71. PID:=plist.PID;
  72. if PID>0 then
  73. begin
  74. GetMem(info,Sizeof(TBreakPoint));
  75. info^.dwPID:=PID;
  76. info^.dwAddress:=$45325E;
  77. CreateThread(nil,0,@InitDebug,info,0,tid);
  78. end
  79. else MessageDlg('No process selected',mtError,[mbOk],0);
  80. end;


Программа бегает между WaitForDebugEvent и ContinueDebugEvent, но никогда не попадает на BREAKPOINT DETECTED...



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 19 июля 2012 01:44 · Поправил: SReg
· Личное сообщение · #2

а че ей туда попадать?
cont.EFlags := cont.EFlags or $0100;
не? учти только что TF автоматом сбросится после эксершена




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

Создано: 19 июля 2012 03:58
· Личное сообщение · #3

SReg пишет:
а че ей туда попадать?
cont.EFlags := cont.EFlags or $0100;
не?


Всё равно не работает:
Code:
  1. tid:=OpenThread(THREAD_ALL_ACCESS,false,TE32.th32ThreadID);
  2.         SuspendThread(tid);
  3.         GetThreadContext(tid,cont);
  4.         cont.Dr0:=nfo^.dwAddress;
  5.         cont.EFlags := cont.EFlags or $0100;
  6.         cont.Dr7:=reg0set or reg1set or reg2set or reg3set;
  7.         SetThreadContext(tid,cont);
  8.         ResumeThread(tid);


SReg пишет:
учти только что TF автоматом сбросится после эксершена


Это не проблема, хоть бы раз зашло.
Кстати, это же должен быть hardware breakpoint execution?



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 19 июля 2012 05:05
· Личное сообщение · #4

ToBad
--> Link <--

| Сообщение посчитали полезным: ToBad


Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 19 июля 2012 08:30
· Личное сообщение · #5

переодически возникают подобные топики
проверяем наш ли бряк:
Code:
  1. procedure TDebugger.ExceptionSingleStep(const ERec : _EXCEPTION_RECORD);
  2. var
  3.   address : DWORD;
  4.   temp    : DWORD;
  5.   n       : Integer;
  6. begin
  7.   DbgControl := DBG_EXCEPTION_NOT_HANDLED;
  8.   address    := DWORD(ERec.ExceptionAddress);
  9.   n          := MyBPH(address);
  10.   If (>= 0) then
  11.   begin
  12.     DbgControl := DBG_CONTINUE;
  13.     FDebugLog  := '> HardwareBreakpoint ['+IntToStr(n)+']: '+IntToHex(address,8);
  14.     DelHardwareBreak(n);
  15.     exit;
  16.   end;
  17. ...

ставим бряк:
Code:
  1.   Cont.ContextFlags:=CONTEXT_DEBUG_REGISTERS;
  2.   pr:=GetThreadContext(pi.hThread,cont);
  3.   If (pr) and (iNumber >= 0) and (iNumber <= 3) and (dwAddress>0) then
  4.   begin
  5.     CASE (iNumber) of
  6.       0:  begin
  7.             cont.Dr0:=dwAddress;
  8.             Cont.Dr7:= Cont.Dr7 or BPM_LOCAL_EXACT or BPM0_ENABLED
  9.           end;
  10.       1:  begin
  11.             cont.Dr1:=dwAddress;
  12.             Cont.Dr7:= Cont.Dr7 or BPM_LOCAL_EXACT or BPM1_ENABLED
  13.           end;
  14.       2:  begin
  15.             cont.Dr2:=dwAddress;
  16.             Cont.Dr7:= Cont.Dr7 or BPM_LOCAL_EXACT or BPM2_ENABLED
  17.           end;
  18.       3:  begin
  19.             cont.Dr3:=dwAddress;
  20.             Cont.Dr7:= Cont.Dr7 or BPM_LOCAL_EXACT or BPM3_ENABLED
  21.           end;
  22.     end;
  23.     BPH[iNumber].addr:=dwAddress;
  24.     cont.Dr6:=0;
  25.     pr:=setThreadContext(pi.hThread,cont);
  26. ...


-----
[nice coder and reverser]





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

Создано: 19 июля 2012 14:20
· Личное сообщение · #6

Ребята, ткните носом в работающий пример на дельфи, эти кусочки не могу совместить воедино. В принципе пример и искал для того, что бы наглядно понять как это работает. Теперь ещё больше запутался...




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 19 июля 2012 14:23
· Личное сообщение · #7

а должен уже был и сам разобраться в чем косяк

9984_19.07.2012_EXELAB.rU.tgz - myDebug.pas

-----
[nice coder and reverser]


| Сообщение посчитали полезным: ToBad


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

Создано: 19 июля 2012 21:00 · Поправил: ToBad
· Личное сообщение · #8

Hellspawn пишет:
а должен уже был и сам разобраться в чем косяк


Мне стыдно, но в упор не понимаю...

Делал так:
Code:
  1.         cont.Dr0:=nfo^.dwAddress;
  2.         cont.EFlags := cont.EFlags or $0100;
  3.         Cont.Dr7:= Cont.Dr7 or BPM_LOCAL_EXACT or BPM0_ENABLED;
  4.         cont.Dr6:=0;


и так:

Code:
  1.         cont.Dr0:=nfo^.dwAddress;
  2.         Cont.Dr7:= Cont.Dr7 or BPM_LOCAL_EXACT or BPM0_ENABLED;
  3.         cont.Dr6:=0;


Наверное проблема в отлове точки остановки...

Hellspawn Спасибо за Ваш исходник! Пытаюсь разобраться. Не получается...
Я что то не так делаю видимо. Пожалуйста ткните носом в простейший пример по запуску программы и установки бряка.




Ранг: 57.7 (постоянный), 49thx
Активность: 0.070
Статус: Участник

Создано: 19 июля 2012 22:30
· Личное сообщение · #9

А почему не хочешь взять код SReg --> ТУТ <--. Единственное нужно будет добавить:
Code:
  1. const
  2.  THREAD_ALL_ACCESS                 = $1F03FF;
  3.  
  4. function OpenThread(
  5.  dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwThreadId: DWORD): THandle; stdcall;


| Сообщение посчитали полезным: ToBad


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

Создано: 19 июля 2012 22:48
· Личное сообщение · #10

inffo пишет:
А почему не хочешь взять код SReg --> ТУТ <--.


Во, сработало!!! Спасибо! Код только начал копипастить и заработало. Оказывается вот где проблема была:
Code:
  1. const THREAD_ALL_ACCESS = $0002 or $0200 or $0008 or $0100 or $0040 or $0800 or $0010 or $0020 or $0400 or $0080 or $0001;

а нужно как подсказал inffo:
Code:
  1. const THREAD_ALL_ACCESS = $1F03FF;





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

Создано: 20 июля 2012 00:41
· Личное сообщение · #11

В продолжение темы, пытаюсь теперь поставить бряк на программу накрытую фимкой, закрывается. Есть ли шанс обойти это и поставить бряк средствами delphi?




Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 20 июля 2012 02:55
· Личное сообщение · #12

ToBad пишет:
В продолжение темы, пытаюсь теперь поставить бряк на программу накрытую фимкой, закрывается

А чё ты хотел палит твой отладчик,пропатчь PEB как вариан может прокатить

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





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

Создано: 20 июля 2012 03:42
· Личное сообщение · #13

ClockMan пишет:
А чё ты хотел палит твой отладчик,пропатчь PEB как вариан может прокатить


Нашёл этот код, делаю так: PatchImagePath(PWideChar(getmodulename(0)));
То есть патчу PEB процесса из которого запускаю жертву и где устанавливаю бряки. Не работает...
Может мне другой вариант нужен?:

Code:
  1. Example(s):
  2.     1) Patch a local Process Module:
  3.        PatchModule(GetModuleHandle('ntdll.dll'), 'NewModule.dll');
  4.        1.1)
  5.          You can too hide Modules, when you use:
  6.          PatchModule(GeModuleHandle('ntdll.dll'), nil);
  7.  
  8.     2) Patch a remote Process Module:
  9.        var
  10.          hProcess: THandle;
  11.        begin
  12.          hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, dwProcessIDofFirefox);
  13.          PatchModuleRemote(hProcess, 'Firefox.exe', 'Test.dll');
  14.  
  15.     3) Patch a local ImageBaseName (ProcessPath in the Processmanager)
  16.          PatchImagePath('C:\Program Files\Mozilla Firefox\Firefox.exe');
  17.  
  18.     4) Patch a remote ImageBaseName
  19.        var
  20.            hProcess: THandle;
  21.        begin
  22.          hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, dwProcessIDofFirefox);
  23.          PatchImagePathRemote(hProcess, 'C:\Program Files\Mozilla Firefox\NewFirefox.exe');





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

Создано: 20 июля 2012 03:45 · Поправил: ToBad
· Личное сообщение · #14

Вариант от Hellspawn выглядит так:
Code:
  1. procedure TDebugger.HideDBG();
  2. var
  3.   dwAddr,dwTemp,zero:dword;
  4.   pMem:pointer;
  5.   fs30:dword;
  6. begin
  7.   If (Win32Platform <> VER_PLATFORM_WIN32_NT)
  8.     then exit;
  9.   zero   := 0;
  10.   dwAddr := DWORD(lpThreadLocalBase) + $30;
  11.   ReadProcessMemory(pi.hProcess,POINTER(dwAddr),@fs30,4,dwTemp);
  12.   dwAddr := fs30+$2;
  13.   WriteProcessMemory(pi.hProcess,POINTER(dwAddr),@zero,1,dwTemp);
  14.   dwAddr := fs30+$68;
  15.   WriteProcessMemory(pi.hProcess,POINTER(dwAddr),@zero,4,dwTemp);
  16.   bPatchPEB := TRUE;
  17. end;


Не пойму откуда берётся lpThreadLocalBase и pi.hProcess чего, жертвы или файла из которого я бряки ставлю?

p.s. Простите, забыл правкой воспользоваться...




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

Создано: 20 июля 2012 04:59
· Личное сообщение · #15

ToBad
Все манипуляции должен делать с жертвой

-----
Research For Food




Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 20 июля 2012 05:03 · Поправил: SReg
· Личное сообщение · #16

ToBad пишет:
откуда берётся lpThreadLocalBase

из структуры CREATE_PROCESS_DEBUG_INFO
ToBad пишет:
и pi.hProcess

жертвы

ClockMan пишет:
пропатчь PEB как вариан может прокатить

очень сомневаюсь




Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 20 июля 2012 05:12 · Поправил: ClockMan
· Личное сообщение · #17

ToBad пишет:
lpThreadLocalBase

--> Link <--
Pi:TProcessInformation; заполняется при CreateProcess
что нужно патчить


54ba_20.07.2012_EXELAB.rU.tgz - Path peb.zip

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 20 июля 2012 11:43
· Личное сообщение · #18

ToBad а жертву можешь залить?

-----
[nice coder and reverser]





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 20 июля 2012 11:59
· Личное сообщение · #19

Hellspawn
Постом выше он же вроде давал ссылку
--> Link <--

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 20 июля 2012 12:01
· Личное сообщение · #20

ClockMan пипец, пора завязывать пить) увидел только с третьего раза...

-----
[nice coder and reverser]




Ранг: 20.4 (новичок), 1thx
Активность: 0.030
Статус: Участник

Создано: 22 июля 2012 02:43 · Поправил: Skino
· Личное сообщение · #21

А есть что либо тоже уже готовое только на плюсах?
И ещё такой вопрос, можно ли поставить BP на все CALL?



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 22 июля 2012 10:27
· Личное сообщение · #22

Skino пишет:
"А есть что либо тоже уже готовое только на плюсах?"
- есть! Но если ты С++ хоть немного знаешь, то далеко ходить не надо - весь код можно взять и переварить с этой темы.
Суть везде одна:
Code:
  1. tid:=OpenThread(THREAD_ALL_ACCESS,false,TE32.th32ThreadID);
  2.         SuspendThread(tid);
  3.         GetThreadContext(tid,cont);
  4.         cont.ContextFlags:=CONTEXT_DEBUG_REGISTERS;
  5.         cont.Dr0:=nfo^.dwAddress;
  6.         cont.Dr7:=reg0set or reg1set or reg2set or reg3set;
  7.         SetThreadContext(tid,cont);
  8.         ResumeThread(tid);


Skino пишет:
"...можно ли поставить BP на все CALL?"
- Как ты себе это представляешь? По крайней мере, аппаратных точек останова всего 4 штуки на каждый процесс!



Ранг: 20.4 (новичок), 1thx
Активность: 0.030
Статус: Участник

Создано: 22 июля 2012 15:46
· Личное сообщение · #23

ELF_7719116 100500 раз пробывал писать аппаратки, ниразу не работали, поэтому и прошу готовые.



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 24 июля 2012 01:49 · Поправил: _tls
· Личное сообщение · #24

Hellspawn, будьте добры
залейте плз модули myPe, myTypes
спасибо




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 24 июля 2012 09:57
· Личное сообщение · #25

залил

add9_24.07.2012_EXELAB.rU.tgz - modules.zip

-----
[nice coder and reverser]


| Сообщение посчитали полезным: _tls

Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 24 июля 2012 23:04
· Личное сообщение · #26

большой спс


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


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