gpt4 book ai didi

c++ - Windows如何在从中检索值之前执行完整性检查?

转载 作者:行者123 更新时间:2023-11-28 07:46:17 25 4
gpt4 key购买 nike

您好,我想知道 Windows 在读取注册表值之前如何对注册表值执行完整性检查。

当我在 Windows 注册表中更改缓存的域凭据时,我从以下键 HKEY_LOCAL_MACHINE\SECURITY\CACHE\NL$1 ... NL$10 获得了这些值。

我已经用 NL$KM key 值对其进行了解码,并转储了存储的密码哈希。我希望用我自己新生成的哈希来更改哈希。但是 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 ...");
}
}

最佳答案

有两个校验和,一个在 unenc 部分,一个在尾部。

关于c++ - Windows如何在从中检索值之前执行完整性检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14830908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com