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

 eXeL@B —› Программирование —› Обработка memory (и не только) break'ов с помощью VEH
. 1 . 2 . 3 . >>
Посл.ответ Сообщение

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

Создано: 15 ноября 2011 21:43 · Поправил: GoldenJoe
· Личное сообщение · #1


Как я себе это представляю:
1. Прога ставит бряки и внедряет либу в процесс-жертву
2. Либа устанавливает VEH
3. Когда возникает исключение, прога должна каким-то образом получить от внедренной DLL-ки EXCEPTION_RECORD с кодом исключения и прочей инфой. Прога должна проверить, а наш ли это бряк (а, может, совсем даже не бряк ) и неведомым образом сообщить внедренной либе, что делать дальше (CONTINUE_SEARCH или CONTINUE_EXECUTION вернуть, например).

По первым двум пунктам вопросов нет. С 3 пунктом посложнее. Есть именованный FileMapping да event-ы, есть сокеты. А КРАСИВЫХ решений, я так понимаю, нет?



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

Создано: 15 ноября 2011 22:17
· Личное сообщение · #2

Колбек зарегать.




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

Создано: 15 ноября 2011 22:26
· Личное сообщение · #3

Шаред мем нормальное решение

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




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 17 ноября 2011 00:07
· Личное сообщение · #4

PE_Kill

Зачем, если стек есть ?



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

Создано: 17 ноября 2011 04:05
· Личное сообщение · #5

Т.е. вопрос - как организовать обмен инфой между процессами?
Все, что уже предложили + вообще нафиг обработчик эксепшена делать в другом процессе? Можно весь код засунуть в либу.




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

Создано: 17 ноября 2011 05:09
· Личное сообщение · #6

Затем, что ТС хочет сделать подобие отладчика на технологии VEH, вот и спрашивает, как управлять ядром отладчика внутри процесса.

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




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 17 ноября 2011 09:05
· Личное сообщение · #7

PE_Kill

Вызываем в длл функу RegisterCallback(). Она сохраняет в переменной указанную ссылку. Потом при нужно событии вызывает эту ссылку как процедуру, передавая через стек контекст и инфу про фолт. Тоже самое что и VEH. Это если всё в текущем процессе выполнять, ну я думал что нужно с текущим.

Если в другом процессе, то нужно какойто IPC механизм, самый простейший это как сказали секция + евентпейр(EventPair), что реализовано в ядре как LPC специально для этого. Хотя андок и PE_Kill брызгая слюной будет доказывать что не тру и механизм изменится(чего не произошло в W8)




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

Создано: 17 ноября 2011 10:40
· Личное сообщение · #8

Зачем мне что то доказывать тому, кто даже не понял сразу ТЗ? И зачем использовать андок, да еще и LPC, когда можно использовать документированные и отточеные метода, которые и в W50 не изменятся?

Мапь проекцию и через локи сделай протокол общения, вот и всё.

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


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

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

Создано: 17 ноября 2011 16:01
· Личное сообщение · #9

1. ТС хочет "КРАСИВОЕ решение".
2. Ядро отладчика это видимо вех хендлер, который передает 2 структуры другому процессу? Круто.




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

Создано: 17 ноября 2011 16:15
· Личное сообщение · #10

q1nex пишет:
Ядро отладчика это видимо вех хендлер, который передает 2 структуры другому процессу? Круто

А разве Debug API делают больше?

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




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

Создано: 17 ноября 2011 18:02 · Поправил: GoldenJoe
· Личное сообщение · #11

PE_Kill пишет:
ТС хочет сделать подобие отладчика на технологии VEH


q1nex пишет:
Ядро отладчика это видимо вех хендлер, который передает 2 структуры другому процессу? Круто

Даже трейсить можно, если подумать. VirtualProtect с опцией PAGE_READWRITE (можно читать и писать, но выполнять нельзя) на первый байт инструкции. Затем на первый байт следующей инструкции и так далее. Правда, для этого нужен дизасм длин.
Можно еще хуков наставить и перехватывать загрузку DLL-ок, создание потоков, да что угодно.
К тому же такой отладчик не палится протами (теоретически) в отличии от отладчика на Debug API.
PE_Kill пишет:
Мапь проекцию и через локи сделай протокол общения, вот и всё

