[SAMSRV]
authorEric Kohl <eric.kohl@reactos.org>
Sun, 26 May 2013 10:48:54 +0000 (10:48 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sun, 26 May 2013 10:48:54 +0000 (10:48 +0000)
Calculate NT and LM hashes of the empty password string and use them as default passwords hashes in new user accounts.

svn path=/trunk/; revision=59083

reactos/dll/win32/samsrv/samrpc.c
reactos/dll/win32/samsrv/samsrv.c
reactos/dll/win32/samsrv/samsrv.h
reactos/dll/win32/samsrv/setup.c

index cdce9b4..9de3b92 100644 (file)
@@ -2371,8 +2371,8 @@ SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle,
     Status = SampSetObjectAttribute(UserObject,
                                     L"LMPwd",
                                     REG_BINARY,
     Status = SampSetObjectAttribute(UserObject,
                                     L"LMPwd",
                                     REG_BINARY,
-                                    NULL,
-                                    0);
+                                    &EmptyLmHash,
+                                    sizeof(ENCRYPTED_LM_OWF_PASSWORD));
     if (!NT_SUCCESS(Status))
     {
         TRACE("failed with status 0x%08lx\n", Status);
     if (!NT_SUCCESS(Status))
     {
         TRACE("failed with status 0x%08lx\n", Status);
@@ -2383,8 +2383,8 @@ SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle,
     Status = SampSetObjectAttribute(UserObject,
                                     L"NTPwd",
                                     REG_BINARY,
     Status = SampSetObjectAttribute(UserObject,
                                     L"NTPwd",
                                     REG_BINARY,
-                                    NULL,
-                                    0);
+                                    &EmptyNtHash,
+                                    sizeof(ENCRYPTED_NT_OWF_PASSWORD));
     if (!NT_SUCCESS(Status))
     {
         TRACE("failed with status 0x%08lx\n", Status);
     if (!NT_SUCCESS(Status))
     {
         TRACE("failed with status 0x%08lx\n", Status);
index 490f616..07d9974 100644 (file)
 
 WINE_DEFAULT_DEBUG_CHANNEL(samsrv);
 
 
 WINE_DEFAULT_DEBUG_CHANNEL(samsrv);
 
-/* FUNCTIONS ****************************************************************/
+
+/* GLOBALS *******************************************************************/
+
+ENCRYPTED_NT_OWF_PASSWORD EmptyNtHash;
+ENCRYPTED_LM_OWF_PASSWORD EmptyLmHash;
+
+
+/* FUNCTIONS *****************************************************************/
+
+static
+NTSTATUS
+SampInitHashes(VOID)
+{
+    UNICODE_STRING EmptyNtPassword = {0, 0, NULL};
+    CHAR EmptyLmPassword[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
+    NTSTATUS Status;
+
+    /* Calculate the NT hash value of the empty password */
+    Status = SystemFunction007(&EmptyNtPassword,
+                               (LPBYTE)&EmptyNtHash);
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("Calculation of the empty NT hash failed (Status 0x%08lx)\n", Status);
+        return Status;
+    }
+
+    /* Calculate the LM hash value of the empty password */
+    Status = SystemFunction006(EmptyLmPassword,
+                               (LPSTR)&EmptyLmHash);
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("Calculation of the empty LM hash failed (Status 0x%08lx)\n", Status);
+    }
+
+    return Status;
+}
+
 
 NTSTATUS
 NTAPI
 
 NTSTATUS
 NTAPI
@@ -70,6 +106,10 @@ SamIInitialize(VOID)
 
     TRACE("SamIInitialize() called\n");
 
 
     TRACE("SamIInitialize() called\n");
 
+    Status = SampInitHashes();
+    if (!NT_SUCCESS(Status))
+        return Status;
+
     if (SampIsSetupRunning())
     {
         Status = SampInitializeRegistry();
     if (SampIsSetupRunning())
     {
         Status = SampInitializeRegistry();
index dffc65e..8d942fa 100644 (file)
@@ -118,6 +118,8 @@ typedef struct _SAM_USER_FIXED_DATA
 
 
 extern PGENERIC_MAPPING pServerMapping;
 
 
 extern PGENERIC_MAPPING pServerMapping;
+extern ENCRYPTED_NT_OWF_PASSWORD EmptyNtHash;
+extern ENCRYPTED_LM_OWF_PASSWORD EmptyLmHash;
 
 
 /* alias.c */
 
 
 /* alias.c */
@@ -371,4 +373,17 @@ NTSTATUS
 SampGetRidFromSid(IN PSID Sid,
                   OUT PULONG Rid);
 
 SampGetRidFromSid(IN PSID Sid,
                   OUT PULONG Rid);
 
+
+/* Undocumented advapi32 functions */
+
+NTSTATUS
+WINAPI
+SystemFunction006(LPCSTR password,
+                  LPSTR hash);
+
+NTSTATUS
+WINAPI
+SystemFunction007(PUNICODE_STRING string,
+                  LPBYTE hash);
+
 /* EOF */
 /* EOF */
index 97f7436..416551c 100644 (file)
@@ -301,16 +301,16 @@ SampSetupCreateUserAccount(HKEY hDomainKey,
                       L"LMPwd",
                       0,
                       REG_BINARY,
                       L"LMPwd",
                       0,
                       REG_BINARY,
-                      NULL,
-                      0);
+                      (LPVOID)&EmptyLmHash,
+                      sizeof(ENCRYPTED_LM_OWF_PASSWORD));
 
         /* Set NTPwd attribute*/
         RegSetValueEx(hAccountKey,
                       L"NTPwd",
                       0,
                       REG_BINARY,
 
         /* Set NTPwd attribute*/
         RegSetValueEx(hAccountKey,
                       L"NTPwd",
                       0,
                       REG_BINARY,
-                      NULL,
-                      0);
+                      (LPVOID)&EmptyNtHash,
+                      sizeof(ENCRYPTED_NT_OWF_PASSWORD));
 
         /* Set LMPwdHistory attribute*/
         RegSetValueEx(hAccountKey,
 
         /* Set LMPwdHistory attribute*/
         RegSetValueEx(hAccountKey,