2012-03-26 3 views
2

У меня есть DLL программного обеспечения, которое я хочу использовать. В DLL API есть функция «LoadConfigFile (char * file)», для которой требуется имя файла с пути aboslute к нему (например, «C: \ TestFolder \ ConfigFile.cfg»). Затем функция загружает сам файл конфигурации.Защищенный виртуальный диск в Windows с VC++

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

Так что мне было интересно, как это можно сделать и искать в Интернете решения. Следующие варианты и вопросы приходят на ум при поиске решений:

  • Я мог бы зашифровать файл. -> Кто-нибудь знает для этого бесплатную библиотеку? -> Можно ли дать функции файл как astring и функция может прочитать файл?

  • Возможно, есть возможность использования виртуальной файловой системы. Я имею в виду загрузить файл из зашифрованного источника, расшифровать его и сохранить в ОЗУ на виртуальном диске или в папке. затем укажите ссылку как строку для DLL-функции -> Возможно ли это? -> Кто-нибудь знает бесплатную библиотеку для этого?

  • Я также кое-что прочитал о «в базах памяти». -> Может ли это быть ответом на мою проблему?

Моя среда разработки - VC++ 2010, а ОС - Windows XP.

Я надеюсь, что кто-то может помочь мне в этом вопросе.

+0

Таким образом, вы не можете изменить программное обеспечение, которое фактически читает файл (т. Е. DLL) - у вас нет доступа к исходному коду. Верный? – nabulke

+2

Это не будет безопасно, так как Malware.EXE также может загружать вашу DLL. – MSalters

ответ

1

Слишком сложная.Самое простое решение (поскольку вы контролируете процесс):

  1. Создайте временный файл и откройте его исключительно (даже не прочитайте). Pass FILE_ATTRIBUTE_TEMPORARY и FILE_FLAG_DELETE_ON_CLOSE, так как он не является постоянным
  2. Расшифруйте файл конфигурации во временный файл. Держите ручку открытой.
  3. Передайте временное имя файла в DLL. Это в вашем процессе, поэтому на него не влияет исключительная блокировка.
  4. Когда DLL завершена, обнулите временный файл.
  5. Закройте ручку. Это приведет к удалению файла.

Поскольку временный файл заблокирован всякий раз, когда он содержит конфиденциальный контент, ни один другой процесс не может получить к нему доступ. И поскольку он помечен как временный, удалите его по закрытию, Windows не будет пытаться погрузить его на физический диск.

Конечно, это не идеальная безопасность. Любой, кто может читать вашу память процесса (у меня есть SeDebugPrivilege), может получить доступ к этой информации, но это тривиально очевидно. Просто поставьте точку останова отладки на LoadConfigFile.

+0

Звучит неплохо. Я это попробую. Отсутствие безопасности кажется мне приемлемым. – schieska

+0

Ну, учитывая ваш комментарий к другому ответу (прошивка прошивки), это достаточная безопасность. В любом случае данные будут незашифрованными во флэш-памяти. (Моя компания также встраивает продукты, а также для обеспечения безопасности мы сохраняем данные даже во флеш-памяти. Существуют проекты ARM, которые будут выполнять правильную криптографию, включая безопасную загрузку). – MSalters

+0

Убедитесь, что ваш процесс завершит (и удалит) файл. – ixe013

1

Насколько чувствительны ваши данные? И какова цель вашего приложения?

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

Если ваши данные требуют тщательного шифрования, посмотрите на функции шифрования Windows (например, CryptProtectData, см. http://msdn.microsoft.com/en-us/library/aa380261(VS.85).aspx).

В некоторых случаях вы не хотите шифровать свои данные, но вы просто хотите удостовериться, что никто не меняет его. В этом случае добавьте хеш-значение (SHA-2, см. Http://en.wikipedia.org/wiki/SHA-2) в ваш файл.

+0

Данные не должны быть прочитаны третьим лицом. Если файл скопирован, он должен быть зашифрован. Файл представляет собой прошивку встроенного устройства, а целью является производственный ПК с WinXP, где на устройстве прошивается микропрограмма. DLL с функцией LoadConfigFile (...) является библиотекой драйверов для флеш-устройства. – schieska

+0

** Основная проблема заключается в том, что я должен дать абсолютный путь к DLL-функции. Поэтому мне нужен контейнер, в котором находится файл, который доступен только для моего программного обеспечения **. Затем мое программное обеспечение должно указать путь к DLL-функции. Я мог бы читать файл в виртуальной папке «RAM» и работать с этой копией. Поэтому, когда программное обеспечение выключено, на ПК не будет файлов, которые можно было бы прочитать. – schieska

+0

Windows CryptProtectData может использоваться для шифрования и дешифрования файла. Но тогда я должен сохранить файл во временное место, чтобы дать ссылку (как строку) на DLL-функцию. Конечно, это можно сделать в скрытой папке, но это не совсем безопасно. – schieska

1

Единственное, что я могу придумать - и я не являюсь исходным кодом для него под рукой - это hash and decrypt.

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

Скорее всего, он будет ломаться каждый раз, когда вы обновляете свой код. Вам нужно будет рассмотреть 32-битные и 64-битные архитектуры. Может быть, стрельба может возникнуть. Убедитесь, что ваши требования безопасности стоят усилий и не оценивают усилия по обслуживанию.

Как правило, CryptProtectData будет выполнять и предоставить параметр pOptionalEntropy для дополнительной безопасности (затем принять ответ @Patrick, а не мой).

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