Сейчас на форуме: 2nd, morgot, Rio, CDK123, zds, tyns777, tihiy_grom (+5 невидимых)

 eXeL@B —› Программирование —› Интересуют delphi исходники демонстрирующие установку и обработку memory breakpiont
. 1 . 2 . >>
Посл.ответ Сообщение


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

Создано: 24 марта 2009 17:51
· Личное сообщение · #1

Простите за ламерский вопрос, честно скажу гуглил мало на эту тему, но может быть кто-то поделится исходником на дельфи устанавливающим и обрабатывающим мемори браяк. Планирую инжектить длл в которой и реализую обработку бряка. С инжектом трудности нет.



Ранг: 221.3 (наставник), 135thx
Активность: 0.190.07
Статус: Участник

Создано: 24 марта 2009 18:15
· Личное сообщение · #2

Посмотри исходники анпакера для аспака от пеко. Там есть модуль отладчика, вот это то что тебе нужно

-----
xchg dword [eax], eax





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

Создано: 24 марта 2009 18:44
· Личное сообщение · #3

v0id2k пишет:
Посмотри исходники анпакера для аспака от пеко. Там есть модуль отладчика, вот это то что тебе нужно


А есть ссылочка на них? Гуглю, но не нахожу...




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

Создано: 24 марта 2009 18:48 · Поправил: Hellspawn
· Личное сообщение · #4

в чём сложность???
Code:
  1. function TDebugger.SetBPM(dwAddress,dwSize,dwNum:dword):boolean;
  2. var
  3.   dwOld,dwFlag:dword;
  4. begin
  5.   result:=FALSE;
  6.   If ((dwNum < 0) or (dwNum > 15)) then exit;
  7.   BPM[dwNum].addr := dwAddress;
  8.   BPM[dwNum].size := dwSize;
  9.   dwFlag          := PAGE_EXECUTE_READWRITE or PAGE_GUARD;
  10.   result          := VirtualProtectEx(pi.hProcess,POINTER(dwAddress),dwSize,dwFlag,dwOld);
  11.   BPM[dwNum].oldp := dwOld;
  12. end;
  13. ...
  14. function TDebugger.DelBPM(dwNum:dword):boolean;
  15. var
  16.   dwOld,dwFlag:dword;
  17. begin
  18.   result:=FALSE;
  19.   If ((dwNum >= 0) or (dwNum <= 15)) then
  20.   begin
  21.     result:=VirtualProtectEx(pi.hProcess,POINTER(BPM[dwNum].addr),BPM[dwNu m].size,dwFlag,BPM[dwNum].oldp);
  22.     BPM[dwNum].addr:=0;
  23.     BPM[dwNum].size:=0;
  24.     BPM[dwNum].oldp:=0;
  25.   end;
  26. end;
  27. ...
  28. function TDebugger.MyBPM(const dwAdress:DWORD): integer;
  29. var
  30.   i:integer;
  31. begin
  32.   Result:=-1;
  33.   For i:=0 to 15 do
  34.     If (BPM[i].addr >= dwAdress) and (BPM[i].addr <= dwAdress + BPM[i].size) then
  35.     begin
  36.       Result:=i;
  37.       break;
  38.     end;
  39. end;

обрабатывай как хочешь SEH, VEH, ...

-----
[nice coder and reverser]





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

Создано: 24 марта 2009 20:24
· Личное сообщение · #5

Hellspawn спасибо за код! Я не очень силён в дельфи, TDebugger это что-то самописное или есть такой компонент?




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

Создано: 24 марта 2009 20:25
· Личное сообщение · #6

ToBad

самописное конечно может тогда стоит подучить сабж?

-----
[nice coder and reverser]




Ранг: 221.3 (наставник), 135thx
Активность: 0.190.07
Статус: Участник

Создано: 24 марта 2009 22:05
· Личное сообщение · #7

Хм... Если ты не силен в делфе, зачем тогда тебе пример именно на этом языке? Насчет анпакера, то поищи по форуму, выложил бы сам да нет возможности.

-----
xchg dword [eax], eax





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 24 марта 2009 22:48
· Личное сообщение · #8

