Прямой доступ к любому участку памяти
От: Antban  
Дата: 02.12.07 10:39
Оценка:
Привет всем!

Нужна ваша помощь!
У меня задача — разработать программу проверки корректности очистки оперативной памяти путём поиска заданных строк в ней. Я начал решать её с написания драйвера и управляющей программы для него. В управляющей проге задаём строку для поиска, в драйвере — ищем её в любом участке ОП в любом адресном пространстве (весь диапазон ).
Но сколько не рыл ДДК, сколько ни пробовал различные функции, ничего пока не вышло. Пробовал буфер выделять — большинство функций отказалось "захватить" всю память таким образом, пробовал чтение из маленького буффера — видимо буфер чем-то инициализируется, поскольку после сброса в файл там были одинаковые символы .

Как альтернативный метод — хочу с помощью драйвера создавать свой дамп памяти, а потом уже в дампе искать строки.

Подскажите, какие вообще подходы нужны к решению такой задачи? Возможно ли через драйвер обращаться к любому участку ОП (про виртуальную память речь не идёт)? И как сделать свой дамп, если напрямую искать в памяти нельзя?

Заранее спасибо!
Re: Прямой доступ к любому участку памяти
От: Аноним  
Дата: 02.12.07 19:27
Оценка:
странная задача, и ее способ еще более странный... А бсод сгенерить можно даже без драйвера — убив crsss например, или лучше включив в параметрах драйвера клавы "ручной" бсод по ctrl+scroll lock.
Re[2]: Прямой доступ к любому участку памяти
От: Antban  
Дата: 02.12.07 19:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>странная задача, и ее способ еще более странный... А бсод сгенерить можно даже без драйвера — убив crsss например, или лучше включив в параметрах драйвера клавы "ручной" бсод по ctrl+scroll lock.


Нет, BSOD генерить не надо
Нужно получить дамп именно без BSODа, т.е. самому, ручками.
Насколько я понял надо работать через DIRECT_IO? Мне нужно что-то типа сканирующей программы — перебрать все адреса да и скинуть значения со всех ячеек в файл, например передавая из драйвера в управляющую программу "порциями". Но вот вопрос в том, как мне получить доступ к ячейкам? Т.е. нужно написать аналог виндовой программы (драйвера?), которая во время синего экрана делает дамп. Хотел воспользоваться устройством Device\PhysicalMemory — не катит, говорят отменили эту фичу (
Вообще я новичёк в написании драйверов, извиняйте если чё не так формулирую
Re: Прямой доступ к любому участку памяти
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 02.12.07 20:01
Оценка:
Здравствуйте, Antban, Вы писали:

A>Привет всем!


A>Нужна ваша помощь!

A>У меня задача — разработать программу проверки корректности очистки оперативной памяти путём поиска заданных строк в ней.

А зачем чистить то?
Re[2]: Прямой доступ к любому участку памяти
От: Antban  
Дата: 02.12.07 20:15
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, Antban, Вы писали:


A>>Привет всем!


A>>Нужна ваша помощь!

A>>У меня задача — разработать программу проверки корректности очистки оперативной памяти путём поиска заданных строк в ней.

G>А зачем чистить то?


Так формулируют в задании)
На самом деле думаю это с целью защиты, т.е. чтобы после какого-нибудь процесса не оставались пароли и другая секретная информация. Вот нам и нужно в управляющей программе ввести, скажем, строку в шестнадцатеричном виде, через драйвер войти на ring 0 и убедиться, что строки в памяти нет (или наоборот, есть). Значения ведь могут быть как в пользовательском пространстве, так и в системном, и данные нужно получать из любог участка.
А метод с дампом мне кажется удобным, хотя может напрямую обращаться к памяти и искать в ней лучше?
Re[3]: Прямой доступ к любому участку памяти
От: Mr.Cat  
Дата: 03.12.07 07:26
Оценка:
Здравствуйте, Antban, Вы писали:
A>Так формулируют в задании)
A>На самом деле думаю это с целью защиты, т.е. чтобы после какого-нибудь процесса не оставались пароли и другая секретная информация. Вот нам и нужно в управляющей программе ввести, скажем, строку в шестнадцатеричном виде, через драйвер войти на ring 0 и убедиться, что строки в памяти нет (или наоборот, есть). Значения ведь могут быть как в пользовательском пространстве, так и в системном, и данные нужно получать из любог участка.
A>А метод с дампом мне кажется удобным, хотя может напрямую обращаться к памяти и искать в ней лучше?

