none
Consulta sobre estructuras UserName y Newpassword pasadas a la función PasswordChangeNotify para programar una DLL de password Filter RRS feed

  • Pregunta

  • Buenas noches,

    Estoy tratando de programar una librería DLL (en Visual Studio C++ 2010) a la que llamar como Password Filter. Tengo el siguiente código :

    // This is the main DLL file.

    #include "stdafx.h"
    #include <stdio.h>
    #include <string>
    #include <atlbase.h>

    using namespace std;

    // Default DllMain implementation
    BOOL APIENTRY DllMain( HANDLE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
            case DLL_PROCESS_ATTACH:
            case DLL_THREAD_ATTACH:
            case DLL_THREAD_DETACH:
            case DLL_PROCESS_DETACH:
                break;
        }
        return TRUE;
    }


    /////////////////////////////////////////////
    // Exported function
    // -----------------
    // Initialization of Password filter.
    // This implementation just returns TRUE
    // to let LSA know everything is fine
    BOOLEAN __stdcall InitializeChangeNotify(void)
    {
        return TRUE;
    }

    ////////////////////////////////////////////
    // Exported function
    // -----------------
    // This function is called by LSA when password
    // was successfully changed.
    //
    // This implementation just returns 0 (Success)
    NTSTATUS __stdcall PasswordChangeNotify(
      PUNICODE_STRING UserName,
      ULONG RelativeId,
      PUNICODE_STRING NewPassword
    )
    {

        // Anoto usuario-clave en fichero
        FILE *file2 = fopen("c:\\FilterLog2.txt", "a+");
        fwprintf(file2, L"Los credenciales cambiados son usuario-contrasena: %s-%s\n", UserName->Buffer, NewPassword->Buffer);
        fclose(file2);
            

        
        return 0;
    }

    ////////////////////////////////////////////
    // Exported function
    // -----------------
    // This function actually validates
    // a new password.
    // LSA calls this function when a password is assign to a new user
    // or password is changed on exisiting user.
    //
    // This function return TRUE is password meets requirements
    // that filter checks; FALSE is password does NOT meet these requirements
    //
    // In our implementation, specified Regular Expression must match new password
    BOOLEAN __stdcall PasswordFilter(
      PUNICODE_STRING AccountName,
      PUNICODE_STRING FullName,
      PUNICODE_STRING Password,
      BOOLEAN SetOperation
    )
    {
        return TRUE;
    }

    Un código bastante sencillo que de momento lo único que hace (para la fase de pruebas) es escribir los nuevos credenciales de acceso en un fichero y seguidos de un literal.

    El problema que tengo, es que me estoy encontrando en el fichero generado lo siguiente :

    Los credenciales cambiados son usuario-contrasena: perico-_Nohagonada65??
    Los credenciales cambiados son usuario-contrasena: perico-_Pypo87
    Los credenciales cambiados son usuario-contrasena: antonio-_Capullo3?????›??

    En la primera y tercera clave, hay unos interrogantes y un caracter (>) que yo no he metido... en la segunda contraseña efectivamente sale el valor que yo he metido....

    Al hacer estas pruebas veo que este fenómeno se repite a menudo. La pregunta es, al ver que no siempre sucede, cómo debo tratar el valor que me pasa Windows a la función PasswordChangeNotify?. Cómo manda Windows esos valores de esas dos estructuras?.

    Muchas gracias por vuestro tiempo y ayuda.

    Un saludo!

    sábado, 9 de noviembre de 2013 21:44