bool NTLMPasswordSeek(unsigned char* pLMPassword, int nLMPasswordLen, int nLMPasswordNext, unsigned char* pNTLMHash, string& sNTLMPassword) { if (nLMPasswordNext == nLMPasswordLen) { unsigned char md[16]; MD4(pLMPassword, nLMPasswordLen * 2, md); if (memcmp(md, pNTLMHash, 16) == 0) { sNTLMPassword = ""; int i; for (i = 0; i < nLMPasswordLen; i++) sNTLMPassword += char(pLMPassword[i * 2]); return true; } else return false; } if (NTLMPasswordSeek(pLMPassword, nLMPasswordLen, nLMPasswordNext + 1, pNTLMHash, sNTLMPassword)) return true; if ( pLMPassword[nLMPasswordNext * 2] >= 'A' && pLMPassword[nLMPasswordNext * 2] <= 'Z') { pLMPassword[nLMPasswordNext * 2] = pLMPassword[nLMPasswordNext * 2] - 'A' + 'a'; if (NTLMPasswordSeek(pLMPassword, nLMPasswordLen, nLMPasswordNext + 1, pNTLMHash, sNTLMPassword)) return true; pLMPassword[nLMPasswordNext * 2] = pLMPassword[nLMPasswordNext * 2] - 'a' + 'A'; } return false; }
bool NTLMPasswordSeek(unsigned char* pLMPassword, int nLMPasswordLen, int nLMPasswordNext, unsigned char* pNTLMHash, std::string& sNTLMPassword) { if (nLMPasswordNext == nLMPasswordLen) { unsigned char md[MD4_DIGEST_LENGTH]; MD4_NEW(pLMPassword, nLMPasswordLen * 2, md); if (memcmp(md, pNTLMHash, MD4_DIGEST_LENGTH) == 0) { sNTLMPassword = ""; for (int index = 0; index < nLMPasswordLen; index++) sNTLMPassword += char(pLMPassword[index * 2]); return true; } else return false; } if (NTLMPasswordSeek(pLMPassword, nLMPasswordLen, nLMPasswordNext + 1, pNTLMHash, sNTLMPassword)) return true; if ( pLMPassword[nLMPasswordNext * 2] >= 'A' && pLMPassword[nLMPasswordNext * 2] <= 'Z') { pLMPassword[nLMPasswordNext * 2] = (unsigned char) pLMPassword[nLMPasswordNext * 2] - 'A' + 'a'; if (NTLMPasswordSeek(pLMPassword, nLMPasswordLen, nLMPasswordNext + 1, pNTLMHash, sNTLMPassword)) return true; pLMPassword[nLMPasswordNext * 2] = (unsigned char) pLMPassword[nLMPasswordNext * 2] - 'a' + 'A'; } return false; }
bool LMPasswordCorrectCase( std::string sLMPassword, unsigned char* pNTLMHash, std::string& sNTLMPassword ) { if (sLMPassword.size() == 0) { sNTLMPassword = ""; return true; } unsigned char* pLMPassword = new unsigned char[sLMPassword.size() * 2]; for (uint32 index = 0; index < sLMPassword.size(); index++) { pLMPassword[index * 2 ] = sLMPassword[index]; pLMPassword[index * 2 + 1] = 0x00; } bool fRet = NTLMPasswordSeek(pLMPassword, sLMPassword.size(), 0, pNTLMHash, sNTLMPassword); delete pLMPassword; return fRet; }