Насколько я знаю, NT-винда всегда выделяет процессам только чистые страницы — без чужих данных. Это требование одного из стандартов безопасности, которому она соответствует. Я не уверен (и не вспомню сейчас источник информации), но вроде это так.

Касаемо задачи — соображения такие:
1. Дамп только ОЗУ не поможет, т.к. есть еще и своп — его надо тоже дампить.
2. Чтобы сделать дамп ОЗУ и свопа надо научиться действовать в обход той подсистемы, которая заведует свопом (а это, скорее всего, будет грязный хак) и механизма трансляции адресов (а это еще более грязный хак).
3. Существуют другие способы влезать в адресные пространства процессов. Отладчики это делают, программы, навроде ArtMoney, это делают — значит, это возможно. Как именно, это делается, я, честно, не знаю, но, думаю, кто-нибудь на форуме знает и ответит. Соответственно, находим все процессы и сканим их адресные пространства. Ну а адресное пространство ядра драйверу доступно.
4. Гугл знает всё.
Re: Прямой доступ к любому участку памяти
От: Anatoliy.Sviridenkov Россия  
Дата: 03.12.07 12:59
Оценка:
Здравствуйте, Antban, Вы писали:

A>Подскажите, какие вообще подходы нужны к решению такой задачи? Возможно ли через драйвер обращаться к любому участку ОП (про виртуальную память речь не идёт)? И как сделать свой дамп, если напрямую искать в памяти нельзя?


А ReadProcessMemory не подходит?
Re[2]: Прямой доступ к любому участку памяти
От: Antban  
Дата: 03.12.07 16:14
Оценка:
Здравствуйте, Anatoliy.Sviridenkov, Вы писали:

AS>Здравствуйте, Antban, Вы писали:


A>>Подскажите, какие вообще подходы нужны к решению такой задачи? Возможно ли через драйвер обращаться к любому участку ОП (про виртуальную память речь не идёт)? И как сделать свой дамп, если напрямую искать в памяти нельзя?


AS> А ReadProcessMemory не подходит?



Этот вариант я рассматривал, но как крайний, т.е. если ничего кроме этого сделать не удастся. Как вариант, действительно, можно использовать ReadProcessMemory, но тут два момента:
1. А любой ли процесс даст прочитать память?
2. Что с данными, которые не будут находиться в адресном пространстве процесса (если я правильно понимаю, может быть так, что какой-нибудь процесс сохранит данные в системном адресном пространстве, и тогда получить к ним доступ через ReadProcessMemory уже не удастся)?
Re[3]: Прямой доступ к любому участку памяти
От: HotDog Швейцария www.denebspace.com
Дата: 03.12.07 16:58
Оценка:
AS>> А ReadProcessMemory не подходит?

A>1. А любой ли процесс даст прочитать память?

A>2. Что с данными, которые не будут находиться в адресном пространстве процесса (если я правильно понимаю, может быть так, что какой-нибудь процесс сохранит данные в системном адресном пространстве, и тогда получить к ним доступ через ReadProcessMemory уже не удастся)?

