Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Драйверы Windows режима ядра, как это делается в Delphi 
:(
    Опции темы
jungle
Дата 16.6.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аппаратный кодер



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.1.2006
Где: Беларусь

Репутация: нет
Всего: нет



OK. И еще вопрос, если позволите, многоуваемый All. Автор статьи говорит об отсутствии возможности применить блок try-except-end, но вот в сырцах драйвера тов. microxa для считывания физ. памяти этот блок присутствует. Причем, microxa  заявляет о нормальной компиляции и т.д. И кто не прав?
PM MAIL WWW   Вверх
Alexeis
Дата 16.6.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Riply
Дата 16.6.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(jungle @  16.6.2009,  14:59 Найти цитируемый пост)
но вот в сырцах драйвера тов. microxa для считывания физ. памяти этот блок присутствует


Присутствует - не означает работает.

Цитата(jungle @  16.6.2009,  14:59 Найти цитируемый пост)
Причем, microxa  заявляет о нормальной компиляции и т.д.


Надо у него спросить на чем основано его утверждение о "нормальной компиляции".
На том, что успешно создается sys - файл ?
Если так, то этого мало. 

Код ama-kid`а тоже будет успешно собираться и компилироваться с try/finally блоками.

Но вот если "перехватить" жалобные крики dcc32.exe в процессе компиляции, smile
то там можно увидеть примерно следующие строки:
Shd_QuerySys.obj: error LNK2001: uresolved external symbol @@HandleFinally$qqrv



PM MAIL   Вверх
Alexeis
Дата 16.6.2009, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата(Riply @  16.6.2009,  14:17 Найти цитируемый пост)
Shd_QuerySys.obj: error LNK2001: uresolved external symbol @@HandleFinally$qqrv

  Это уже ошибка линкера. Но ведь линкер используется другой, может он подставляет туда то что нужно из RTL.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Riply
Дата 16.6.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(Alexeis @  16.6.2009,  15:20 Найти цитируемый пост)
Это уже ошибка линкера


Угу. Перепутала. Sorry.


Цитата(Alexeis @  16.6.2009,  15:20 Найти цитируемый пост)
Но ведь линкер используется другой, может он подставляет туда то что нужно из RTL


Полностью согласна. 
Именно поэтому я и написала, что "Надо у него спросить на чем основано его утверждение" smile

А без его пояснений, нам остается только гадать на кофейной гуще smile
PM MAIL   Вверх
Акакий
Дата 6.7.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 6.7.2009

Репутация: нет
Всего: нет



Всем здравствуйте! Пишу (точнее - пытаюсь написать  smile ) свой первый драйвер на основе исходников уважаемого ama_kid.
Перехватываю ZwMapViewOfSection. Новая функция NewZwMapViewOfSection при выполнении некоторых условий должна изменять содержимое памяти, возвращенное "оригинальной" ZwMapViewOfSection. Код замещающей функции:
Код

Function NewZwMapViewOfSection(SectionHandle:dword;  ProcessHandle:dword;  Var BaseAddress:Pointer; ZeroBits,  CommitSize:dword; SectionOffset:pointer; ViewSize:pdword;                            InheritDisposition:dword; AllocationType,Protect:dword): NTSTATUS; stdcall;
  Var  pp :PVoid;
 Begin
//вызов "оригинальной" функции
Result:=ZwMapViewOfSectionOriginal(SectionHandle,ProcessHandle,BaseAddress,ZeroBits,CommitSize,SectionOffset,ViewSize,
                                       InheritDisposition,AllocationType,Protect);
    If (Result=STATUS_SUCCESS) and 
       (DWord(ViewSize^)>1) and (Byte(Pointer(DWord(BaseAddress)+1)^)=81) then
      begin
        pp:=MmAllocateNonCachedMemory(DWord(ViewSize^));
        RtlMoveMemory(pp,BaseAddress,DWord(ViewSize^));
        Byte(Pointer(DWord(pp)+1)^):=82;
        BaseAddress:=pp;
      end;
  end;



В данном примере изменение памяти происходит в случае, если ее 2-й байт равен 81 (буква "Q"). Открываю блокнотом текстовый файл, начинающийся с "QQQQQ....". Блокнот запускается после чего виндовоз уходит в перезагрузку. Если убрать присваивание BaseAddress:=pp, то перезагрузки не происходит. Я не делаю там Unmap(BaseAddress), т.к. это отладочный вариант. Попытка воспользоваться ZwAllocateVirtualMemory не помогла. Пожалуйста, объясните мне, как нужно правильно делать. 
P.S.
    Сильно подозреваю, что в моем коде, мягко выражаясь, много неправильного, а более точно - там вообще один бред :(  Но все-равно я верю в то, что найдется добрый человек и укажет мне на мои ошибки  smile 

Это сообщение отредактировал(а) Акакий - 6.7.2009, 16:29
PM MAIL   Вверх
Riply
Дата 6.7.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(Акакий @  6.7.2009,  13:31 Найти цитируемый пост)
В данном примере изменение памяти происходит в случае, если ее 2-й байт равен 81 (буква "Q"). 


Т.е. при любом вызове ZwMapViewOfSection (кем угодно !) она с вероятностью 1/256 возвращает бред,
а мы удивляемся почему падает система ?   smile

Цитата(Акакий @  6.7.2009,  13:31 Найти цитируемый пост)
Я не делаю там Unmap(BaseAddress), т.к. это отладочный вариант


Т.е. при отладке память бесконечна ?   smile

Цитата(Акакий @  6.7.2009,  13:31 Найти цитируемый пост)
 Сильно подозреваю, что в моем коде, мягко выражаясь, много неправильного, а более точно - там вообще один бред 


Осознание сего факта - большой шаг вперед (без смайлика)

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

У тебя этого понимания пока нет. И двумя, тремя словами его не дать.
Так что, садись за книги.
PM MAIL   Вверх
Акакий
Дата 6.7.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 6.7.2009

Репутация: нет
Всего: нет



Riply, благодарю за отзыв.

Цитата
 Т.е. при любом вызове ZwMapViewOfSection (кем угодно !) она с вероятностью 1/256 возвращает бред 

Да это я знаю, просто это "сиюминутный" отладочный вариант. Ну добавлю я анализ хендла на принадлежность его блокноту - это ничего не изменит. Я гружу драйвер, открываю блокнотом все файлы, начинающиеся не с "QQQQQ..." и все прекрасно открывается, но как только я открою "QQQQQ..." - сразу reboot. Сделал перехват ZwRead/WriteFile, все прекрасно работает(происходит расшифровка/шифрование "на лету"). А блокнот пользуется "маппингом" вот и встала задача перехвата ZwMapViewOfSection.

Цитата
 Т.е. при отладке память бесконечна ? 

См. выше  smile 

Цитата

Осознание сего факта - большой шаг вперед (без смайлика).....садись за книги

Ну читал я все эти книги (заранее принимаю аплодисменты, но все же не верю в свою безнадежность smile )

Перехватом я занимаюсь уже давно, только вот в ринг 3. В ринг 0 кодил, испрользуя Call Gate (шлюз вызова в GDT).

Это сообщение отредактировал(а) Акакий - 6.7.2009, 20:38
PM MAIL   Вверх
Riply
Дата 6.7.2009, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(Акакий @  6.7.2009,  20:18 Найти цитируемый пост)
Да это я знаю, просто это "сиюминутный" отладочный вариант


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

Я дала тебе (для начала) пару причин, по которым это может происходить.

1. При "заргузке блокнота" ZwMapViewOfSection может вызываться отнюдь не один раз и не только
    для чтения содержимого твоего файла.
    Откуда у тебя может быть уверенность, что при загрузке какой-нибудь библиотеки,
    ты не возвращаешь мусор вместо ее образа ?

2. ZwMapViewOfSection может быть вызвана не только блокнотом, а кем угодно (Система живет и работает).
    Откуда у тебя уверенность, что в течении твоего опыта она не вызвалась 567 раз
    и суммарный объем выделенной тобой памяти при этом не привысил максимально возможный ?
    (Кстати и здесь существует вероятность возврата мусора вместо образа)

Мне кажется, что сначала надо исключить возможность перезагрузки по любой из этих причин,
и только потом идти дальше.
PM MAIL   Вверх
Акакий
Дата 6.7.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 6.7.2009

Репутация: нет
Всего: нет



Цитата(Riply @ 6.7.2009,  21:22)

1. При "заргузке блокнота" ZwMapViewOfSection может вызываться отнюдь не один раз и не только
    для чтения содержимого твоего файла.

2. ZwMapViewOfSection может быть вызвана не только блокнотом, а кем угодно (Система живет и работает).


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 новый адрес "спроецированной" памяти виндовоз уходит в ребут. 
PM MAIL   Вверх
Riply
Дата 6.7.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(Акакий @  6.7.2009,  22:09 Найти цитируемый пост)
Мелкомягкие пишут, что BaseAddress - это "Pointer to a variable that receives the base address of the view"


В данном вопросе я их слушаюсь и все работает smile

Цитата(Акакий @  6.7.2009,  22:09 Найти цитируемый пост)
1. Сделал проверку на принадлежность хэндла процессу блокнота.
2. Заменил символ "Q" уникальной комбинацией из 100 символов (сильно сомневаюсь, что данная последовательность байтов может быть где-то еще).


Устрани и остальные скользкие моменты:
Цитата(Акакий @  6.7.2009,  13:31 Найти цитируемый пост)
(DWord(ViewSize^)>1) and (Byte(Pointer(DWord(BaseAddress)+1)^)=81) then

у меня нет уверенности в том,  что при любом вызове, ViewSize <> nil, BaseAddress <> nil, BaseAddress^ <> nil.

Так же у меня нет уверенности, что ViewSize^ < максимальный размер памяти, который мы можем выделить.


Цитата(Акакий @  6.7.2009,  20:18 Найти цитируемый пост)
Перехватом я занимаюсь уже давно


А почему тогда сначала не оттестировать перехват в user mode ?
(Тем более, если нет уверенности в правильном понимании параметров ф-ии ZwMapViewOfSection)

PM MAIL   Вверх
Riply
Дата 7.7.2009, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(Акакий @  6.7.2009,  22:09 Найти цитируемый пост)
при попытке подменить BaseAddress, или записать по адресу BaseAddress новый адрес "спроецированной" памяти виндовоз уходит в ребут


А на основании чего мы считаем, что адрес, полученный нами через MmAllocateNonCachedMemory,
может быть безболезненно передан NotePad`у ?
PM MAIL   Вверх
Акакий
Дата 7.7.2009, 06:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 6.7.2009

Репутация: нет
Всего: нет



Цитата

А почему тогда сначала не оттестировать перехват в user mode ?

Хорошая мысь, спасибо, нужно попробовать. В user mode я перехватывал MapViewOfFile/Ex, но блокнот ее не вызывает, что есть несколько странно(блокнот пользуется только функциями Zw?). Попробую перехватить ZwMapViewOfSection из ring3, но у меня странное предчуствие, что из блокнота она не будет вызываться.

Цитата

А на основании чего мы считаем, что адрес, полученный нами через MmAllocateNonCachedMemory,
может быть безболезненно передан NotePad`у ? 

Это да, при выделении памяти в драйвере я получаю память в сегменте данных нулевого кольца(селектор с RPL=0), а в блокноте, скорее всего, имеем 3-е кольцо (RPL=2) и может получаться некорректное смещение относительно базы сегмента данных блокнота. Пробовал делать
ZwAllocateVirtualMemory, но она не работает, по крайней мере при вызове из ring 3.


PM MAIL   Вверх
Акакий
Дата 7.7.2009, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 6.7.2009

Репутация: нет
Всего: нет



Перехватил  ZwMapViewOfSection в ринг 3. Блокнот вызывает эту функцию, но использует ее только для вывода списка файлов, а сами файлы он читает с помощью чего-то другого. Интересно, при перехвате этой функции в ринг 0 она вызывается и при загрузке блокнотом файлов. Отсюда и происходят мои сомнения о корректности перехвата Zw функций в ринг 3. Кстати, на форуме rsdn, кто-то "жаловался", что от блокнота не приходит IRP_MJ_READ.
PM MAIL   Вверх
Акакий
Дата 7.7.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 6.7.2009

Репутация: нет
Всего: нет



Все, разобрался.  smile 
Код

Function NewZwMapViewOfSection(SectionHandle:dword; ProcessHandle:dword; BaseAddress:PPointer; 
                                                        ZeroBits, CommitSize:dword; SectionOffset:PInt64; ViewSize:pdword;
                                                      InheritDisposition:dword; AllocationType,Protect:dword):NTStatus; stdcall;
  Var  pp :Pointer;
         dd :DWord;
  Begin
 Result:=ZwMapViewOfSectionOriginal(SectionHandle,ProcessHandle,BaseAddress,ZeroBits,CommitSize,SectionOffset,ViewSize,
                                       InheritDisposition,AllocationType,Protect);
    If (Result=STATUS_SUCCESS) and (ViewSize<>Nil) and (BaseAddress<>Nil) and (Pointer(BaseAddress^)<>Nil) and
       (DWord(ViewSize^)>1) and (Byte(Pointer(BaseAddress^)^)=81) then
      begin
        pp:=Nil; dd:=DWord(ViewSize^);
        If ZwAllocateVirtualMemory(ProcessHandle,@pp,0,@dd,$1000,4)=STATUS_SUCCESS then
          begin
            RtlMoveMemory(pp,Pointer(BaseAddress^),dd);
            ZwUnmapViewOfSection(ProcessHandle,BaseAddress);
            Pointer(BaseAddress^):=pp;
            Byte(pp^):=82;
          end;
      end;
  end;


Riply, спасибо.

Это сообщение отредактировал(а) Акакий - 7.7.2009, 13:54
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1679 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.