|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
|
jungle |
|
|||
Аппаратный кодер Профиль Группа: Участник Сообщений: 40 Регистрация: 17.1.2006 Где: Беларусь Репутация: нет Всего: нет |
OK. И еще вопрос, если позволите, многоуваемый All. Автор статьи говорит об отсутствии возможности применить блок try-except-end, но вот в сырцах драйвера тов. microxa для считывания физ. памяти этот блок присутствует. Причем, microxa заявляет о нормальной компиляции и т.д. И кто не прав?
|
|||
|
||||
Alexeis |
|
|||
Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Есть такие соображения, что если код драйвера вызывается при обработке прерывания, то аппаратное исключение может не сработать ведь его приоритет может оказаться более низким, чем у кода обработчика прерывания, вот он и будет ждать окончания работы.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Riply |
|
|||
Опытный Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Присутствует - не означает работает. Надо у него спросить на чем основано его утверждение о "нормальной компиляции". На том, что успешно создается sys - файл ? Если так, то этого мало. Код ama-kid`а тоже будет успешно собираться и компилироваться с try/finally блоками. Но вот если "перехватить" жалобные крики dcc32.exe в процессе компиляции, то там можно увидеть примерно следующие строки: Shd_QuerySys.obj: error LNK2001: uresolved external symbol @@HandleFinally$qqrv |
|||
|
||||
Alexeis |
|
|||
Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Это уже ошибка линкера. Но ведь линкер используется другой, может он подставляет туда то что нужно из RTL. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Riply |
|
|||
Опытный Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Угу. Перепутала. Sorry.
Полностью согласна. Именно поэтому я и написала, что "Надо у него спросить на чем основано его утверждение" А без его пояснений, нам остается только гадать на кофейной гуще |
|||
|
||||
Акакий |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
Всем здравствуйте! Пишу (точнее - пытаюсь написать ) свой первый драйвер на основе исходников уважаемого ama_kid.
Перехватываю ZwMapViewOfSection. Новая функция NewZwMapViewOfSection при выполнении некоторых условий должна изменять содержимое памяти, возвращенное "оригинальной" ZwMapViewOfSection. Код замещающей функции:
В данном примере изменение памяти происходит в случае, если ее 2-й байт равен 81 (буква "Q"). Открываю блокнотом текстовый файл, начинающийся с "QQQQQ....". Блокнот запускается после чего виндовоз уходит в перезагрузку. Если убрать присваивание BaseAddress:=pp, то перезагрузки не происходит. Я не делаю там Unmap(BaseAddress), т.к. это отладочный вариант. Попытка воспользоваться ZwAllocateVirtualMemory не помогла. Пожалуйста, объясните мне, как нужно правильно делать. P.S. Сильно подозреваю, что в моем коде, мягко выражаясь, много неправильного, а более точно - там вообще один бред :( Но все-равно я верю в то, что найдется добрый человек и укажет мне на мои ошибки Это сообщение отредактировал(а) Акакий - 6.7.2009, 16:29 |
|||
|
||||
Riply |
|
||||
Опытный Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Т.е. при любом вызове ZwMapViewOfSection (кем угодно !) она с вероятностью 1/256 возвращает бред, а мы удивляемся почему падает система ? Т.е. при отладке память бесконечна ?
Осознание сего факта - большой шаг вперед (без смайлика) Для того чтобы перехватывать, надо очень хорошо понимать и чуствовать как работает перехватываемая функция. Какие, где и когда будут последствия от твоего изменения. У тебя этого понимания пока нет. И двумя, тремя словами его не дать. Так что, садись за книги. |
||||
|
|||||
Акакий |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
Riply, благодарю за отзыв.
Да это я знаю, просто это "сиюминутный" отладочный вариант. Ну добавлю я анализ хендла на принадлежность его блокноту - это ничего не изменит. Я гружу драйвер, открываю блокнотом все файлы, начинающиеся не с "QQQQQ..." и все прекрасно открывается, но как только я открою "QQQQQ..." - сразу reboot. Сделал перехват ZwRead/WriteFile, все прекрасно работает(происходит расшифровка/шифрование "на лету"). А блокнот пользуется "маппингом" вот и встала задача перехвата ZwMapViewOfSection.
См. выше
Ну читал я все эти книги (заранее принимаю аплодисменты, но все же не верю в свою безнадежность ) Перехватом я занимаюсь уже давно, только вот в ринг 3. В ринг 0 кодил, испрользуя Call Gate (шлюз вызова в GDT). Это сообщение отредактировал(а) Акакий - 6.7.2009, 20:38 |
||||||
|
|||||||
Riply |
|
|||
Опытный Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Так. Давай с самого начала. Ты спрашиваешь почему "виндовоз уходит в перезагрузку". Я дала тебе (для начала) пару причин, по которым это может происходить. 1. При "заргузке блокнота" ZwMapViewOfSection может вызываться отнюдь не один раз и не только для чтения содержимого твоего файла. Откуда у тебя может быть уверенность, что при загрузке какой-нибудь библиотеки, ты не возвращаешь мусор вместо ее образа ? 2. ZwMapViewOfSection может быть вызвана не только блокнотом, а кем угодно (Система живет и работает). Откуда у тебя уверенность, что в течении твоего опыта она не вызвалась 567 раз и суммарный объем выделенной тобой памяти при этом не привысил максимально возможный ? (Кстати и здесь существует вероятность возврата мусора вместо образа) Мне кажется, что сначала надо исключить возможность перезагрузки по любой из этих причин, и только потом идти дальше. |
|||
|
||||
Акакий |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
1. Сделал проверку на принадлежность хэндла процессу блокнота. 2. Заменил символ "Q" уникальной комбинацией из 100 символов (сильно сомневаюсь, что данная последовательность байтов может быть где-то еще). Результат тот же. Уточню свой вопрос: параметр BaseAddress функции ZwMapViewOfSection содержит адрес переменной, в которую ZwMapViewOfSection засылает адрес спроецированного объекта (в моем случае - файла) или ZwMapViewOfSection шлет этот адрес непосредственно в переменную BaseAddress (Var BaseAddress)? Мелкомягкие пишут, что BaseAddress - это "Pointer to a variable that receives the base address of the view". Значит, вроде как BaseAddress должен указывать на переменную с адресом. Да и у Рема в его NativeAPI.pas этот параметр идет без "var". Только вот я пробовал оба варианта - результат одинаковый - при попытке подменить BaseAddress, или записать по адресу BaseAddress новый адрес "спроецированной" памяти виндовоз уходит в ребут. |
|||
|
||||
Riply |
|
||||
Опытный Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
В данном вопросе я их слушаюсь и все работает Устрани и остальные скользкие моменты:
у меня нет уверенности в том, что при любом вызове, ViewSize <> nil, BaseAddress <> nil, BaseAddress^ <> nil. Так же у меня нет уверенности, что ViewSize^ < максимальный размер памяти, который мы можем выделить. А почему тогда сначала не оттестировать перехват в user mode ? (Тем более, если нет уверенности в правильном понимании параметров ф-ии ZwMapViewOfSection) |
||||
|
|||||
Riply |
|
|||
Опытный Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
||||
|
||||
Акакий |
|
||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
Хорошая мысь, спасибо, нужно попробовать. В user mode я перехватывал MapViewOfFile/Ex, но блокнот ее не вызывает, что есть несколько странно(блокнот пользуется только функциями Zw?). Попробую перехватить ZwMapViewOfSection из ring3, но у меня странное предчуствие, что из блокнота она не будет вызываться.
Это да, при выделении памяти в драйвере я получаю память в сегменте данных нулевого кольца(селектор с RPL=0), а в блокноте, скорее всего, имеем 3-е кольцо (RPL=2) и может получаться некорректное смещение относительно базы сегмента данных блокнота. Пробовал делать ZwAllocateVirtualMemory, но она не работает, по крайней мере при вызове из ring 3. |
||||
|
|||||
Акакий |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
Перехватил ZwMapViewOfSection в ринг 3. Блокнот вызывает эту функцию, но использует ее только для вывода списка файлов, а сами файлы он читает с помощью чего-то другого. Интересно, при перехвате этой функции в ринг 0 она вызывается и при загрузке блокнотом файлов. Отсюда и происходят мои сомнения о корректности перехвата Zw функций в ринг 3. Кстати, на форуме rsdn, кто-то "жаловался", что от блокнота не приходит IRP_MJ_READ.
|
|||
|
||||
Акакий |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
Все, разобрался.
Riply, спасибо. Это сообщение отредактировал(а) Акакий - 7.7.2009, 13:54 |
|||
|
||||
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |