Сейчас на форуме: jinoweb, bartolomeo, rmn (+4 невидимых) |
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:
|
|
Создано: 20 января 2014 19:24 · Личное сообщение · #2 Перевод разделов 1 - 13 (кроме IA-32e, раздел 14, и детального описания обработчиков прерываний, раздел 15). Надеюсь кому-нибудь поможет, если кто найдет ошибки или неточности, просьба сообщить для исправления. Термины старался переводить, находя их в интернете (в том числе использовались русскоязычные источники Intel и сайты посвященные разработке ОС). e57a_20.01.2014_EXELAB.rU.tgz - Intel_Vol3C_Ch6_Interrupt_and_exeption_handling.docx | Сообщение посчитали полезным: MickeyBlueEyes |
|
Создано: 20 января 2014 21:25 · Личное сообщение · #3 |
|
Создано: 22 января 2014 19:03 · Поправил: MickeyBlueEyes · Личное сообщение · #4 Вот я тут пишу фичу по вызову юзермодных апи из ядра ну и возврата назад в ядро, и столкнулся с некой я даже незнаю как назвать проблемой, но подумаете вы что опять я туплю, но нет! Я подключил дебагер всё как нужно делаю, роспишу план действий и подкреплю скринами ) 1. В IDT выдяляю себе вектор [83] для того чтобы возвратится из 3 в 0. 2. Ставлю на этот вектор DPL=3, чтобы его можна было заюзать из 3 кольца,ну и вешаю обработчик. 3. Аттачусь к процесу в котором мне нужно будет заюзать апи. 4. Выделяю там память, делаю её общей с ядром с помощю IoAllocateMdl. (Память выделяю в PagedPool размером 512байт). 5. Начальный адрес этой памяти будет указывать на наш шел. Записываю в начало шела [ mov edi,xxxx ] где x-айди нашей функции в юзермоде, ну это чтобы знать как вернёмся в ядро какая ф-ция отработала, так как не одну же ф-цию планирую вызывать, и следом int 83. 6. Пишу этот шел в наше начало выделеной памяти. 7. Из нашей памяти беру память для стека. pESP=pShell+508, стек же растёт к меньшим адресам, стека должно хватать. 8. pESP - указатель на int. Пишу в pESP[0]=pShell. pESP -стек для вызываемой ф-ции из юзермода, в pESP[0]-собственно точка возврата, так как аргументов ф-ция не принимает. 9. Аттачимся к процессу, заливаю такое: Code:
10.Слежу под отладчиком, прыгаем на функцию, функция отрабатывает, return и делает ретурн на наш шел, всё отлично, шел отрабатывает. Code:
11. Попадаем в наш обработчик, и тут первая фича которую я не вкурил, в юзермоде fs равнялся 0, ну я его и не загружал, ну как я понял, селектор fsa юзермода можна загрузить только в юзермоде, тоесть ещё нужно писать шел(mov fs,xx) перед тем как выполнить функцию из юмода? Ну у меня тестовое приложения, fs был не задействован, ну суть не в этом. Но прыгнув в обработчик [83], fs сам стал корректным для ядра. Не понял, переключения задач не было tr не менялся. Ну и ладно, пока это не проблема номер, но буду признателен если кто подскажет. 12. Тут самое интересно. В обрабочике, смотрим айди отработаной ф-ции, ищем в массиве структуру с этим айди, выбираем сохранёный контекст из найденой структуры, ну как контекст(ebp,esp и EFlags), хвататает. Всё востанавливаем и джамп на сохранёное место следом за CallBack(пид процесса,имя зарегистированой ф-ции). Скрин номер 1: Ну собсно колбек и есть тот самый и за ним сразу мы пригаем, проверял я esp и ebp всё сходится с орыгиналами и ефлагс, и тута дохажу с F8 до места выделеным синим, и ищё раз жму, ну что тут может такое произойти?[mov esp, ebp] как бы и всё и получается вот такое: Ну это так не часто, в основном место такого этого всё забито вот такими вот знаками ????????????????????????????. Ну всего 2 варианта, либо такой скрин либо ??????????????. Ну что может быть не так? Долго сам пытался понять чесно, аж депресняк начинается ( |
|
Создано: 22 января 2014 23:25 · Личное сообщение · #5 MickeyBlueEyes KeUserModeCallback/KiCallUserMode() ? - пишу по памяти. Но врятле я ошибся. Прыгнуть в юзермод довольно таки сложно. 1. Дескриптор наврятле валиден. Далее на втором камне новая IDT. 4. MDL есть описатель региона. Его не достаточно выделить, его нужно отобразить. 7. Стек r/w, да есчо и код(в том же сегменте) executable, тоесть что то у вас тут не в порядке. 11. => выше сказанное не актуально. => > первая фича которую я не вкурил, в юзермоде fs равнялся 0 Селекторы юзермодные по воле христа спасителя загружены будут, или быть может заюзаем ядерные и наткнёмся на фолт ? > mov esp,ebp Инструкция сия не может фолты генерить, если она не первая исполнилась и не в начале страницы. Инвалидный трап фрейм. | Сообщение посчитали полезным: MickeyBlueEyes |
|
Создано: 22 января 2014 23:51 · Поправил: MickeyBlueEyes · Личное сообщение · #6 1. Один процессор, ну назад в ядро прыгает через прерывание всё гуд. 4. Мдл отображён, KeAttachProcess и следом MmMapLockedPagesSpecifyCache. 7. Да, шел и стек лежит в одной страничной r/w области. Чем это может быть проблемно? Всё сразу не прочёл ) Ну в ядре fs 0x30, ну в юзер мод кода прыгнул стал 0, но суть не в этом, а в том что после прерывание в юмоде, и попадания в ядро, fs сам становится корректным c 0 на 0x30, можете подсказать почему так происходит? mov esp,ebp Да, если например самому написать сразу после CallBack: Code:
То это всё выполнится хорошо, но дальше, а вот что было дальше щас гляну, а то дело было вчера. Поясните пжл "Инвалидный трап фрейм" ЗЫ: ну практически такое должно работать? |
|
Создано: 23 января 2014 01:13 · Поправил: MickeyBlueEyes · Личное сообщение · #7 Начал криминалистический анализ, почему сразу то не проверил, значения памяти на которое указывает ebp перед вызовов CallBack и сразу после него отличается, вот так. Но всёровно почему та команда не выполняется,хз. Но после того как я прописал вручную это: Code:
То всё прошло ок, но после ретурна выпало тоже самое что и раньше в mov esp,ebp. Чисто предполагаю что глючит дебагер и просто ест всё сразу вполть до ретурна, ну так чисто догадка. |
|
Создано: 23 января 2014 01:22 · Поправил: MickeyBlueEyes · Личное сообщение · #8 ХА! Протрейсил я до перехода в юмод, и сразу же после iretd в нашем орыгинальном ebp адресс указывает на нули, и так протрейсил я всё, вернулся в ядро всё так и осталось по нулям. Почему так) Несколько часов спустя....... В юмод прыгаю так, всёрогно нули. Code:
Что процессор может делать с памятью? |
|
Создано: 23 января 2014 09:50 · Личное сообщение · #9 Во-первых, пользуйся кнопкой "Правка", не создавай сообщения подряд. А во-вторых, я бы не слишком надеялся на отладчик, когда дело касается совсем низкого уровня, он сам хукает часть низкого уровня и может влиять на работу. В критичных местах лучше дебажный вывод ставить или краш и смотреть пост-мортем. | Сообщение посчитали полезным: MickeyBlueEyes |
|
Создано: 23 января 2014 11:01 · Личное сообщение · #10 |
|
Создано: 23 января 2014 11:51 · Личное сообщение · #11 Dr0p пишет: iret не изменяет fs. Если CPL селектора сегмента данных (ds,es,fs и gs) равен CS.CPL, то iret при возврате в менее привилегированный сегмент кладет 0 в соответствующий селектор, чтобы предотвратить использование менее привилегированным кодом более привилегированных селекторов Archer пишет: я бы не слишком надеялся на отладчик, когда дело касается совсем низкого уровня +1 Еще и виртуалка может подглючивать, самый низкий уровень правильней отлаживать на реальном железе | Сообщение посчитали полезным: MickeyBlueEyes |
|
Создано: 23 января 2014 18:36 · Поправил: MickeyBlueEyes · Личное сообщение · #12 Ну вот заменил я и прыжок с юмода в кмод на sysenter, всё по прежнему, память на которую указывать должен мой родной ebp имеет вначале все забито нулями, затем другие значения. Перед прижком в юмод, по адресу который лежит в ebp, изменяется фиксированое количество памяти, примерное ebp + 120байт, такое ощущения что перед прижком в юмод либо через iretd | sysexit, затирается стековая память моего драйвера. |
|
Создано: 23 января 2014 20:43 · Личное сообщение · #13 spinz > Если CPL селектора сегмента данных (ds,es,fs и gs) равен CS.CPL, то iret при возврате в менее привилегированный сегмент кладет 0 в соответствующий селектор Может это и так(допускаю вероятность, так как не знаю). А ман лень смореть. В любом случае это поведение камня не стандартное, так же как и обнуление рпл при нулевом селекторе. Возможно оно разное на интеле и амд. Честно говоря мне всёравно. Если содержимое сегментных регистров валидно, то нет траблов с ними. Вы же цитируете сюда маны и не можите тупо прыгнуть на другой кпл > заменил я и прыжок с юмода в кмод на sysenter, всё по прежнему, память на которую указывать должен мой родной ebp Опять же. Какое отношение rEbp имеет к сисколам ? У вас память NX вероятно, ну или не выделена. Вообще же как я уже и говорил стопицот раз - полнейшее извращенье. Вменяемый человек не будет в мср вектора писать, чтобы дёрнуть свой код в ядре. Маразм. Я прекрасно вас понимаю, нуль опыта, только маны изучать начал, перетереть желание и выделиться etc. Но результаты вашей жизнидеятельности говорят сами за себя - нуб. |
|
Создано: 23 января 2014 20:48 · Поправил: Dr0p · Личное сообщение · #14 Последний раз отвечаю вам по сути задачи - дескрипторные таблицы защищены, да и не только они. Любое вмешательнство в механизм прерываний - детект. Фолты фильтруются методом сайда. Ну а прерывания никому не нужны, используются штатные механизмы. В случае тс - он только начал ядро и архитектуру изучать достаточно тупо дёрнуть халовский рантайм(KeIpiGenericCall(), KeSetAffinityThread() etc) для настройки дескриптора. Сами ISR опенсорсные - trap.asm. Пойми дружище что твой каждый трабл никто не будет изучать. Изучил подробно инструкцию sysenter - труъ, вот только в целом сути то не видишь. Можно через используемый ядром диспетчер передать любые данные. Дальше сказать н6ечего, только караемый модерами психоанализ Решение тс задачи было приведено в начале ветки. В данном случае задача уже смысла не имеет, попёрло обсуждение чисто теории/матчасти. |
|
Создано: 23 января 2014 21:49 · Поправил: MickeyBlueEyes · Личное сообщение · #15 > Опять же. Какое отношение rEbp имеет к сисколам ? Да никакого, может я не так изложил, просто перед тем как вызвать юмод апи, я же сохраняю ebp, чтобы потом вернувшись из юмода в ядро сразу за вызовом юмод апи, востановить этот ebp и тд... и дальше продолжить выполнения драйвера как нивчём не бывало. Ну и ганяю в юмод c помощю sysexit, и обратно в кернел с помощю sysenter. И как только выполняется sysexit и я попадаю в юмод(fs кстати в этом случае не изменятся и остаётся ядерным = 0x30), мой ранее адрес который в ebp перед вызовом, уже указывает на сплошные нули в памяти, примерно ebp + 100 = 00000.... > Я прекрасно вас понимаю, нуль опыта, только маны изучать начал, перетереть желание и выделиться etc. Но > результаты вашей жизнидеятельности говорят сами за себя - нуб. Ну действую согласно тому что пишут в литературе, по моей теории которая сложилась всё должно бы было работать, а там вот как получается ) Чуть более месяца назад только написал свой первый хелло ворлд в ядре. Ну выделится не, а вот довести до конца тему которую начал очень хочется, а то прыгать с ветки на ветку не очень. Да и всё остальное само как то усваивается по мере изучения данной темы. > Пойми дружище что твой каждый трабл никто не будет изучать. Да ну я в надежде что кто то сталиквался/знает такую проблему, а мысли и не было чтобы неплохо бы было если бы ктото изучил проблему и помог мне. В основному пару подсказок, хоть и смысл слов не понятен, но пару дней поразбиратся и проясняется. > У вас память NX вероятно, ну или не выделена. Вообще же как я уже и говорил стопицот раз - полнейшее > извращенье. Вменяемый человек не будет в мср вектора писать, чтобы дёрнуть свой код в ядре. Маразм. Ну с памятью которая выделена для стека и кода всё нормуль, да и если бы не нормуль, то это уже была бы другая проблема. "МСР вектора"? Ну так для справки, прыгать я начал из юмода обратно в кмод, ну с помощю sysentera, просто в SDT увеличиваю лимит до 455, и в какую нить 453 ячейку таблици пишу свою фунцию, и в соот.. ячейку количество байт(аргументов), прыгаю в кмод, результат выполнения фуции юмода лежит на стеке, всё считывается, и всё гуд, не гуд только с моей памятью на которую ссылается ebp перед вызовом апи юмода. А так реально решить такие проблемы, в рунете можна на пару форумах и всё, да и в европе вроде как такие темы не очень актуальны, не понимаю почему, но в этой сфере намного интересней. Ну вот как то так ) ...... Решил я попробывать воспользоватся регистрами отладки, и залить в один из регистров свой магический адрес, чтобы узнать кто же его изменяет, но виртуалка с виндой подгружается уже с загруженым DR6 в котором бит защиты регистров установлен. И ниобнулить его, ни отладить не получается. Замкнутый круг. |
|
Создано: 24 января 2014 20:17 · Личное сообщение · #16 MickeyBlueEyes > перед тем как вызвать юмод апи, я же сохраняю ebp, чтобы потом вернувшись из юмода в ядро сразу за вызовом юмод апи, востановить этот ebp Это не просто регистр, он отличается от остальных RGP. Нельзя рвать SFC. Это фундаментальная истина. Наверно ща будет вопрос что за SFC -- тут типо вики есть. > ганяю в юмод c помощю sysexit Извращенец, что тут скажешь. Очевидно что не наигрался с этим. > Решил я попробывать воспользоватся регистрами отладки Чем моё решение в юзермоде не устраивает ? - недетект. - в ядре быстродействие не повышается при использовании дск таблиц. - в ядро нужно есчо как то попасть. |
|
Создано: 24 января 2014 20:27 · Личное сообщение · #17 > Чем моё решение в юзермоде не устраивает ? Та всем устраивает, только нада в процесс попасть незаметно. Из-за чего и весь сербор с вызовом апи из юмода из ядра. Реально dll подгрузить вручную, так чтобы аверы не пропалили? Ну регистра отладки я тут пытался использовал чтобы выявить кто мою память изменяет. |
|
Создано: 24 января 2014 20:31 · Личное сообщение · #18 |
|
Создано: 24 января 2014 20:36 · Поправил: MickeyBlueEyes · Личное сообщение · #19 > Что это значит ?? Ну тоисть что я не могу подрузить длл в ап процесса незаметно чтобы юзать его апи, и приходится извращатся вызовом апи процесса из ядра. Ну поигрался и харе походу с этим способом, попробую dll загрузить беспалевно тогда. Ну всёрогно когда то пожжа нада бы всётаки докопатся почему у меня память портилась, так чисто из за спортивного интереса. |
|
Создано: 24 января 2014 20:38 · Поправил: Dr0p · Личное сообщение · #20 MickeyBlueEyes Проблемы с загрузкой может быть три. 1. Хипс. Проактивная защита детектит. В таком случае суть вопроса - повышение привилегий. Это затычки(как моё описание для клифа), эксплоиты, либо легальные механизмы(хотя они врятле имеются). 2. Виртуальные машины, аверкие эмуляторы - детект в динамике. Не являетсая даже задачей, ибо решена на года вперёд через универсальные средства антиэмуляции. 3. Левый детект. Это типо EMET etc. Что из этого вам нужно ? |
|
Создано: 24 января 2014 20:52 · Личное сообщение · #21 |
|
Создано: 24 января 2014 21:06 · Личное сообщение · #22 |
|
Создано: 24 января 2014 21:09 · Поправил: MickeyBlueEyes · Личное сообщение · #23 |
|
Создано: 24 января 2014 21:12 · Личное сообщение · #24 |
|
Создано: 24 января 2014 21:16 · Личное сообщение · #25 |
|
Создано: 24 января 2014 21:19 · Поправил: Dr0p · Личное сообщение · #26 MickeyBlueEyes Это в корне всё меняет. Античит как угодно палить может ваши модуля. Тут вам и ядро не поможет. Для начала вам необходимо определить что палится. И вообще, я всё больше склоняюсь к мнению, что сей форум есть сборище гадалок, я одна из них Воспользуюсь моментом и спрошу. Почему вы сразу не спросили в первом посте "как обойти палевность античитом" ? |
|
Создано: 24 января 2014 21:31 · Поправил: MickeyBlueEyes · Личное сообщение · #27 Ну фрост хукает ядерные апи, там открытие процесса, скрывает процесс, хуки на win32k.sys, драйвера фильтры на клаву и мышу. Шилд там поболее наворотов, но ищё чёто творит с длл с их експортом приложения, у них там по 2 експортируемые функции и всё, запускал смотрел в пеб и что експортирует то тоже самое, скрытые системные dll видно, так чисто поток мыслей) Реально проецировать модули и брать експорты с других мест? ....... >> Воспользуюсь моментом и спрошу. Почему вы сразу не спросили в первом посте "как обойти палевность античитом" ? Ну что это важно незнал. |
|
Создано: 24 января 2014 21:42 · Личное сообщение · #28 MickeyBlueEyes > Ну что это важно незнал. Для вас может и нет, для меня это важнее чем сабж. Потому что таких случаев было хз сколько, а мне важно найти общую между ними связь, тоесть причину не способности сформулировать задачу. > фрост хукает ядерные апи, там открытие процесса Ну вот уже что то. Дров в студию. Не знаю как, когда и где его разбирать, сделайте это сами. 1. Запускаете детектор патчей, rku, gmer etc. Сморите что и как фильтруется. Желательно и нам показать. 2. Открываете дров идой и находите сами фильтры. 3. Я уверен что лишь не многие сервисы фильтруются и полюбому даже они дырявые. 4. Прорабатываем методы обхода. Ну в общем пока всё. |
|
Создано: 24 января 2014 21:51 · Личное сообщение · #29 |
|
Создано: 25 января 2014 03:50 · Поправил: MickeyBlueEyes · Личное сообщение · #30 Попробывал я только вот всё, как написано, и вроде как чтото получилось. О фросте, приложил файл что дров хукает и дрова. Дров 2шт под х32 и х64 системы, видно как он проверяет стоят ли хуки на ядерных апихах или не. Ну патчить дров хз, палевно походу, та и хучит он вот что, что из этого может пригодится. Code:
Ну это ядерные, в аттаче полный список хуков на апи свого АП. Приложения свои они покрывает темидой? Реально её росковырять? Дрова не громоздкие можна разобрать. Только не увидел драйверов фильтров на клаву и мышу почемуто, походу их и нету, но при загрузке приложений активно отрубается мыша ) Вот у хакшилд там есть фильтра на мышу и на клаву. И хучи вот так он: Code:
Вот такие дела. Более подробно завтра, точнее сеня ) eb52_25.01.2014_EXELAB.rU.tgz - exelab.rar | Сообщение посчитали полезным: Yoyo |
|
Создано: 25 января 2014 11:57 · Поправил: Dr0p · Личное сообщение · #31 MickeyBlueEyes RVA 0x3836 NtOpenProcess. Разыменовывается только CID.PID, без валидации ссылки(можно ядерный адрес передать). Остальная работа не представляет интереса - проверка на открытие текущего процесса и разрешение для некоторых по именам(lsass etc). Процедура защищена сех-ом. Сех открывает процесс и возвращает управление. Тоесть это чистая RC атака на CLIENT_ID. Делаем страницу с этой структурой сторожевой и процесс будет успешно открыт. Далее инжект обычный, тоесть лишь не многие сервисы фильтруются. Ну а работа с пользовательскими модулями тривиальна - загружаем копию модуля с диска и юзаем в обход фильтров. - Дров пришлось олькой дизасмить, так как не нашёл тут иду в инструментах. Откуда её слить ? Хотя олькой удобнее и быстрее Хакшилд тот я никада не видел, но думаю всё ту кучу сервисов можно вызывать и без снятия патчей. Фильтры почти все безграмотно написаны и дырявые. Ну а в целом имея доступ к ядру вообще смысла в этих защитах нет. | Сообщение посчитали полезным: MickeyBlueEyes, Yoyo |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . >> |
eXeL@B —› Программирование —› Перехват прерываний и исключений |