Что еще за локи?




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

Создано: 17 ноября 2011 18:13
· Личное сообщение · #12

GoldenJoe пишет:
Даже трейсить можно, если подумать. VirtualProtect с опцией PAGE_READWRITE (можно читать и писать, но выполнять нельзя) на первый байт инструкции.

Что за изврат, если есть Trap flag?

GoldenJoe пишет:
Что еще за локи?

LOCK - префикс ассемблерных инструкций.

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




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

Создано: 17 ноября 2011 19:17 · Поправил: GoldenJoe
· Личное сообщение · #13

PE_Kill пишет:
Trap flag

Палевно же.




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

Создано: 17 ноября 2011 19:51
· Личное сообщение · #14

А VirtualProtect не палево? Ещё и на 1 байт. Мне очень интересно, как ты это сделаешь. И да, будет пахать всё это медленно.



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 17 ноября 2011 19:55
· Личное сообщение · #15

PE_Kill

> LOCK - префикс ассемблерных инструкций.

Бредятина.

> PAGE_READWRITE (можно читать и писать, но выполнять нельзя)

Как это так. У меня пае выключен. Посему вообще атрибут PAGE_EXECUTE не робит



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

Создано: 17 ноября 2011 22:12
· Личное сообщение · #16

PE_Kill пишет:
Шаред мем

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

А VirtualProtect не вариант, да. Как спалить его использование, кстати? Самим же VirtualProtect'ом?




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

Создано: 17 ноября 2011 22:23 · Поправил: Модератор
· Личное сообщение · #17

bowrouco пишет:
Бредятина

Клерк ..., аминь.

От модератора: на сутки... ну ты понял

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


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

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

Создано: 17 ноября 2011 22:46 · Поправил: Veliant
· Личное сообщение · #18

Вместо PAGE_READWRITE ставьте PAGE_GUARD, тогда при любом обращении будет EXCEPTION_PAGE_GUARD, а самое интересное что этот флаг будет автоматически сниматься при срабатывании.
Но как уже сказали это медленно.
Если не нравится trap flag, можно ставить аппаратные бряки на начало инструкций, ловить EXCEPTION_SINGLE_STEP и смотреть context.Dr6 и другие context.Dr* регистры, какой сработал. Если не наш, отдаем проге.
Только придется перехватить ZwGet/ZwSetContextThread чтоб не палить бряки.

Кстати надеюсь после установки векторного прерывания делаете хук AddVectoredExceptionHandler? Тк отлаживаемая прога может воткнуть свой обработчик вперед вашего

P.S.
в отличии от отладчика на Debug API.
Если немного пропатчить пару функций в ntdll, то почти все проты, за исключением некоторых, идут лесом


пусть trap flag тогда уж. Чтоб не спалиться, надо, как и в случаи с аппаратными бряками, перехватывать ZwGetThreadContext
Trap flag можно считать простой последовательностью PUSHFD/POP REG. Однако при трейсе можно сравнить следующий опкод команды с 0x9C и если это он то поставить Int3 или еще какой бряк за ней, чтоб не попасться.
Заодно и POPFD(0x9D), на случай если tf будет выставлять программа

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

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

Создано: 17 ноября 2011 23:07
· Личное сообщение · #19

Veliant, для трассировки пусть trap flag тогда уж. Чтоб не спалиться, надо, как и в случаи с аппаратными бряками, перехватывать ZwGetThreadContext, я так понимаю.
Veliant пишет:
хук AddVectoredExceptionHandler

Когда с шаред мем разберусь, и все будет работать, тогда уж займусь хуками.



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

Создано: 17 ноября 2011 23:15
· Личное сообщение · #20

Veliant пишет:
Вместо PAGE_READWRITE ставьте PAGE_GUARD, то


на многоядерниках проблемы + GUARD_PAGE_VIOLATION генерируется частенько системой (сторож стек).
К тому-же если перехватывать Nt/Zw может уже перехватить KiUserExceptionDispatcher?



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

Создано: 18 ноября 2011 00:09
· Личное сообщение · #21

