在从它检索值之前,Windows如何执行完整性检查?

您好,我想知道如何Windows执行完整性检查registry值之前它将要读取它。

虽然我正在更改Windowsregistry中的caching域凭据,我从下面的键HKEY_LOCAL_MACHINE \ SECURITY \ CACHE \ NL $ 1 … NL $ 10得到这些值。

我用NL $ KM键值对它进行了解码并转储了存储的密码哈希值。 我希望用我自己的新生成的散列来改变散列。 但Windows有点棘手,他们已经添加了最终校验和validation,以validation它,我希望但不知道。 因此,当系统没有连接到域时,有任何方法可以改变散列并使系统在离线状态下工作。

这里是做这个的代码:

要进行encryption或解密caching技术取决于Windows操作系统版本

int cryptData(LPBYTE in,LPBYTE out,DWORD dataSize,CRYPT_KEYS *keys,CRYPT_TYPE cType) { RC4_KEY rc4_ctx; AES_KEY aes_ctx; BYTE aes_iv[16]; RtlMoveMemory(aes_iv,keys->aes_iv,sizeof(keys->aes_iv)); switch(cType) { case ENCRYPT: if(keys->version<6) { HMAC(EVP_md5(),keys->nl$km,sizeof(keys->nl$km),keys->hmac_message,sizeof(keys->hmac_message),keys->rc4_key,NULL); RC4_set_key(&rc4_ctx,MD5_DIGEST_LENGTH,keys->rc4_key); RC4(&rc4_ctx,dataSize,in,out); } else { AES_set_encrypt_key(keys->nl$km,128,&aes_ctx); AES_cbc_encrypt(in,out,dataSize,&aes_ctx,aes_iv,AES_ENCRYPT); } break; case DECRYPT: if(keys->version<6) { HMAC(EVP_md5(),keys->nl$km,sizeof(keys->nl$km),keys->hmac_message,sizeof(keys->hmac_message),keys->rc4_key,NULL); RC4_set_key(&rc4_ctx,MD5_DIGEST_LENGTH,keys->rc4_key); RC4(&rc4_ctx,dataSize,in,out); } else { AES_set_decrypt_key(keys->nl$km,128,&aes_ctx); AES_cbc_encrypt(in,out,dataSize,&aes_ctx,aes_iv,AES_DECRYPT); } break; } return 0; 

}

生成新的密码散列:[FYI:可靠]

  HashGen hash(username,password,this->getOSVersion()); 

用新密码replace旧密码散列并再次encryption:

  RtlMoveMemory(decipheredData,hash.getHashDigest(),NTLM_HASH_SIZE); RtlZeroMemory(cipheredData,cachedAccount->cacheSize); cryptData(decipheredData,cipheredData,cachedAccount->cacheSize,&keys,ENCRYPT); RtlMoveMemory(cachedAccount->cache+96,cipheredData,cachedAccount->cacheSize-96); 

把他们全部写在registry中: [FYI:工作正常,但我正在通过系统帐户进行​​操作]

  HKEY hOpenedKey; DWORD status,nMaxLength; if( ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"security\\cache",0,KEY_WRITE,&hOpenedKey) ) { int status = RegSetValueEx(hOpenedKey,L"nl$1",0,REG_BINARY,cachedAccount->cache,cachedAccount->cacheSize ); if( status != ERROR_SUCCESS ) { printf("cache Update failed ..."); RegCloseKey( hOpenedKey ); } else { RegCloseKey( hOpenedKey ); printf("cache Updated successfully ..."); } } 

unnc部分有一个校验和,尾部有一个校验和。