2011-04-02 72 views
6

我一直在考慮實施以下程序,只是出於好奇和學習的經驗。我想編寫一個保護文件夾密碼的程序,因此您只能在輸入正確的密碼後才能打開文件夾。我知道這是特定於操作系統,所以讓它成爲Windows。我想這隻在C++可能,但如果它也有可能在普通C#Java(我懷疑),那麼請告訴我。Windows文件夾密碼

難道有人指着我正確的方向嗎?提前致謝!

最好的問候,斯托

+0

您的意思是說您的程序將成爲一項服務,並且所有涉及文件夾的用戶操作必須通過您的服務完成?聽起來很棘手... – 2011-04-02 12:07:17

+0

@Armen Tsirunyan - 是的,可以這麼說。有些文件夾會被密碼保護,有些則不會。 – 2011-04-02 12:15:43

+0

這裏有一個棘手的問題(我認爲解決方案是一個加密驅動程序): Alice和Bob連接到帶有加密文件夾F的機器。 Alice知道F的密碼,Bob不知道F.的密碼。 Bob試圖以「怪異」的方式(cmd.exe或他自己的應用程序)進入文件夾,並發現它們應該是的加密文件。 Alice爲F插入密碼,因此您解密文件。現在,您如何解密這些文件並確保Bob無法觸摸它們? 不知何故必須確保無權訪問F的用戶將無法訪問它! – TCS 2011-04-02 12:19:45

回答

3

如果您想對文件進行防彈保護,那麼僅保護對該文件夾的訪問是不夠的,您必須對它們進行加密,並且市場上有安全的容器和文件系統加密。

如果它不需要高安全性,我可以掛鉤到Windows。你將特別需要鉤入目錄列表函數,例如FindFirstFile,FindNextFile和OpenFile,也可能(以及FindFirstFileW中的派生類)以及其他一些函數。

你做到這一點通過重定向調用KERNEL32.DLL您的自定義功能,看到一個小的代碼示例下面,我發現在互聯網上:

unsigned char Store[10]; 
    //redirect FindNextFileW to your custom function 
    void HookAPI() 
    { 
     DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE; 
     HMODULE hmod = GetModuleHandle("Kernel32.dll"); 
     long pa = (long)GetProcAddress(hmod,"FindNextFileW"); 
     long pa2 = (long)MyFindNextFile; 
     long dAddr = pa2 - pa - 5; 
     unsigned char *p = (unsigned char *)pa; 
     unsigned char *p2 = (unsigned char *)(&dAddr); 

     VirtualProtect((void *)pa,5,NewProtect,&OldProtect); 

     for (int i=0;i<5;i++) 
      Store[i] = p[i]; 

     p[0] = (unsigned char)0xE9; 
     for (int i=0;i<4;i++) 
      p[i + 1] = p2[i]; 

     VirtualProtect((void *)pa,5,OldProtect,&NewProtect); 
    } 

    void UnHookAPI() 
    { 
     DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE; 
     HMODULE hmod = GetModuleHandle("Kernel32.dll"); 
     long pa = (long)GetProcAddress(hmod,"FindNextFileW"); 
     unsigned char *p = (unsigned char *)pa; 

     VirtualProtect((void *)pa,5,NewProtect,&OldProtect); 

     for (int i=0;i<5;i++) 
      p[i] = Store[i]; 

     VirtualProtect((void *)pa,5,OldProtect,&NewProtect); 
    } 

    BOOL WINAPI MyFindNextFile(HANDLE hFindFile,LPWIN32_FIND_DATAW lpFindFileData) 
    { 
     UnHookAPI(); 
     BOOL ans = FindNextFileW(hFindFile, lpFindFileData); 

     //your logic here, display password prompt to user e.g. 

     HookAPI(); 
     return ans; 
    } 

你想要做什麼也可以使用Java來完成(JNI)或C#(pinvoke),但它會是一個真正的繞道。我會使用可以編譯爲本地代碼的東西。

編輯: 葵卡拉蘇提供的鏈接,這表明使用FileSystemFilterDriver,這是可能是最好的概念意識到有問題的應用程序後。

+0

你會用這個鉤子麼?我的意思是使用哪個鉤子來監視特定的API調用? – 2011-04-02 12:54:42

+0

你不監視它們,你通過內存操作「彎曲」調用。 – Falcon 2011-04-02 13:04:49

+0

您確定瀏覽器正在使用FindNextFile和FindFirstFile嗎? 即便如此,解密後會發生什麼?你如何阻止系統中的其他用戶訪問解密的文件? – TCS 2011-04-02 13:21:59

0

從我頭頂一個「簡單」的實現一個想法。

這個想法是使用Windows身份驗證來創建這樣的受保護的文件夾。

您的應用程序可以爲每個加密文件夾F生成一個用戶。 因此,對於文件夾Fi,您將生成密碼爲Pi的用戶Ui。

此外,對於每個Fi,您的應用程序必須確保只有用戶有權訪問它,並且沒有人可以添加訪問權限。另外,使用NTFS.sys中的窗口加密對文件進行加密(應該有一個簡單的函數來加密Windows API中的文件,不記得它的名字)。

現在,如果有人想要訪問Fi,您將彈出一個消息框詢問密​​碼,如果他們是正確的(您可以使用AccessCheck()),您可以使用指向Fi的Ui憑證打開資源管理器,或向用戶添加Ui憑證用戶(在這種情況下,您將不得不在某個時候刪除它們,因此可能會非常棘手)。

0

Windows(NTFS)支持「連接點」。這些是文件系統中告訴Windows執行一些代碼的條目。常見的連接點類型是硬鏈接到另一個文件或文件夾。但是,您可以添加其他類型的驅動程序。

在你的情況下,你的加密文件夾可能真的是交匯點,像安全的硬鏈接一樣工作。喲只解決授權用戶的硬鏈接。由於這適用於NTFS內核級別,因此無需擔心Windows不同層中存在的數百個不同的文件功能。