windows在从中检索值之前如何执行完整性检查
How windows performs integrity check before retrieving the values from it?
嗨,我想知道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 ...");
}
}
有两个校验和,一个在未加密部分,另一个在尾部。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- QML按钮点击功能执行顺序
- 程序在执行程序的其余部分之前退出
- 为什么catch中的代码没有被执行
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 强制执行执行顺序
- C++执行执行的 bash 脚本随机停止
- 在 C++11 中缺少对执行执行的"missing sentinel"警告
- 调试与发布可执行文件有何不同?