Ради бога, можно и без исходников - главное принцип, звучит он так: установка memory breakpoint есть назначение коду, на который хочешь поставить этот самый breakpoint, атрибутов PAGE_GUARD, когда программа обратиться к странице с такими атрибутами, получим исключение, его нужно обработать, чтоб снять этот breakpoint и продолжить выполнение кода жертвы, для этого мы должны либо подключиться к жертве в качестве отладчика, либо использовать VEH, но это уже менее универсально, ещё можно написать свой драйвер, который будет обрабатывать эти исключения, всё зависит от того, как далеко ты готов зайти

-----
Stuck to the plan, always think that we would stand up, never ran.





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

Создано: 24 марта 2009 22:50
· Личное сообщение · #9

Hellspawn пишет:
может тогда стоит подучить сабж?


Да, да... Вот хочу на конкретном примере. Надобность возникла.


v0id2k пишет:
Если ты не силен в делфе, зачем тогда тебе пример именно на этом языке?


Не, ну что-то могу, просто углубляюсь в более сложное по мере надобности...
А так вообще дельфи для меня оптимальный вариант.

Посмотри исходники анпакера для аспака от пеко.

Посмотрел и нашёл всё... Отстал я от жизни, не понял сразу кого ты так назвал, иначе нашёл бы раньше.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 24 марта 2009 22:52 · Поправил: Clerk
· Личное сообщение · #10

Установка.. да загрузи отладочные регистры и обработай исключение, в чём трабла ?
Или ты про сторожевые страницы хз..
> можно написать свой драйвер, который будет обрабатывать эти исключения
Вам товарищ тока драйвера писать




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

Создано: 24 марта 2009 22:57
· Личное сообщение · #11

ARCHANGEL пишет:
для этого мы должны либо подключиться к жертве в качестве отладчика


Когда жертва подгружает мою длл, из этой длл я смогу так сделать?
Драйвер писать не осилю, да и не вижу смысла в контексте моей задачи.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 25 марта 2009 12:49 · Поправил: ARCHANGEL
· Личное сообщение · #12

Clerk пишет:
Вам товарищ тока драйвера писать
Ээх, это да, справедливо подколол, но я буду стараться

ToBad
Если жертва подгружает твою библиотеку, то так можно и не делать, достаточно VEH, нот.к. вехи ппашут, начиная с WinXp, то для более ранних версий ОС это не годится, а по этому вопросу советую почитать Рихтера, там, вроде бы, если мне не изменяет память (щас перед собой у менянету этой книженции) описываются такие извраты, как длл подключить в качестве отладчика, ещё можно установить финальный обработчик через SetUnhandledExceptionFilter, и, если происходит исключение, которое в нормальных условиях просто не могло произойти, т.е. программист не продумывал такую ситуацию,что страницы кода могут иметь такой атрибут, как PAGE_GUARD, то,вероятно, что его сехи могут такую ситуацию и не обработать, тогда управление получит твой обработчик, далее, из извратов, никто ведь не запрещает нам вмешиваться в процесс обработки исключений непосредственно перехватом в ntdll.dll из третьего кольца KiUserExceptionDispatcher. Но это уже действительно изврат)))

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 26 марта 2009 05:36 · Поправил: Clerk
· Личное сообщение · #13

> непосредственно перехватом в ntdll.dll из третьего кольца KiUserExceptionDispatcher. Но это уже действительно изврат
Почемуже изврат ?
Если только потому, что это жесткий перехват и обнаруживается например рку то наверно это нигде не имеет значения. Я считаю перехват ядерных калбэков в нтдлл самым эффективным. Более того, довольно часто возникает задача установить свой обработчик исключений в чужом процессе, из юзермода невозможно удалённо зарегистрировать VEH, так как указатель на обработчик шифруется ксором с значением, которое случайно и не может быть определено из другого процесса.
А VEH это единственный механизм обработки исключений, который глобален в процессе(для всех потоков), именно он обрабатывается первым, после идёт обработка SEH, но она локальна для каждого потока. Так что к сожалению никак глобально первым исключение не обработать, кроме как выполнив жёсткий перехват(например Call RtlDispatchException).
А обработка в конечном обработчике слишком не надёжна, исключение по доступу к сторожевой страницы является палевным, аналогично как трассировочное.



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

