2013-03-28 3 views
0

Каждое приложение имеет свою память. В Windows все процессы могут использовать «OpenProcess» и «ReadProcessMemory/WriteProcessMemory (NtReadVirtualMemory/NtWriteVirtualMemory)» для чтения или записи памяти приложения.Кто читает/записывает память моего приложения

В ядре системы мы можем подключить функцию SSDT «NtReadVirtualMemory/NtWriteVirtualMemory», чтобы проверить, кто читает и пишет память приложения.

У меня возник вопрос: есть ли способ проверить, кто читает и пишет память приложения в процессе этого приложения?

+0

no. не зацепив другие процессы/ядро ​​(подключив SSDT, как вы уже упоминали в своем вопросе). Вы можете проверить, какой процесс имеет дескриптор для вашего приложения, но это не обязательно означает, что они действительно что-то читали/пишут. – JosephH

+0

Спасибо, Джозеф. Как я могу проверить, какой процесс имеет дескриптор моего приложения? Есть ли какой-нибудь документ об этом? – wenz

+0

Я не верю, что вы сможете подключить SSDT в современных версиях Windows. [Защита от исправления ядра (т. Е. Исправление)] (http://en.wikipedia.org/wiki/Kernel_Patch_Protection) следует запретить. Вы * можете * использовать API поддержки данных ядра и фильтрации. – jww

ответ

4

№ Не без подключения других процессов/ядра (путем подключения SSDT, как вы упомянули в своем вопросе). Вы можете проверить, какой процесс имеет дескриптор для вашего приложения, но это не обязательно означает, что они действительно что-то читали/пишут.

Чтобы узнать, какой процесс имеет ручку для вашего процесса,

  1. Вызова NtQuerySystemInformation с SystemHandleInformation (без документов) для параметра SystemInformationClass, чтобы перечислить все ручки, которые открыты в системе.
  2. Дубликат всех ручек по телефону DuplicateHandle с PROCESS_QUERY_INFORMATION доступом (если я правильно помню, это будет отфильтровывать все непроизводственные ручки)
  3. Для каждой повторяющейся ручки, вызовите GetProcessId, чтобы получить идентификатор процесса.
  4. Если идентификатор процесса совпадает с идентификатором процесса вашего приложения, мы можем получить владельца оригинального дескриптора, просмотрев поле ProcessId исходной структуры SYSTEM_HANDLE_INFORMATION, возвращенной с NtQuerySystemInformation.
+0

JosephH, у меня есть другой вопрос: некоторый процесс «OpenProcess» и вводит код в мое приложение. После инъекции он освобождает ручку. Таким образом, ваш путь может быть пропущен. как я могу это исправить? – wenz

+0

@wenz, вам нужно как можно скорее подключить 'NtOpenProcess'. Там только так много можно сделать, когда вы в пользовательском режиме ... Кстати, если инъекция включает в себя «CreateRemoteThread», можно перехватить создание нового потока, подключив «RtlUserThreadStart». Но опять же, это может быть бесполезно, если процесс, выполняющий инъекцию, создает поток с использованием 'NtCreateThread' с пользовательской структурой' CONTEXT'. – JosephH

+0

В win7 32bit я привязываю «NtOpenProcess». из-за PATCH GUARD в 64-битном режиме я не могу подключить «NtOpenProcess» в ядре. Поэтому я должен найти другой путь. Я думаю, что если я знаю, кто читает и пишет память приложения, я могу защитить свое приложение. – wenz

Смежные вопросы