Как сохранить память процесса защищенной - PullRequest
2 голосов
/ 26 августа 2010

У меня есть процесс, который будет иметь некоторые важные значения в памяти.Я не хочу, чтобы кто-нибудь мог прочитать память моего процесса и получить эти значения.Поэтому я попытался создать программу, которая смотрела бы на список запущенных программ и определяла, были ли какие-либо из них «отладчиками» и т. Д. Но я поняла, что кто-то может просто написать быструю программу, которая выдает память моего процесса.Я знаю, что несколько процессов в моей системе защищают свою память.Как я мог также получить это?(пс: я использую C #)

Ответы [ 3 ]

7 голосов
/ 26 августа 2010

Любое приложение , работающее под пользователем с достаточными привилегиями (например, локальный администратор), может вызывать ReadProcessMemory и читать ваш процесс по желанию, в любое время, не привязываясь к немупорт отладки, и ваша обработка не сможет предотвратить или даже обнаружить это.И я даже не буду вдаваться в то, что может сделать драйвер системного ядра ...

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

Если вы не хотите, чтобы пользователи что-то читали, просто не делайте этого на компьютере пользователя.Используйте модель сервиса, где ваш IP находится на сервере, и пользователи получают к нему доступ через Интернет (т. Е. Веб-сервисы).

5 голосов
/ 26 августа 2010

Прежде всего, всегда найдется способ сбросить образ памяти вашей программы.Ваша программа может только усложнить, а не сделать невозможным.Тем не менее, могут быть способы «скрыть» значения.Обычно это считается трудным делом и не стоит хлопот, но есть программы, которые шифруют эти значения в памяти.Однако, чтобы иметь возможность использовать их, им необходимо временно их расшифровать и впоследствии повторно зашифровать (или отбросить).

Несмотря на то, что с помощью инфраструктуры .Net легко шифровать, отбрасывать расшифрованное значение не так просточто нужно сделать в C #.В C вы должны выделить часть памяти для хранения расшифрованных значений и очистить ее (записав в нее нулевые или случайные данные), прежде чем освободить ее.В C # нет гарантии, что ваши данные не будут где-то храниться (кэширование, сборка мусора), и вы не сможете их очистить.Однако, как отметил eulerfx в комментарии, в .Net 4.0 SecureString может использоваться.Насколько это безопасно, я не знаю.

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

0 голосов
/ 26 августа 2010

Я думаю, что лучший способ сделать это - использовать коммерческое решение, например, в этой PDF-брошюре , это их веб-сайт .Возможно, вам лучше пойти по этому пути, если вы действительно хотите защитить приложение от перехвата, кражи IP и т. Д. Вместо того, чтобы свернуть собственное решение ...

Редактировать: Я бы не пошёл по пути, обманывая себя тем, что решение, которое я разработаю, будет защищено от взлома, взлома и идиотов .Оставьте это такой компании, как Арксан, которую я упомянул (я не торговый представитель - я просто привожу пример), конечно, это может быть дорогостоящим, но вы можете спать лучше ночью, зная, что это намного сложнее длявзломать взломщик, чем иметь нет решения на всех ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...