2010-08-25 2 views
2

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

+2

Вы можете использовать этот класс для защиты строк: http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx – eulerfx

ответ

7

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

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

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

+2

+1 Тот, кто контролирует аппаратное обеспечение, управляет кодом на нем. –

0

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

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

5

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

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

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

+0

Я не сомневаюсь, что эксперт-хакер мог бы получить от него. Я просто хочу убедиться, что все новички не могут. – Lienau

+1

@Lienau: проблема с экспертом в сравнении с новичком - это достаточно для * одного * эксперта, чтобы взломать его, а затем все новички найдут в Google, как это сделать. Лишь немногие люди понимают, как сделать джейлбрейк iPhone с нуля, но * много * iPhone разгромлен. Если цена стоит того, кто-то это сделает. –

+0

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

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