Нужна ваша помощь!
У меня задача — разработать программу проверки корректности очистки оперативной памяти путём поиска заданных строк в ней. Я начал решать её с написания драйвера и управляющей программы для него. В управляющей проге задаём строку для поиска, в драйвере — ищем её в любом участке ОП в любом адресном пространстве (весь диапазон ).
Но сколько не рыл ДДК, сколько ни пробовал различные функции, ничего пока не вышло. Пробовал буфер выделять — большинство функций отказалось "захватить" всю память таким образом, пробовал чтение из маленького буффера — видимо буфер чем-то инициализируется, поскольку после сброса в файл там были одинаковые символы .
Как альтернативный метод — хочу с помощью драйвера создавать свой дамп памяти, а потом уже в дампе искать строки.
Подскажите, какие вообще подходы нужны к решению такой задачи? Возможно ли через драйвер обращаться к любому участку ОП (про виртуальную память речь не идёт)? И как сделать свой дамп, если напрямую искать в памяти нельзя?
Заранее спасибо!
Re: Прямой доступ к любому участку памяти
От:
Аноним
Дата:
02.12.07 19:27
Оценка:
странная задача, и ее способ еще более странный... А бсод сгенерить можно даже без драйвера — убив crsss например, или лучше включив в параметрах драйвера клавы "ручной" бсод по ctrl+scroll lock.
Здравствуйте, Аноним, Вы писали:
А>странная задача, и ее способ еще более странный... А бсод сгенерить можно даже без драйвера — убив crsss например, или лучше включив в параметрах драйвера клавы "ручной" бсод по ctrl+scroll lock.
Нет, BSOD генерить не надо
Нужно получить дамп именно без BSODа, т.е. самому, ручками.
Насколько я понял надо работать через DIRECT_IO? Мне нужно что-то типа сканирующей программы — перебрать все адреса да и скинуть значения со всех ячеек в файл, например передавая из драйвера в управляющую программу "порциями". Но вот вопрос в том, как мне получить доступ к ячейкам? Т.е. нужно написать аналог виндовой программы (драйвера?), которая во время синего экрана делает дамп. Хотел воспользоваться устройством Device\PhysicalMemory — не катит, говорят отменили эту фичу (
Вообще я новичёк в написании драйверов, извиняйте если чё не так формулирую
Здравствуйте, Antban, Вы писали:
A>Привет всем!
A>Нужна ваша помощь! A>У меня задача — разработать программу проверки корректности очистки оперативной памяти путём поиска заданных строк в ней.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Antban, Вы писали:
A>>Привет всем!
A>>Нужна ваша помощь! A>>У меня задача — разработать программу проверки корректности очистки оперативной памяти путём поиска заданных строк в ней.
G>А зачем чистить то?
Так формулируют в задании)
На самом деле думаю это с целью защиты, т.е. чтобы после какого-нибудь процесса не оставались пароли и другая секретная информация. Вот нам и нужно в управляющей программе ввести, скажем, строку в шестнадцатеричном виде, через драйвер войти на ring 0 и убедиться, что строки в памяти нет (или наоборот, есть). Значения ведь могут быть как в пользовательском пространстве, так и в системном, и данные нужно получать из любог участка.
А метод с дампом мне кажется удобным, хотя может напрямую обращаться к памяти и искать в ней лучше?
Здравствуйте, Antban, Вы писали: A>Так формулируют в задании) A>На самом деле думаю это с целью защиты, т.е. чтобы после какого-нибудь процесса не оставались пароли и другая секретная информация. Вот нам и нужно в управляющей программе ввести, скажем, строку в шестнадцатеричном виде, через драйвер войти на ring 0 и убедиться, что строки в памяти нет (или наоборот, есть). Значения ведь могут быть как в пользовательском пространстве, так и в системном, и данные нужно получать из любог участка. A>А метод с дампом мне кажется удобным, хотя может напрямую обращаться к памяти и искать в ней лучше?
Насколько я знаю, NT-винда всегда выделяет процессам только чистые страницы — без чужих данных. Это требование одного из стандартов безопасности, которому она соответствует. Я не уверен (и не вспомню сейчас источник информации), но вроде это так.
Касаемо задачи — соображения такие:
1. Дамп только ОЗУ не поможет, т.к. есть еще и своп — его надо тоже дампить.
2. Чтобы сделать дамп ОЗУ и свопа надо научиться действовать в обход той подсистемы, которая заведует свопом (а это, скорее всего, будет грязный хак) и механизма трансляции адресов (а это еще более грязный хак).
3. Существуют другие способы влезать в адресные пространства процессов. Отладчики это делают, программы, навроде ArtMoney, это делают — значит, это возможно. Как именно, это делается, я, честно, не знаю, но, думаю, кто-нибудь на форуме знает и ответит. Соответственно, находим все процессы и сканим их адресные пространства. Ну а адресное пространство ядра драйверу доступно.
4. Гугл знает всё.
Здравствуйте, Antban, Вы писали:
A>Подскажите, какие вообще подходы нужны к решению такой задачи? Возможно ли через драйвер обращаться к любому участку ОП (про виртуальную память речь не идёт)? И как сделать свой дамп, если напрямую искать в памяти нельзя?
Здравствуйте, Anatoliy.Sviridenkov, Вы писали:
AS>Здравствуйте, Antban, Вы писали:
A>>Подскажите, какие вообще подходы нужны к решению такой задачи? Возможно ли через драйвер обращаться к любому участку ОП (про виртуальную память речь не идёт)? И как сделать свой дамп, если напрямую искать в памяти нельзя?
AS> А ReadProcessMemory не подходит?
Этот вариант я рассматривал, но как крайний, т.е. если ничего кроме этого сделать не удастся. Как вариант, действительно, можно использовать ReadProcessMemory, но тут два момента:
1. А любой ли процесс даст прочитать память?
2. Что с данными, которые не будут находиться в адресном пространстве процесса (если я правильно понимаю, может быть так, что какой-нибудь процесс сохранит данные в системном адресном пространстве, и тогда получить к ним доступ через ReadProcessMemory уже не удастся)?
AS>> А ReadProcessMemory не подходит?
A>1. А любой ли процесс даст прочитать память? A>2. Что с данными, которые не будут находиться в адресном пространстве процесса (если я правильно понимаю, может быть так, что какой-нибудь процесс сохранит данные в системном адресном пространстве, и тогда получить к ним доступ через ReadProcessMemory уже не удастся)?
ради proof of concept скачай HideTools, спрячь им процесс блокнота (notepad), а в самом блокноте напиши "Hello World".
Пока ты не научишься находить этот "Hello World", о WriteProcessMemory можешь и не думать
HD>ради proof of concept скачай HideTools, спрячь им процесс блокнота (notepad), а в самом блокноте напиши "Hello World". HD>Пока ты не научишься находить этот "Hello World", о WriteProcessMemory можешь и не думать
Я боюсь ни ReadProcessMemory ни тем более WriteProcessMemory не помогут выщемить Hello World из notepad'а. Ибо это текст окна, а его win32k видимо в ядре хранит.
Здравствуйте, Аноним, Вы писали:
А>Я боюсь ни ReadProcessMemory ни тем более WriteProcessMemory не помогут выщемить Hello World из notepad'а. Ибо это текст окна, а его win32k видимо в ядре хранит.
Т.е. нотепад пишет в "ядро" ?
А про WriteProcessMemory я написал к тому, что сначла надо научиться хотя бы читать память, прежде чем пробовать туда писать.
Здравствуйте, Аноним, Вы писали:
HD>>ради proof of concept скачай HideTools, спрячь им процесс блокнота (notepad), а в самом блокноте напиши "Hello World". HD>>Пока ты не научишься находить этот "Hello World", о WriteProcessMemory можешь и не думать А>Я боюсь ни ReadProcessMemory ни тем более WriteProcessMemory не помогут выщемить Hello World из notepad'а. Ибо это текст окна, а его win32k видимо в ядре хранит.
АП ядра спроецировано в верхние 2 или 1 ГБ АП любого процесса.
Re[6]: Прямой доступ к любому участку памяти
От:
Аноним
Дата:
05.12.07 21:47
Оценка:
MC>АП ядра спроецировано в верхние 2 или 1 ГБ АП любого процесса.
и что с того? Read/Write ProcessMemory не имеет к ним доступа
Здравствуйте, Аноним, Вы писали: А>и что с того? Read/Write ProcessMemory не имеет к ним доступа
Плз. ссылку на источник.
Даже если так — для работы с АП ядра мона маленький драйвер написать.
Re[8]: Прямой доступ к любому участку памяти
От:
Аноним
Дата:
06.12.07 11:06
Оценка:
А>>и что с того? Read/Write ProcessMemory не имеет к ним доступа MC>Плз. ссылку на источник.
источник — здравый смысл и соображения о безопасности.
По-моему, вопрос из серии "как сделать пушку, чтобы из нее можно было охотится на воробьев"?
Проверка корректности зануления памяти — это юнит-тест для конкретной совершенно программы. Юнит-тесты для юзер-модного кода, для которых нужно разрабатывать какие-то кернел-модули, есть бред ИМХО.
Есть у тебя есть SeDebugPrivilege — то да.
A>2. Что с данными, которые не будут находиться в адресном пространстве процесса (если я правильно понимаю, может быть так, что какой-нибудь процесс сохранит данные в системном адресном пространстве
Без помощи драйверов это невозможно, а значит, к вашим драйверам должен быть отдельный аналогичный юнит-тест, похожий на юнит-тест к юзер-модному коду.
MC>3. Существуют другие способы влезать в адресные пространства процессов. Отладчики это делают, программы, навроде ArtMoney, это делают — значит, это возможно. Как именно, это делается, я, честно, не знаю
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, Antban, Вы писали:
MC>Насколько я знаю, NT-винда всегда выделяет процессам только чистые страницы — без чужих данных. Это требование одного из стандартов безопасности, которому она соответствует. Я не уверен (и не вспомню сейчас источник информации), но вроде это так.
Нужно убедиться, что никаких данных не остаётся после завершения процесса, т.е. что память очищается процессом корректно (наверное речь идёт о явном занулении памяти этим процессом). Также возможна ситуация когда зануление будет выполнено во время работы тестируемого процесса, и нужно его проверить во время работы (именно на эту ситуацию и ориентируюсь). Процесс может быть как пользовательским, так и системным, поэтому без драйвера думаю не получится, ломаю голову над ним... Конкретной программы нет, одно из требований — универсальность. Поэтому нужно и на системные процессы расчитывать.
Даже если NT выделяет чистые страницы, данные от предыдущего процесса могут остаться от неполного перекрытия предыдущих данных, и их может, например, считать злоумышленник, поэтому надо проверить, очистил тот процесс свою память или что-то оставил врагам
А ещё такой вопросец хотел задать: можно ли из драйвера считывать не только данные системных процессов, но и пользовательские заодно прихватить и вообще обойтись без ReadProcessMemory? Т.е. можно ли сразу считать вообще всю память, например, проверяя валидность адресов и пройдя все 4Гб или это плохой метод?
А>>источник — здравый смысл и соображения о безопасности. MC>А документальный?
скажу по другому — если пользовательский процесс может прочитать память ядра, он вычитает оттуда данные касающиеся авторизации, ключей шифрования NTFS и тп других пользователей. Если бы любой процесс читая свою память мог бы прочитать заодно диапазон памяти ядра — (а она общая для всех процессов, не считая малкнького кусочка связанного с win32k.sys) — это была бы local privileges elevation vulnerability и MS заплатил бы нашедшему ее бабло.
Люди, 9х винды остались в прошлом веке. NT семейство — многопользовательские ОС с жесткими требованиями безопасности стандарта С2 минимум. А вы тут пытаетесь из пользовательского процесса прочитать обычными АПи не требующими спец привилегий kernel-mode часть виртуального адресного пространства адресов.
1) Считывание физпамяти перебором по 4К. Не обязательно захватывать физпамять целиком (да и ОС не позволит)
2) Попробуйте перехватывать завершение процесса при помощи PsSetCreateProcessNotifyRoutine
(callback с параметром Create = FALSE) и затем в коллбэке проходить по дереву VAD
(дескрипторы виртуальных адресов, отображенных на процесс).
Кроме того, при написании программ не мешает добавлять зануление участков памяти перед их освобождением.
Здравствуйте, Аноним, Вы писали: А>скажу по другому <skip> виртуального адресного пространства адресов.
Вы меня не так поняли. Я не Ваши слова под сомнения ставлю, а прошу источник, где можно об этом почитать.
A>Нужно убедиться, что никаких данных не остаётся после завершения процесса, т.е. что память очищается процессом корректно (наверное речь идёт о явном занулении памяти этим процессом).
А это не дело процесса, а дело кернела.
A>Даже если NT выделяет чистые страницы, данные от предыдущего процесса могут остаться от неполного перекрытия предыдущих данных, и их может, например, считать злоумышленник
Не может. Не бывает там никакого "неполного перекрытия". Когда приватная физ.страница освобождается (на нее становится нуль ссылок), она уходит не в zeroed list, а во free list.
Страницы выделяются либо из zeroed list, либо из free list, но только после полного зануления.
Так что никакого "неполного перекрытия" тут не будет.
Занулять что-то в своей памяти нужно не как защита от утечки в другие процессы, а как защита от присоединения к процессу отладчика или там от userdump.
A>А ещё такой вопросец хотел задать: можно ли из драйвера считывать не только данные системных процессов, но и пользовательские заодно прихватить и вообще обойтись без ReadProcessMemory? Т.е. можно ли сразу считать вообще всю память, например, проверяя валидность адресов и пройдя все 4Гб или это плохой метод?
Сразу замечу, что валидность-невалидность адреса может измениться между проверкой валидности и самим обращением.