我一直在考慮實施以下程序,只是出於好奇和學習的經驗。我想編寫一個保護文件夾密碼的程序,因此您只能在輸入正確的密碼後才能打開文件夾。我知道這是特定於操作系統,所以讓它成爲Windows
。我想這隻在C++
可能,但如果它也有可能在普通C#
或Java
(我懷疑),那麼請告訴我。Windows文件夾密碼
難道有人指着我正確的方向嗎?提前致謝!
最好的問候,斯托
我一直在考慮實施以下程序,只是出於好奇和學習的經驗。我想編寫一個保護文件夾密碼的程序,因此您只能在輸入正確的密碼後才能打開文件夾。我知道這是特定於操作系統,所以讓它成爲Windows
。我想這隻在C++
可能,但如果它也有可能在普通C#
或Java
(我懷疑),那麼請告訴我。Windows文件夾密碼
難道有人指着我正確的方向嗎?提前致謝!
最好的問候,斯托
如果您想對文件進行防彈保護,那麼僅保護對該文件夾的訪問是不夠的,您必須對它們進行加密,並且市場上有安全的容器和文件系統加密。
如果它不需要高安全性,我可以掛鉤到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,這是可能是最好的概念意識到有問題的應用程序後。
從我頭頂一個「簡單」的實現一個想法。
這個想法是使用Windows身份驗證來創建這樣的受保護的文件夾。
您的應用程序可以爲每個加密文件夾F生成一個用戶。 因此,對於文件夾Fi,您將生成密碼爲Pi的用戶Ui。
此外,對於每個Fi,您的應用程序必須確保只有用戶有權訪問它,並且沒有人可以添加訪問權限。另外,使用NTFS.sys中的窗口加密對文件進行加密(應該有一個簡單的函數來加密Windows API中的文件,不記得它的名字)。
現在,如果有人想要訪問Fi,您將彈出一個消息框詢問密碼,如果他們是正確的(您可以使用AccessCheck()),您可以使用指向Fi的Ui憑證打開資源管理器,或向用戶添加Ui憑證用戶(在這種情況下,您將不得不在某個時候刪除它們,因此可能會非常棘手)。
Windows(NTFS)支持「連接點」。這些是文件系統中告訴Windows執行一些代碼的條目。常見的連接點類型是硬鏈接到另一個文件或文件夾。但是,您可以添加其他類型的驅動程序。
在你的情況下,你的加密文件夾可能真的是交匯點,像安全的硬鏈接一樣工作。喲只解決授權用戶的硬鏈接。由於這適用於NTFS內核級別,因此無需擔心Windows不同層中存在的數百個不同的文件功能。
您的意思是說您的程序將成爲一項服務,並且所有涉及文件夾的用戶操作必須通過您的服務完成?聽起來很棘手... – 2011-04-02 12:07:17
@Armen Tsirunyan - 是的,可以這麼說。有些文件夾會被密碼保護,有些則不會。 – 2011-04-02 12:15:43
這裏有一個棘手的問題(我認爲解決方案是一個加密驅動程序): Alice和Bob連接到帶有加密文件夾F的機器。 Alice知道F的密碼,Bob不知道F.的密碼。 Bob試圖以「怪異」的方式(cmd.exe或他自己的應用程序)進入文件夾,並發現它們應該是的加密文件。 Alice爲F插入密碼,因此您解密文件。現在,您如何解密這些文件並確保Bob無法觸摸它們? 不知何故必須確保無權訪問F的用戶將無法訪問它! – TCS 2011-04-02 12:19:45