Сейчас на форуме: jinoweb, bartolomeo, rmn (+5 невидимых) |
eXeL@B —› Программирование —› Перехват прерываний и исключений |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . >> |
Посл.ответ | Сообщение |
|
Создано: 09 декабря 2013 15:35 · Личное сообщение · #1 Руководствуясь Хоглундом и Батлером на тему перехват прерываний и исключений , написать и запустить драйвер получается но перехват не выходит, пытался перехватить как 0x04 OF так и 0x13 ошибки доступа к памяти, запускал на VB xp 32 с одним процессором, но увы, не опытность даёт знать, вот код на Си который вышел: init.c: Code:
IDT.c Code:
|
|
Создано: 11 декабря 2013 12:09 · Личное сообщение · #2 Veliant Первая инструкция только фолт сгенерит. Маловероятно что там будет какой то активно юзаемый код, на практике на быстродействии это не сказывается. > функции для работы с памятью/файлами Например сайд - все сервисы в системе генерят фолт, но визуально это не заметно даже на моей бородатой машине |
|
Создано: 12 декабря 2013 04:01 · Личное сообщение · #3 |
|
Создано: 14 декабря 2013 15:12 · Поправил: MickeyBlueEyes · Личное сообщение · #4 |
|
Создано: 31 декабря 2013 01:11 · Личное сообщение · #5 Вообщем Я перехватываю KiDispatchException и в перехватчике мне надо воспользоватся NtOpenProcess() для процесса где произошло исключение, ну и потом поставить на страницу нужные мне права и return, но я не могу по странной как по мне причине вызвать NtOpenProcess(). PsGetCurrentProcess() - возвращает процесс где произошло исключения, всё норм. Вообщем сразу как происходит исключение, я в перехватчике делаю так: Code:
Потом мне нужно открыть этот процесс. Вызываю так: Code:
NtOpenProcess - возвращает не STATUS_SUCCESS. И тут главное, если убрать это: Code:
И переполнение стека будет как я понял и вылетает система. !analyze -v Code:
Таким образом я понял что исключения происходит ещё и в NtOpenProcess , NtOpenProcess + 0x40 , дальше пока не стал смотреть, вырубает ) Много догадок, но хз ) Буду реально очень признателен если кто поможет. |
|
Создано: 31 декабря 2013 09:24 · Личное сообщение · #6 |
|
Создано: 31 декабря 2013 19:05 · Личное сообщение · #7 |
|
Создано: 02 января 2014 18:38 · Поправил: MickeyBlueEyes · Личное сообщение · #8 |
|
Создано: 04 января 2014 17:57 · Личное сообщение · #9 MickeyBlueEyes Вы друг мой походу безнадёжны, всё что было сказано видать впустую. > Джжж вышло, поток то пользовательский Nt* непоюзаешь, нужно же либо Zw* , либо свой переходник писать и через прерывания вызывать уже ядерный Nt*. > Да и нельзя вне её юзать системный функционал. > UnHook("KiDispatchException") Зачем каждый раз снимать патч, это нестабильность, темболее после снятия фолты пойдут вне вашего хэндлера. Вдобавок мне кажется что патч то у вас не атомарный, это значит что высока вероятность синева. Далее в ядре обычно манипулируют не описателями обьектов, а указателями. Это в юзермоде описатели приводятся к указателям. Снижает быстродействие, особенно в таких тяжёлых по времени кодах. PsLookupProcessByPID etc вам нужно. Ну а в целом полное извращенье |
|
Создано: 04 января 2014 21:47 · Личное сообщение · #10 |
|
Создано: 05 января 2014 00:22 · Личное сообщение · #11 Мы как-то с Волком спорили на тему безопасных хуков через сплайсинг. Основная проблема которая возникает при работе со сплайсами против хотпатчей то, что в нашем коде делается полезная работа, т.к. мы вынуждены были воровать байты с тела функции, которую мы сплайсили. Хук должен сниматься минимальной модификацией байт. Я придумывал механизм кардонов, чтобы процессы, которые уже налетели на код нашего хука, смогли безопасно выйти из хука, когда мы его уже снимем (т.е. сложность на самом деле в том, что кто-то уже мог вызвать функцию в тот момент, когда мы решили снять хук). Но это всего лишь теория, на практике я этого не делал, хотя знаю, что сделать можно. В реальной жизни нет никакой необходимости выгружать драйвер, предназначенный для задач реверс-инженерии, равно как и убирать последствия каких-то отдельных задач драйвера, таких как сплайсинг. Если у вас что-то не работает, если НЕ снимать хук с KiDispatchException, ищите проблему в реализации хука. Хук должен начинаться с проверок, что основная функция хука выполняется только в нужный момент (например, в случае использования KiDispatchException для отладки приложений, что вы фильтруете исключения отлаживаемого приложения, а не всех подряд). | Сообщение посчитали полезным: ajax, MickeyBlueEyes |
|
Создано: 05 января 2014 17:39 · Поправил: Dr0p2 · Личное сообщение · #12 int Нет нужды что то там городить - маршрутизация позволяет это порешить. Вариантов много, можно например найти инструкцию достаточного размера, либо раскрыть косвенные ссылки если есть. Для этого нужен только LDE. Проблема не в этом. Сам по себе патч - порча целостности кода, это не должно использоваться. Лишь только в целях отладки. Обычно есть другие методы, но они гораздо более сложнны, посему и не юзаются. Выгрузка кода это довольно сложная задача, без полной остановки система она не решается(если патч не атомарный). В данном случае патчить приватную KiDispatchException(не говоря вообще про N/A страницы, как их тс юзает - это полный ппц) извращенье. Есть годная KDR, причём полноценный код со всеми нюансами и реализациями в сайд моторе. Бери дамп и юзай(микод же). MickeyBlueEyes Zw стабы формируют т-фрейм, после чего вызывают Nt-апи. Вне фрейма их нельзя дёргать(в общем случае, нужно хотя бы превмод задать соответствующий). Дальше наверно будет вопрос про вызов сисколов из ядра(на такое все натыкаются, идём на аверлаб) |
|
Создано: 06 января 2014 00:00 · Поправил: Rockphorr · Личное сообщение · #13 Dr0p я вот читаю ваши куски матчасти -- системненько так, читать приятно (определения и т.д.)-- вот бы полную версию получить матчасти в вашем изложении (в приватик можно ссыль кинуть) reversecode пишет: на васме матами этой части полно не ну без шуток же ну и последние сурсы с елито форума там же тоже выкладывали, полагаю они тоже основаны на тех же мата нах не, мне ту теорию где матов нету а есть ясные определения словарь появился еще на руткитсах по моей просьбе но это очень малая толика --- походу обломс -- вопрос исчерпан -- будем сушить воду из книг |
|
Создано: 06 января 2014 01:39 · Поправил: reversecode · Личное сообщение · #14 |
|
Создано: 06 января 2014 16:22 · Личное сообщение · #15 Rockphorr Не знаю о какой матчасте вы говорите. Что не скажу, вы наверно рассматриваете как некую цитату из несуществующих доков > матами этой части полно У меня корешь есть, так если с ним что то техническое перетирать когда он пьян, то говорит "не ругайся, тише" | Сообщение посчитали полезным: corps |
|
Создано: 06 января 2014 23:13 · Личное сообщение · #16 |
|
Создано: 12 января 2014 16:47 · Личное сообщение · #17 |
|
Создано: 12 января 2014 23:39 · Поправил: MickeyBlueEyes · Личное сообщение · #18 Тута пытаюсь int 1 перехватывать, прямо из IDT, делаю такой трюк Code:
Дык почему нельзя то ) !analyze -v Code:
Сорь если очередная тупая ошибка ) Ну некоторые API прокатывают, а в случае из PsGetCurrentProcess() или PsGetCurrentProcessId() синь. |
|
Создано: 13 января 2014 09:50 · Личное сообщение · #19 |
|
Создано: 13 января 2014 16:18 · Личное сообщение · #20 |
|
Создано: 13 января 2014 17:00 · Личное сообщение · #21 Сколько ни рыл-значит, нисколько не рыл. Ну давай поищу и потыкаю сам-http://deroko.phearless.org/doer_src.zip Примеров кода с перехватом прерываний полно, хоть 3 местами сразу есть можно. И там эти сегментные регистры заполняются нормально, чем у тебя и не пахнет. И как только PsGetCurrentProcess полезет по fs, у тебя всё накрывается. И открой уже ман интела/амд и почитай про iret, сколько там вообще параметров, когда и какие. | Сообщение посчитали полезным: MickeyBlueEyes, Dr0p |
|
Создано: 13 января 2014 17:31 · Личное сообщение · #22 |
|
Создано: 13 января 2014 17:59 · Личное сообщение · #23 Дероковский код это сказочный пи***ц, приводить его в пример не особо круто. Хотя автор темы тоже совершает ошибку, делая код не читаемым. Поясню. MickeyBlueEyes Вы делаете ассемблерные вставки. Зачем они вам в коде? Писать асм-вставками не кошерно. Есть два приема чтобы этого НЕ делать. Первый прием заключается в том, чтобы делать кросс-проекты, состоящие из ASM и C исходников. Потом все это собирается в объектные файлы и уже далее компонуется. Второй прием использовать специальные функции компиляторов, не входящие по объективным причинам ни в какие стандарты (т.к. платформ-зависимые), позволяющие не создавать помойку из кода, а использовать недоступные без ассемблера инструкции через intinsic-функции или по-другому "интринсики". Ну т.е. делать вы конечно можете как угодно и что угодно. Но если вас прикалывает писать на каждой строке __asm - тут уж ничего не поделать. Это все равно что смешивать всю еду на тарелке мясорубкой, заливать сверху чаем и только потом употреблять в пищу. К сожалению действительно стоящей документации и примеров нет. (Тут конечно сейчас набежит толпа народа для холивара, но я буду защищаться ). Можно (и нужно) читать маны AMD/Intel. Но это очень абстрактные документы. В них есть много недостатков. Первый который напрашивается, так это то, что при изучении любой предметной области иногда возникают вопросы "а почему"? Ну так вот ответов во всяком случае у Intel на вопросы "почему?" нет. Частично эти ответы есть здесь: Что там дальше по документации. Приближаясь к kermel-mode программированию в контексте винды еще есть Руссинович, Рихтер, Мэт Питтрек, Шрайбер и многие другие. Но чтение этих книжек это как хождение по минному полю, о примерах По поводу сегментных регистров, согласен с Archer'ом. Это вам надо маны по процессорам почитать (том 3, если конкретнее), а также перенести эти знания "на призму Windows", т.е. понять куда указывают сегментные регистры в режиме ядра и какими они должны быть. | Сообщение посчитали полезным: MickeyBlueEyes |
|
Создано: 13 января 2014 18:15 · Личное сообщение · #24 Как грамотно изложили. По поводу асма полностью с вами согласен, уже отложена книга в ящик, а точнее пару глав с неё по написанию модулей на АСМе и дальнейшей компоновкой. Просто сейчас приоритетней kernel mode, вот и пишу пока как получается ) До манов интелов ещё не добирался ) Сейчас читаю известный четырёх томник "Микропроцессор i486. Архитектура и программирование", нравится, очень хорошо расписано, аналогов походу нету, книга хоть и 93 года, но актуальна как по мне. Руссиновича с первого раза не потянул, бегал со стороны в сторону, щас вроде как уже норм, осилить смогу. Люкмор с селекторами убил ) У меня у самого сложилось чтото вроде этого после прочтения главы по сегментам из "Микропроцессор i486. Архитектура и программирование". |
|
Создано: 13 января 2014 18:20 · Личное сообщение · #25 Dr0p пишет: Нет, это не тот вектор. Вам нужен #PF(14-й дескриптор). MickeyBlueEyes пишет: Да 0x14 , то уже путаться начал. Только я обратил внимание на ошибку? 0x14=20 = #VE Virtualization Exception. А вот #PF это 0x0E = 14. Опять-таки, ман интела, том 3. Глава 6.3, там есть таблица "Table 6-1. Protected-Mode Exceptions and Interrupts". В ней перечислены все аппаратно генерируемые исключения и прерывания. |
|
Создано: 13 января 2014 18:32 · Поправил: MickeyBlueEyes · Личное сообщение · #26 |
|
Создано: 13 января 2014 19:49 · Поправил: dosprog · Личное сообщение · #27 int, Например, можно так: - - - - - - - - - - - - - - - ->8 __asm { pushfd mov ecx,eax .................. .............. popfd } - - - - - - - - - - - - - - - ->8 - и не придётся заморачиваться с раздельной компиляцией C/ASM. Всё равно переносимость тут и не нужна. MickeyBlueEyes, ))) если имеете в виду четырёхтомнк Григорьева - да, книга хорошая (можно сказать, единственная в своём роде), но безобразная вёрстка таблиц, опечатки, и в первом томе все 6 примеров кода (в конце) никуда не годятся. Побиты при вёрстке и безграмотном наборе. Работают только после изменения ~30% кода, так что не обольщайтесь. И - да, напрягает, что всюду в той книге номера прерываний в десятичной системе. Зато - хорошее, передранное из интеловских мануалов, описание системы команд. |
|
Создано: 13 января 2014 20:11 · Личное сообщение · #28 |
|
Создано: 13 января 2014 20:14 · Личное сообщение · #29 dosprog Это довольно убогий стиль. Речь шла не про переносимость. Проблем с раздельной компиляцией нет - для этого надо просто настроить проект. Archer +1, я пытался вспомнить почему в Visual Studio нельзя использовать __asm, действительно, причина кроется именно в x64 версии. И вот тогда будет действительно сложно заниматься переносом каши из кода на сях и на ассемблере, не говоря уже о необходимости поддерживать нововведения x64. Такой код просто выбрасывается на помойку и все. У Зубкова кстати тоже тексты битые в электронной книге. Но что-то мне подсказывает, что в оригинале тоже были проблемы (в смысле в бумажной версии). Archer Инди делает технологии. И по крайней мере не занимается смешиванием двух видов кода, а делает его на православном ассемблере. По поводу переносимости кода между ОС вопроса нет. В линуксе до сих пор даже близко нет аналога SoftICE. Быть может потому, что он никому на фиг не сдался? Весь код открыт, отладить все можно в gdb. Тем более смешно наблюдать, как некоторые товарищи жалуются, что у них в маке проблемы с инструментами. В маке даже защитить от крекеров проги сложно, там достаточно IDA для любого взлома. Что касается переносимости кода между билдами ОС, это не проверенная информация, а в основном лозунги тех, у кого что-то не получилось запустить. Объективных баг-репортов не было. А критиковать каждый может. QU например, тоже As Is поставляется, но не лишен багов. | Сообщение посчитали полезным: dosprog |
|
Создано: 13 января 2014 20:25 · Поправил: dosprog · Личное сообщение · #30 int, Зубков... Там практически ни один пример без правки не работает. (В бумаге всё так же, как и в эл.версии). Особенно меня развеселил примерчик с "нереальным 86" режимом. Там не опечатки, а то-ли дралось откуда-попадя, то-ли специально так сделано (не верится,хотя...). "Нереальный 86" мне обошёлся в неделю времени с этим самым Григорьевым в зубах. Какой там интернет... Archer,да. P.S. и присоединяюсь к сказанному int'ом в предыдущем посте. |
|
Создано: 13 января 2014 20:30 · Личное сообщение · #31 |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . >> |
eXeL@B —› Программирование —› Перехват прерываний и исключений |