windows在从中检索值之前如何执行完整性检查

How windows performs integrity check before retrieving the values from it?

本文关键字:何执行 执行 完整性检查 检索 windows      更新时间:2023-10-16

嗨,我想知道windows在读取注册表值之前是如何对其进行完整性检查的。

当我在windows注册表中更改缓存的域凭据时,我从以下键HKEY_LOCAL_MACHINE\SECURITY\CACHE\NL$1。。。NL$10.

我已经用NL$KM键值对其进行了解码,并丢弃了存储的密码哈希。我希望用我自己新生成的哈希来更改哈希。但Windows有点棘手,他们添加了最后的校验和验证,我希望但不确定。因此,当系统未与域连接时,有任何方法可以更改哈希并使系统离线工作。

以下是执行此操作的代码:

加密或解密缓存技术因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;

}

生成新的密码哈希:[仅供参考:其可靠性]

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

用新密码哈希替换旧密码哈希&再次加密它们:

 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);

将它们全部写回注册表:[仅供参考:实际上我通过系统帐户做得很好]

 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 ...");
  }
 }

有两个校验和,一个在未加密部分,另一个在尾部。