Создано: 26 марта 2009 09:53
· Личное сообщение · #14

RtlDispatchException не экспортируется к сожалению, хотя её можно найти чуть дальше KiUserExceptionDispatcher по опкоду call'а. если кто будет перехватывать KiUserExceptionDispatcher не забудьте что у этого stdcall callback'а нет адреса возврата)

-----
Shalom ebanats!





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

Создано: 27 марта 2009 05:07 · Поправил: ToBad
· Личное сообщение · #15

Погуглил и нашёл пример:
Смогу ли я так перехватывать и обрабатывать обращение к памяти?

Code:
  1. function MyVectoredHandler(ExceptionInfo: PExceptionPointers): Longint; stdcall;
  2. begin
  3.   ShowMessage('Перехвачено');
  4.   ExceptionInfo^.ContextRecord.Dr0 := 0;
  5.   ExceptionInfo^.ContextRecord.Dr1 := 0;
  6.   ExceptionInfo^.ContextRecord.Dr2 := 0;
  7.   ExceptionInfo^.ContextRecord.Dr3 := 0;
  8.   ExceptionInfo^.ContextRecord^.ContextFlags := CONTEXT_DEBUG_REGISTERS;
  9.   SetThreadContext(GetCurrentThread, ExceptionInfo^.ContextRecord^);
  10.   Result := EXCEPTION_CONTINUE_SEARCH;
  11. end;
  12. procedure TForm1.Button1Click(Sender: TObject);
  13. begin
  14. pHandler:= AddVectoredExceptionHandler(1, @MyVectoredHandler);
  15. if pHandler = nil then ShowMessage('Error: AddVectoredExceptionHandler');
  16. end;
  17. procedure TForm1.Button3Click(Sender: TObject);
  18. begin
  19. try
  20.     raise Exception.Create('MyException');
  21.   except
  22.     Caption := 'Произошло исключение';
  23.   end;
  24.   Caption := 'Выполнение продолжилось';
  25. end;




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 27 марта 2009 05:58 · Поправил: Clerk
· Личное сообщение · #16

ToBad
Тебе нужно определить для себя что есть останов по доступу к памяти.
В юзермоде варианты разные есть.
> Использовать аппаратный останов, адрес определён в отладочных регистрах. Для потока максимум 4 точки останова можно задать, локален в потоке. Также существенным недостатком является адрес останова, который получает диспетчер исключений - по доступу к данным Eip будет указывать на следующую инструкцию, при исполнении инструкции по адресу останова Eip указывает на адрес инструкции, вызвавшей останов(который в DrX).
> Использовать сторожевые страницы. Страница помечается атрибутом PAGE_GUARD, при обращении к ней этот атрибут снимается и генерируется исключение STATUS_GUARD_PAGE_VIOLATION. Недостаток заключается в рассинхронизации, тоесть первый поток обращается к сторожевой странице, она разлочивается(снимается атрибут PAGE_GUARD), этот поток входит в диспетчер исключений, в это время второй поток обратится к этой странице и исключение не произойдёт. Можно считать что этот механизм локален для потока.
> Использовать исключение по доступу к не выделенной странице. Страница помечается как PAGE_NOACCESS, либо иной атрибут, в зависимости от типа доступа генерируется исключение STATUS_ACCESS_VIOLATION. Глобально в процессе.
У каждого способа есть свои недостатки и преимущества.



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

Создано: 27 марта 2009 07:34
· Личное сообщение · #17

Clerk, какие недостатки у PAGE_NOACCESS?

-----
Shalom ebanats!




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 27 марта 2009 07:49
· Личное сообщение · #18

SLV
1. Невозможность исполнения кода, который находится в тойже странице, за которой необходимо следить.
2. При каждом обращении к странице для исполнения инструкции после останова необходимо восстанавливать атрибуты страницы, после чего снова страница должна быть не доступной к примеру на запись. Тоесть необходимо выполнить трассировку инструкции. Трассировка будет обнаружена.
3. Скорость исполнения низкая.



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