ради proof of concept скачай HideTools, спрячь им процесс блокнота (notepad), а в самом блокноте напиши "Hello World".
Пока ты не научишься находить этот "Hello World", о WriteProcessMemory можешь и не думать
Re[4]: Прямой доступ к любому участку памяти
От: HotDog Швейцария www.denebspace.com
Дата: 03.12.07 17:01
Оценка:
Я имел ввиду HideToolz от Ms-Rem
Re[4]: Прямой доступ к любому участку памяти
От: Аноним  
Дата: 03.12.07 21:38
Оценка:
HD>ради proof of concept скачай HideTools, спрячь им процесс блокнота (notepad), а в самом блокноте напиши "Hello World".
HD>Пока ты не научишься находить этот "Hello World", о WriteProcessMemory можешь и не думать
Я боюсь ни ReadProcessMemory ни тем более WriteProcessMemory не помогут выщемить Hello World из notepad'а. Ибо это текст окна, а его win32k видимо в ядре хранит.
Re[5]: Прямой доступ к любому участку памяти
От: HotDog Швейцария www.denebspace.com
Дата: 04.12.07 08:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я боюсь ни ReadProcessMemory ни тем более WriteProcessMemory не помогут выщемить Hello World из notepad'а. Ибо это текст окна, а его win32k видимо в ядре хранит.


Т.е. нотепад пишет в "ядро" ?
А про WriteProcessMemory я написал к тому, что сначла надо научиться хотя бы читать память, прежде чем пробовать туда писать.
Re[5]: Прямой доступ к любому участку памяти
От: Mr.Cat  
Дата: 05.12.07 21:11
Оценка:
Здравствуйте, Аноним, Вы писали:

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 не имеет к ним доступа
Re[7]: Прямой доступ к любому участку памяти
От: Mr.Cat  
Дата: 05.12.07 23:27
Оценка:
Здравствуйте, Аноним, Вы писали:
А>и что с того? Read/Write ProcessMemory не имеет к ним доступа
Плз. ссылку на источник.
Даже если так — для работы с АП ядра мона маленький драйвер написать.
Re[8]: Прямой доступ к любому участку памяти
От: Аноним  
Дата: 06.12.07 11:06
Оценка:
А>>и что с того? Read/Write ProcessMemory не имеет к ним доступа
MC>Плз. ссылку на источник.
источник — здравый смысл и соображения о безопасности.
Re: Прямой доступ к любому участку памяти
От: Maxim S. Shatskih Россия  
Дата: 06.12.07 11:17
Оценка: 5 (1)
По-моему, вопрос из серии "как сделать пушку, чтобы из нее можно было охотится на воробьев"?

Проверка корректности зануления памяти — это юнит-тест для конкретной совершенно программы. Юнит-тесты для юзер-модного кода, для которых нужно разрабатывать какие-то кернел-модули, есть бред ИМХО.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[3]: Прямой доступ к любому участку памяти
От: Maxim S. Shatskih Россия  
Дата: 06.12.07 11:18
Оценка:
A>1. А любой ли процесс даст прочитать память?

Есть у тебя есть SeDebugPrivilege — то да.

A>2. Что с данными, которые не будут находиться в адресном пространстве процесса (если я правильно понимаю, может быть так, что какой-нибудь процесс сохранит данные в системном адресном пространстве


Без помощи драйверов это невозможно, а значит, к вашим драйверам должен быть отдельный аналогичный юнит-тест, похожий на юнит-тест к юзер-модному коду.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[6]: Прямой доступ к любому участку памяти
От: Maxim S. Shatskih Россия  
Дата: 06.12.07 11:19
Оценка:
HD>Т.е. нотепад пишет в "ядро" ?

Нет, user32 edit control (который и есть нотепад) реализован в win32k в ядре.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[4]: Прямой доступ к любому участку памяти
От: Maxim S. Shatskih Россия  
Дата: 06.12.07 11:21
Оценка:
MC>3. Существуют другие способы влезать в адресные пространства процессов. Отладчики это делают, программы, навроде ArtMoney, это делают — значит, это возможно. Как именно, это делается, я, честно, не знаю

OpenProcess/WriteProcessMemory.
Занимайтесь LoveCraftом, а не WarCraftом!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.