Получение доступа к памяти любого процесса

Я использую Windows 8 64 бит. Я знаю C ++ и основы сборки. Если бы я написал антивирусную программу, она должна была иметь доступ к памяти любого процесса, верно? Мне удалось написать программу, которая может читать память большинства процессов, используя VirtualQueryEx и ReadProcessMemory. Однако я столкнулся с приложением, которое не позволяет мне использовать VirtualQueryEx. Даже с привилегиями отладки это терпит неудачу с ошибкой Отказано в доступе.

Могу ли я что-нибудь сделать, чтобы получить доступ к памяти процесса с помощью VirtualQueryEx? Или я должен использовать другой подход для доступа к таким труднодоступным процессам?

Я уже провел некоторое исследование и задаюсь вопросом, какой подход я должен следовать:

  1. Я наткнулся на информацию, что в режиме ядра можно читать любую память без каких-либо ограничений. Это правда? Но в режиме ядра нет таких функций, как VirtualQueryEx или ReadProcessMemory. Я думаю, мне нужно реализовать их самостоятельно? Но я видел мнения, что такие функции очень нестабильны, и в будущем я могу получить BSOD или STH … Некоторые говорят, что я даже не должен использовать режим ядра для чтения памяти. Может кто-нибудь дать мне ответ, как на самом деле обстоят дела с этим режимом ядра?

  2. Я слышал, что приложения могут подключать некоторые API, чтобы другие приложения не могли использовать эти функции. Может ли VirtualQueryEx быть подключен в этом процессе? и по этой причине мне постоянно отказывают в доступе? Если это так, как я мог отцепить это?

  3. Антивирусы вряд ли будут делать это, вероятно, но сработает ли простая инъекция DLL? Я имею в виду, если бы я смог внедрить dll в этот процесс, то внутри моей dll я бы уже находился в виртуальном адресном пространстве этого процесса, поэтому чтение его памяти не должно быть проблемой?

  4. Другой подход?

Буду очень признателен за любые советы и помощь в этом вопросе!

3

Решение

  1. Да, это возможно, но это будет очень утомительно и подвержено ошибкам. Это будет не так просто, как VirtualQueryEx / RPM. На самом деле я бы просто гарантировал, что у моего пользовательского приложения достаточно прав для выполнения вызовов API, а не для чтения памяти в ядре. Также вы не можете легко загрузить самодельный драйвер на 64-битную Windows. Вам нужно либо подписать драйвер (стоит денег), либо найти какую-то дыру в безопасности Windows (или запустить компьютер в небезопасном режиме).

  2. Да, это возможно Один из способов перехватить API в глобальном масштабе — написать драйвер, который перенаправляет вызовы API. Другим способом было бы глобальное или целевое внедрение DLL для перехвата вызовов API. Последнее вы можете проверить с помощью отладчика. Если ядро ​​перенаправляет вызовы, вы можете обнаружить это, только находясь в ядре самостоятельно.

  3. Я сомневаюсь, что это будет работать, потому что вам нужно гораздо больше обрабатывать права на ввод DLL, чем запрашивать / читать память. Если вы хотите прочитать конкретное известное приложение, вы можете попытаться заставить цель загрузить вашу dll, написав оболочку для некоторой dll, которую она загружает, и замените оригинал.

  4. Вы уверены, что вам нужно прочитать память из этого процесса? Это какой-либо из Системного Процесса, Свободного Процесса, CSRSS, который нельзя открыть из пользовательского режима? Вы максимально снизили свои запрошенные права? Похоже, вам нужны только PROCESS_QUERY_INFORMATION и PROCESS_VM_READ.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]