Создано: 27 марта 2009 11:29 · Поправил: SLV
· Личное сообщение · #19

Clerk, а есть идеи как тогда можно контролировать доступ к памяти без потери скорости и без потерь на многопоточности? если бы цель была поставить простой breakpoint без debug api было бы намного проще, обрабатывать ExceptionRecord->ExceptionCode на STATUS_BREAKPOINT, но это изменение памяти и сработает только при выполнении, т.е. другая задача.
кроме хука KiUserExceptionDispatcher, можно хитро перехватить саму ZwRaiseException для контроля эксепшенов, с выходом из функции без вызова при необходимости

-----
Shalom ebanats!





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

Создано: 27 марта 2009 11:57
· Личное сообщение · #20

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




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 27 марта 2009 12:58
· Личное сообщение · #21

ToBad
Тогда лучше использовать аппаратные точки останова.

-----
Stuck to the plan, always think that we would stand up, never ran.





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

Создано: 27 марта 2009 13:10 · Поправил: daFix
· Личное сообщение · #22

ToBad
Тогда наверное тебе будет легче через отладочные регистры работать. И удобнее и скорость работы быстрее
ARCHANGEL
Опередил))

-----
Research For Food




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 28 марта 2009 07:13
· Личное сообщение · #23

Если код читает/сбрасывает Dr-контекст то логгер работать не будет.
Более того, если он сам использует 4 хардварные регистра, код под логгером работать не будет.




Ранг: 138.1 (ветеран)
Активность: 0.090
Статус: Участник
Одепт ЭкзэЛаба

Создано: 28 марта 2009 21:31 · Поправил: g-l-u-k
· Личное сообщение · #24

в свое время нашел на ачате:

Code:
  1.  function breakpoint(dll:Thandle;addr:pointer):boolean;
  2. var buffer:byte;
  3. i: cardinal;
  4. begin
  5. result:=false;
  6. ReadProcessMemory(dll,addr,@buffer,1,i);
  7. if buffer=CC then result:=true;
  8. end;
  9. var usr32:thandle;
  10. begin
  11. usr32:=GetModuleHandle('user32.dll');
  12. if breakPoint(usr32,GetProcAddress(usr32,'MessageBoxA '))
  13.    then MessageBoxA(0,'Breakpoint on MessageBoxA','DebuggerChecker',0)
  14.    else MessageBox(0,'MessageBoxA is clear','DebuggerChecker',0)
  15. end.





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 28 марта 2009 21:54
· Личное сообщение · #25

это для простых, а не мемори бряков

-----
Лучше быть одиноким, но свободным © $me





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

Создано: 28 марта 2009 22:22
· Личное сообщение · #26

g-l-u-k
Это код, проверяющий наличие int 3 бряка в начале функции MessageBoxA

-----
Research For Food




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

Создано: 30 марта 2009 15:42
· Личное сообщение · #27

> function breakpoint(dll:Thandle;addr:pointer):boolean;
чё это за ересь, из пинча чтоли?)

-----
Shalom ebanats!





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 31 марта 2009 02:13
· Личное сообщение · #28

> Задача написать логгер обращения к определенной ячейке
Если она одна/пара - лучше, на мой взгляд, отладочные регистры

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





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

Создано: 31 марта 2009 11:40
· Личное сообщение · #29

ajax пишет:
Если она одна/пара - лучше, на мой взгляд, отладочные регистры


Да, уже понял. Буду так и пытаться. daFix подкинул массу инфы, потихоньку изучаю.
Но если кто кинет готовым кодом на дельфи, буду только рад.

g-l-u-k - к сожалению это не то.




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 31 марта 2009 12:06
· Личное сообщение · #30

А чем тебе ПЕ_Киловские сорсы не подходят?

-----
Лучше быть одиноким, но свободным © $me



. 1 . 2 . >>
 eXeL@B —› Программирование —› Интересуют delphi исходники демонстрирующие установку и обработку memory breakpiont
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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