MS SQL PasswordsPro module
          ++++++++++++++++++++++++++


Software required
       * PasswordsPro


MS SQL use both upper/mixed case password hashes, MS SQL 2005 omits
the upper case version for increased protection against brute force attacks.

Please ensure that 'Convert passwords to unicode before hashing' option is enabled
before using this module for either of the upper/mixed case hashes.




A little theory on hash creation
+++++++++++++++++++++++++++++++++

The algorithm is fairly simple.
Convert the password to UNICODE format (if not unicode already)
Append a random 4-byte salt, then process with SHA-1

Below is basic code which will compute both mixed/uppercase hash values.
where len is length of ANSI string.
password1 and password2 hold lower/upper case variants respectively.
argv[1] is pointer to ANSI password string.
This isn't proper unicode conversion, i know - just to demonstrate.

The salt is 4 byte random challenge, use rand() for example.

-------------------------------------------------- start

    for(i = 0; i < len; i++)
    {
      ((unsigned short *)password1)[i] = argv[1][i];
      ((unsigned short *)password2)[i] = toupper(argv[1][i]);
    }

    memcpy(&password1[len*2],&salt,4);
    memcpy(&password2[len*2],&salt,4);

    SHA1Init(&sha1_ctx1);
    SHA1Init(&sha1_ctx2);

    SHA1Update(&sha1_ctx1,(uchar*)password1,len*2 + 4);
    SHA1Update(&sha1_ctx2,(uchar*)password2,len*2 + 4);

    SHA1Final(&sha1_ctx1,(uchar*)&msql_hash1);
    SHA1Final(&sha1_ctx2,(uchar*)&msql_hash2);

-------------------------------------------------- end

Information on the algorithm was found in article by David Litchfield.
google for "Cracking SQL passwords" for more information.

++++++++++++++++++++++++++++++++++++++

Feb 5th - v1.1b
   * updated to reflect API changes
   
Dec 30th - Version 1.0
   * fixed silly bugs

Oct 24th - Version 1.0b
   * pre-release

send all bugs/comments to Kevin Devine