0x90h, чем VEH хуже?




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

Создано: 18 ноября 2011 00:13 · Поправил: ARCHANGEL
· Личное сообщение · #22

0x90h пишет:
К тому-же если перехватывать Nt/Zw может уже перехватить KiUserExceptionDispatcher?

И то, и то, т.к. разные механизмы, тут не надо выбирать, первые чисто читают контекст, а вторая дотягивается до него, когда он копируется ядром.

на многоядерниках проблемы + GUARD_PAGE_VIOLATION генерируется частенько системой (сторож стек)

А вы думаете, как олли работает? Сравнивать надо, куда поставили, если вы собрались так делать трейс, но не будете ставить бряки ниже ImageBase. (или очень хитрый прот)

GoldenJoe пишет:
для трассировки пусть trap flag тогда уж. Чтоб не спалиться, надо, как и в случаи с аппаратными бряками, перехватывать ZwGetThreadContext, я так понимаю

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

Veliant пишет:
Заодно и POPFD(0x9D), на случай если tf будет выставлять программа

Как общее решение не заработает.
После выполнения pop ss следующая за ней инструкция будет выполнена, но отладчик не остановится на ней (Из Антиотладочных трюков)

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


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

Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 18 ноября 2011 01:21
· Личное сообщение · #23

> Чтоб не спалиться..

Гиблая затея. Обнаружить установленный TF есть овер 9000 способов.

> Сравнивать надо, куда поставили, если вы собрались так делать трейс, но не будете ставить бряки ниже ImageBase. (или очень хитрый прот)

Очень содержательное выражение.. хз что это значит, но как по мне так нету разницы какой адрес, лиш бы за пределами стека. Если загрузить диапазон адресов в TEB, на которых возникнет останов, то ядро не развернёт фолт при доступе к сторожевой странице.



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

Создано: 18 ноября 2011 01:57 · Поправил: q1nex
· Личное сообщение · #24

Объясните, кто-нибудь, пожалуйста, в чем проблема с гвард пейдж на многоядерниках?

PE_Kill
А разве Debug API - ядро отладчика?

bowrouco
Гляньте личку плиз



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 18 ноября 2011 02:31
· Личное сообщение · #25

q1nex
Тут порченая лк, сообщения не доставляются, посему ничего не пришло.




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

Создано: 18 ноября 2011 05:58
· Личное сообщение · #26

q1nex пишет:
А разве Debug API - ядро отладчика?

Debug API - интерфейс ядра отладчика.

bowrouco пишет:
Гиблая затея. Обнаружить установленный TF есть овер 9000 способов.

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

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




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

Создано: 18 ноября 2011 07:05 · Поправил: Zorn
· Личное сообщение · #27

Обычным pushfd насколько я помню нельзя спалить флаг Т. Потому что
ARCHANGEL пишет:
Трап флаг сам сбрасывается каждый раз


А вот так можно
Code:
  1.     pop ss
  2.     pushfd

При трейсе pop ss следующая остановка будет на инструкции после pushfd и в стек попадет значение с взведенным флагом Т.
Детали не помню, но в мане описано почему.
У Securom'а помнится был такой антитрейс.




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

Создано: 18 ноября 2011 07:32
· Личное сообщение · #28

Это всё баяны, которые описаны 100 лет назад. В данном случае это обходится установкой int 3 бряка на pushfd. Есть еще try, который обходится хуком диспетчера, Get/Set ThreadContext, что тоже лечится.

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




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 18 ноября 2011 08:42
· Личное сообщение · #29

PE_Kill

Ну например при вызове сискола с TF возникает задержка, гдето в полтора раза медленее. Или например баг приводящий к дедлоку(генерация любого исключения, кроме #DB с TF) позволяет определить TF. Вот есчо пример - хардварный сброс RPL на каждой инструкции. Или напрямую получить контекст. А есчо можно через теневые колбеки.. Хадварный останов на память - почему бы через ядро не читать(через сервисы, где Dr-контекст ядерный). Способов сколько угодно, это даже в ядре не решается.



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 18 ноября 2011 19:55
· Личное сообщение · #30

PE_Kill

Гдеже ответ то ?


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


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