2011-04-02 24 views
6

He estado pensando en implementar el siguiente programa, solo por curiosidad y experiencia de aprendizaje. Quiero escribir un programa para proteger con contraseña una carpeta, por lo que solo puede abrir la carpeta después de ingresar la contraseña correcta. Sé que esto es específico del sistema operativo, así que déjalo en Windows. Supongo que esto solo es posible en C++, pero si también es posible en el C# o el Java (lo cual dudo), por favor díganme.Contraseña de la carpeta de Windows

¿Podría alguien señalarme en la dirección correcta? ¡Gracias por adelantado!

Saludos, Petar

+0

¿Quiere decir que su programa va a ser un servicio y todas las acciones del usuario relacionadas con las carpetas deben realizarse a través de su servicio? Suena complicado ... –

+0

@Armen Tsirunyan - Sí, se puede decir así. Algunas carpetas estarán protegidas con contraseña, otras no. –

+0

Aquí hay una pregunta complicada (y creo que la solución es un controlador de cifrado): Alice y Bob conectados a una máquina con la carpeta cifrada F. Alice conoce la contraseña de F y Bob no conoce la contraseña de F. Bob intenta ingresar a la carpeta de maneras "extrañas" (cmd.exe o su propia aplicación) y encuentra archivos cifrados, como deberían ser. Alice inserta la contraseña para F, por lo que descifrar los archivos. Ahora, ¿cómo descifras los archivos y te aseguras de que Bob no los pueda tocar? ¡De alguna forma hay que asegurarse de que los usuarios que no tienen acceso a F no puedan acceder a él! – TCS

Respuesta

3

Si desea una protección a prueba de balas de sus archivos, simplemente proteger el acceso a la carpeta no es suficiente, tendría que encriptarlos y existen contenedores seguros y sistemas de archivos encyptions en el mercado.

Si no necesita ser de alta seguridad, puede conectarlo a Windows, supongo. Necesitará especialmente enganchar en las funciones de listado de directorios, como FindFirstFile, FindNextFile y OpenFile también probablemente (y en sus derivados como FindFirstFileW) y tal vez algunos otros.

haces eso redirigiendo las llamadas a KERNEL32.dll a sus funciones habituales, ver un pequeño ejemplo de código siguiente que encontré en el Internet:

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; 
    } 

Lo que quiere hacer se puede hacer también con Java (JNI) o C# (pinvoke), pero sería un verdadero desvío. Usaría algo que pueda compilarse en código nativo.

Editar: Aoi Karasu proporciona un enlace a un post que sugiere utilizar un FileSystemFilterDriver, que es probablemente la mejor concepto para darse cuenta de la aplicación en cuestión.

+0

¿Qué anzuelo usarías para esto? Me refiero a qué enlace le permite monitorear llamadas API específicas? –

+0

No los supervisa, "dobla" las llamadas mediante la manipulación de la memoria. – Falcon

+0

¿Estás seguro de que FindNextFile y FindFirstFile están siendo utilizados por el explorador? Y aun así, ¿qué sucede una vez que descifras? ¿Cómo se evita que otros usuarios en el sistema accedan a los archivos descifrados? – TCS

0

Una idea de la parte superior de mi cabeza para una aplicación "simple".

La idea es usar la autenticación de Windows para crear dichas carpetas protegidas.

Su aplicación puede generar un usuario para cada carpeta cifrada F. Por lo tanto, para la carpeta Fi generará el usuario Ui con la contraseña Pi.

Además, para cada Fi su aplicación deberá asegurarse de que SÓLO Ui tenga acceso a ella y de que nadie pueda acceder a ella. Además, encripte los archivos usando el cifrado de la ventana en NTFS.sys (debe haber una función simple para encriptar los archivos en la API de Windows, no puede recordar su nombre).

Ahora, si alguien quiere acceder a Fi aparecerá un cuadro de mensaje que le pedirá la contraseña, si es correcto (puede usar AccessCheck()) puede abrir el explorador con credenciales Ui apuntando a Fi O agregar credenciales Ui al usuario (en este caso, tendrá que eliminarlos en algún momento, por lo que podría ser complicado).

0

Windows (NTFS) admite "puntos de unión". Estas son entradas en el sistema de archivos que le dicen a Windows que ejecute un poco de código. Un tipo común de punto de unión es el enlace fijo a otro archivo o carpeta. Sin embargo, puede agregar otros tipos con controladores que coincidan.

En su caso, sus carpetas encriptadas podrían ser realmente puntos de unión que funcionan como enlaces duros seguros. Yo solo resuelvo el enlace fijo para usuarios autorizados.Debido a que esto funciona a nivel de kernel NTFS, no necesita preocuparse por las millones de funciones de archivos diferentes que existen en las diferentes capas de Windows.

Cuestiones relacionadas