2012-03-26 34 views
2

我有一個我想要使用的軟件的DLL。在DLL API中有一個函數「LoadConfigFile(char * file)」,它需要一個帶有aboslute路徑的文件名(例如「C:\ TestFolder \ ConfigFile.cfg」)。該函數然後加載配置文件本身。用VC++在windows上保護虛擬磁盤

由於安全原因,我希望允許訪問文件(內容)只對使用該DLL的程序。

所以我想知道如何做到這一點,並搜索互聯網的解決方案。在尋找解決方案時,想到以下選項和問題:

  • 我可以加密文件。 - >有人知道這個免費的圖書館嗎? - >然後是否可以將函數的文件作爲astring並且函數可以讀取文件?

  • 也許有可能使用虛擬文件系統。我的意思是從加密源加載文件,解密並將其保存在虛擬磁盤或文件夾的RAM中。然後將該鏈接作爲一個字符串給DLL函數 - >這可能嗎? - >有人知道免費圖書館這樣做嗎?

  • 我也讀了一些關於「內存數據庫」的內容。 - >這可以解決我的問題嗎?

我的開發環境是VC++ 2010,操作系統是Windows XP。

我希望有人能幫助我解決這個問題。

+0

因此,您無法更改實際讀取文件的軟件(即DLL) - 您無法訪問源代碼。正確? – nabulke 2012-03-26 12:56:33

+2

無論如何這不會是安全的,因爲Malware.EXE也可以加載您的DLL。 – MSalters 2012-03-26 13:45:50

回答

1

太複雜了。最簡單的解決方案是:

  1. 創建一個臨時文件並獨佔打開它(甚至不共享讀取)。通過FILE_ATTRIBUTE_TEMPORARYFILE_FLAG_DELETE_ON_CLOSE,因爲它不是持久的
  2. 解密配置文件到這個臨時文件。保持手柄打開。
  3. 將臨時文件名傳遞給DLL。它在你的過程中,所以它不受獨佔鎖的影響。
  4. DLL完成後,將臨時文件清零。
  5. 關閉你的手柄。這會刪除文件。

由於只要包含機密內容,臨時文件就被鎖定,其他進程無法訪問它。而且由於它被標記爲臨時的,所以在關閉時刪除,Windows不會將其沖刷到物理磁盤。

當然,這不是完美的安全。任何人都可以讀取你的程序存儲器(我有SeDebugPrivilege)可以訪問這些信息,但這是顯而易見的。只需在LoadConfigFile上放置一個調試斷點。

+0

聽起來不錯。我會試試看。我缺乏安全感似乎可以接受。 – schieska 2012-03-26 14:15:08

+0

好吧,考慮到你對另一個答案(閃爍固件)的評論,這是足夠的安全性。無論如何,數據在閃存中都是未加密的。 (我的公司也提供嵌入式產品,爲了安全起見,我們保證即使在閃存中也保證數據的安全。有ARM設計可以做適當的加密,包括安全啓動) – MSalters 2012-03-26 14:22:41

+0

確保殺死您的進程將關閉(並刪除)純文本臨時文件。 – ixe013 2012-03-28 11:50:39

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的生產PC,其中固件在設備上閃爍。具有函數LoadConfigFile(...)的DLL是閃存設備的驅動程序庫。 – schieska 2012-03-26 13:51:54

+0

**主要問題是,我必須給DLL函數的絕對路徑。所以我需要一些文件所在的容器,它只能通過我的軟件**讀取。我的軟件應該給出一個DLL函數的路徑。我希望可以通過虛擬內存「文件夾」讀取文件,並使用此副本。所以當軟件關閉時,PC上將不會有文件可以被讀取。 – schieska 2012-03-26 13:52:11

+0

Windows CryptProtectData可用於加密和解密文件。但是,我必須將文件保存到臨時位置,以便爲DLL函數提供鏈接(以字符串形式)。這當然可以在一個隱藏的文件夾中完成,但它不是很安全。 – schieska 2012-03-26 13:52:50

1

我唯一能想到的 - 我沒有源代碼,因爲它在手 - 是hash and decrypt

使用從您的代碼的散列派生的密鑰,用任何東西加密您的文件。不要將鑰匙存放在任何地方。你的代碼是關鍵。更好的是,散列一些內存結構,只有程序能夠成功運行才能創建。

雖然每次更新代碼時機會都會中斷。你將不得不考慮32位和64位體系結構。也許指針調整可能會發揮作用。確保您的安全要求值得努力,並且不要低估維護工作量。

通常,CryptProtectData會做,併爲增加安全性的pOptionalEntropy參數(然後接受@Patrick答案,而不是我的)。

相關問題