void kull_m_cred_vault_credential_create_attribute_from_data(PBYTE ptr, PKULL_M_CRED_VAULT_CREDENTIAL_ATTRIBUTE attribute) { BOOLEAN isIV; if(attribute->szData = *(PDWORD) ptr) { attribute->szData--; ptr += sizeof(DWORD); isIV = *(PBOOLEAN) ptr; ptr += sizeof(BOOLEAN); if(isIV) { attribute->szData -= sizeof(DWORD);; if(attribute->szIV = *(PDWORD) ptr) { attribute->szData -= attribute->szIV; ptr += sizeof(DWORD); attribute->IV = ptr; ptr += attribute->szIV; kull_m_string_ptr_replace(&attribute->IV, attribute->szIV); } } attribute->data = ptr; kull_m_string_ptr_replace(&attribute->data, attribute->szData); } }
PKULL_M_KEY_CNG_PROPERTY kull_m_key_cng_property_create(PVOID data/*, DWORD size*/) { PKULL_M_KEY_CNG_PROPERTY cngProperty = NULL; if(cngProperty = (PKULL_M_KEY_CNG_PROPERTY) LocalAlloc(LPTR, sizeof(KULL_M_KEY_CNG_PROPERTY))) { RtlCopyMemory(cngProperty, data, FIELD_OFFSET(KULL_M_KEY_CNG_PROPERTY, pName)); cngProperty->pName = (PSTR) ((PBYTE) data + FIELD_OFFSET(KULL_M_KEY_CNG_PROPERTY, pName)); cngProperty->pProperty = (PBYTE) cngProperty->pName + cngProperty->dwNameLen; kull_m_string_ptr_replace(&cngProperty->pName, cngProperty->dwNameLen); kull_m_string_ptr_replace(&cngProperty->pProperty, cngProperty->dwPropertyLen); } return cngProperty; }
PKULL_M_KEY_CAPI_BLOB kull_m_key_capi_create(PVOID data/*, DWORD size*/) { PKULL_M_KEY_CAPI_BLOB capiKey = NULL; if(capiKey = (PKULL_M_KEY_CAPI_BLOB) LocalAlloc(LPTR, sizeof(KULL_M_KEY_CAPI_BLOB))) { RtlCopyMemory(capiKey, data, FIELD_OFFSET(KULL_M_KEY_CAPI_BLOB, pName)); capiKey->pName = (PSTR) ((PBYTE) data + FIELD_OFFSET(KULL_M_KEY_CAPI_BLOB, pName)); capiKey->pHash = (PBYTE) capiKey->pName + capiKey->dwNameLen; capiKey->pSiPublicKey = (PBYTE) capiKey->pHash + capiKey->dwHashLen; capiKey->pSiPrivateKey = (PBYTE) capiKey->pSiPublicKey + capiKey->dwSiPublicKeyLen; capiKey->pSiExportFlag = (PBYTE) capiKey->pSiPrivateKey + capiKey->dwSiPrivateKeyLen; capiKey->pExPublicKey = (PBYTE) capiKey->pSiExportFlag + capiKey->dwSiExportFlagLen; capiKey->pExPrivateKey = (PBYTE) capiKey->pExPublicKey + capiKey->dwExPublicKeyLen; capiKey->pExExportFlag = (PBYTE) capiKey->pExPrivateKey + capiKey->dwExPrivateKeyLen; kull_m_string_ptr_replace(&capiKey->pName, capiKey->dwNameLen); kull_m_string_ptr_replace(&capiKey->pHash, capiKey->dwHashLen); kull_m_string_ptr_replace(&capiKey->pSiPublicKey, capiKey->dwSiPublicKeyLen); kull_m_string_ptr_replace(&capiKey->pSiPrivateKey, capiKey->dwSiPrivateKeyLen); kull_m_string_ptr_replace(&capiKey->pSiExportFlag, capiKey->dwSiExportFlagLen); kull_m_string_ptr_replace(&capiKey->pExPublicKey, capiKey->dwExPublicKeyLen); kull_m_string_ptr_replace(&capiKey->pExPrivateKey, capiKey->dwExPrivateKeyLen); kull_m_string_ptr_replace(&capiKey->pExExportFlag, capiKey->dwExExportFlagLen); } return capiKey; }
PKULL_M_CRED_ATTRIBUTE kull_m_cred_attribute_create(PVOID data/*, DWORD size*/) { PKULL_M_CRED_ATTRIBUTE Attribute = NULL; if(Attribute = (PKULL_M_CRED_ATTRIBUTE) LocalAlloc(LPTR, sizeof(KULL_M_CRED_ATTRIBUTE))) { RtlCopyMemory(Attribute, data, FIELD_OFFSET(KULL_M_CRED_ATTRIBUTE, Keyword)); Attribute->Keyword = (LPWSTR) ((PBYTE) data + FIELD_OFFSET(KULL_M_CRED_ATTRIBUTE, Keyword)); Attribute->ValueSize = *(PDWORD) ((PBYTE) Attribute->Keyword + Attribute->dwKeyword); Attribute->Value = (PBYTE) Attribute->Keyword + Attribute->dwKeyword + sizeof(DWORD); kull_m_string_ptr_replace(&Attribute->Keyword, Attribute->dwKeyword); kull_m_string_ptr_replace(&Attribute->Value, Attribute->ValueSize); } return Attribute; }
PKULL_M_CRED_VAULT_CREDENTIAL kull_m_cred_vault_credential_create(PVOID data/*, DWORD size*/) { PKULL_M_CRED_VAULT_CREDENTIAL credential = NULL; PKULL_M_CRED_VAULT_CREDENTIAL_ATTRIBUTE attribute; PBYTE ptr; DWORD i; if(credential = (PKULL_M_CRED_VAULT_CREDENTIAL) LocalAlloc(LPTR, sizeof(KULL_M_CRED_VAULT_CREDENTIAL))) { RtlCopyMemory(credential, data, FIELD_OFFSET(KULL_M_CRED_VAULT_CREDENTIAL, FriendlyName)); credential->FriendlyName = (LPWSTR) ((PBYTE) data + FIELD_OFFSET(KULL_M_CRED_VAULT_CREDENTIAL, FriendlyName)); credential->dwAttributesMapSize = *(PDWORD) ((PBYTE) credential->FriendlyName + credential->dwFriendlyName); credential->attributesMap = (PKULL_M_CRED_VAULT_CREDENTIAL_ATTRIBUTE_MAP) ((PBYTE) credential->FriendlyName + credential->dwFriendlyName + sizeof(DWORD)); kull_m_string_ptr_replace(&credential->FriendlyName, credential->dwFriendlyName); kull_m_string_ptr_replace(&credential->attributesMap, credential->dwAttributesMapSize); credential->__cbElements = credential->dwAttributesMapSize / sizeof(KULL_M_CRED_VAULT_CREDENTIAL_ATTRIBUTE_MAP); if(credential->attributes = (PKULL_M_CRED_VAULT_CREDENTIAL_ATTRIBUTE * ) LocalAlloc(LPTR, (credential->__cbElements + ((credential->unk0 < 4) ? 1 : 0)) * sizeof(PKULL_M_CRED_VAULT_CREDENTIAL_ATTRIBUTE))) { for(i = 0; i < credential->__cbElements; i++) { if(credential->attributes[i] = (PKULL_M_CRED_VAULT_CREDENTIAL_ATTRIBUTE) LocalAlloc(LPTR, sizeof(KULL_M_CRED_VAULT_CREDENTIAL_ATTRIBUTE))) { attribute = (PKULL_M_CRED_VAULT_CREDENTIAL_ATTRIBUTE) ((PBYTE) data + credential->attributesMap[i].offset); RtlCopyMemory(credential->attributes[i], attribute, FIELD_OFFSET(KULL_M_CRED_VAULT_CREDENTIAL_ATTRIBUTE, szData)); ptr = (PBYTE) attribute; if(attribute->id >= 100) ptr += sizeof(DWORD); // boo! ptr += FIELD_OFFSET(KULL_M_CRED_VAULT_CREDENTIAL_ATTRIBUTE, szData); kull_m_cred_vault_credential_create_attribute_from_data(ptr, credential->attributes[i]); } } if(attribute && credential->unk0 < 4) { if(credential->attributes[i] = (PKULL_M_CRED_VAULT_CREDENTIAL_ATTRIBUTE) LocalAlloc(LPTR, sizeof(KULL_M_CRED_VAULT_CREDENTIAL_ATTRIBUTE))) { kull_m_cred_vault_credential_create_attribute_from_data((PBYTE) attribute + FIELD_OFFSET(KULL_M_CRED_VAULT_CREDENTIAL_ATTRIBUTE, data) + attribute->szData + sizeof(USHORT), credential->attributes[i]); credential->__cbElements++; } } } } return credential; }
PKULL_M_KEY_CNG_BLOB kull_m_key_cng_create(PVOID data/*, DWORD size*/) { PKULL_M_KEY_CNG_BLOB cngKey = NULL; if(cngKey = (PKULL_M_KEY_CNG_BLOB) LocalAlloc(LPTR, sizeof(KULL_M_KEY_CNG_BLOB))) { RtlCopyMemory(cngKey, data, FIELD_OFFSET(KULL_M_KEY_CNG_BLOB, pName)); cngKey->pName = (PSTR) ((PBYTE) data + FIELD_OFFSET(KULL_M_KEY_CNG_BLOB, pName)); if(!kull_m_key_cng_properties_create((PBYTE) cngKey->pName + cngKey->dwNameLen, cngKey->dwPublicPropertiesLen, &cngKey->pPublicProperties, &cngKey->cbPublicProperties)) PRINT_ERROR(L"kull_m_key_cng_properties_create (public)\n"); cngKey->pPrivateProperties = (PBYTE) cngKey->pName + cngKey->dwNameLen + cngKey->dwPublicPropertiesLen; cngKey->pPrivateKey = (PBYTE) cngKey->pPrivateProperties + cngKey->dwPrivatePropertiesLen; kull_m_string_ptr_replace(&cngKey->pName, cngKey->dwNameLen); kull_m_string_ptr_replace(&cngKey->pPrivateProperties, cngKey->dwPrivatePropertiesLen); kull_m_string_ptr_replace(&cngKey->pPrivateKey, cngKey->dwPrivateKeyLen); } return cngKey; }
PKULL_M_CRED_VAULT_POLICY_KEY kull_m_cred_vault_policy_key_create(PVOID data/*, DWORD size*/) { PKULL_M_CRED_VAULT_POLICY_KEY key = NULL; if(key = (PKULL_M_CRED_VAULT_POLICY_KEY) LocalAlloc(LPTR, sizeof(KULL_M_CRED_VAULT_POLICY_KEY))) { RtlCopyMemory(key, data, FIELD_OFFSET(KULL_M_CRED_VAULT_POLICY_KEY, KeyBlob)); key->KeyBlob = (PBYTE) data + FIELD_OFFSET(KULL_M_CRED_VAULT_POLICY_KEY, KeyBlob); kull_m_string_ptr_replace(&key->KeyBlob, key->dwKeyBlob); } return key; }
PKULL_M_CRED_BLOB kull_m_cred_create(PVOID data/*, DWORD size*/) { PKULL_M_CRED_BLOB cred = NULL; if(cred = (PKULL_M_CRED_BLOB) LocalAlloc(LPTR, sizeof(KULL_M_CRED_BLOB))) { RtlCopyMemory(cred, data, FIELD_OFFSET(KULL_M_CRED_BLOB, TargetName)); cred->TargetName = (LPWSTR) ((PBYTE) data + FIELD_OFFSET(KULL_M_CRED_BLOB, TargetName)); cred->dwTargetAlias = *(PDWORD) ((PBYTE) cred->TargetName + cred->dwTargetName); cred->TargetAlias = (LPWSTR) ((PBYTE) cred->TargetName + cred->dwTargetName + sizeof(DWORD)); cred->dwComment = *(PDWORD) ((PBYTE) cred->TargetAlias + cred->dwTargetAlias); cred->Comment = (LPWSTR) ((PBYTE) cred->TargetAlias + cred->dwTargetAlias + sizeof(DWORD)); cred->dwUnkData = *(PDWORD) ((PBYTE) cred->Comment + cred->dwComment); cred->UnkData = (LPWSTR) ((PBYTE) cred->Comment + cred->dwComment + sizeof(DWORD)); cred->dwUserName = *(PDWORD) ((PBYTE) cred->UnkData + cred->dwUnkData); cred->UserName = (LPWSTR) ((PBYTE) cred->UnkData + cred->dwUnkData + sizeof(DWORD)); cred->CredentialBlobSize = *(PDWORD) ((PBYTE) cred->UserName + cred->dwUserName); cred->CredentialBlob = (PBYTE) cred->UserName + cred->dwUserName + sizeof(DWORD); if(cred->AttributeCount) kull_m_cred_attributes_create(((PBYTE) cred->CredentialBlob + cred->CredentialBlobSize + (cred->CredentialBlobSize & 1)), &cred->Attributes, cred->AttributeCount); kull_m_string_ptr_replace(&cred->TargetName, cred->dwTargetName); kull_m_string_ptr_replace(&cred->TargetAlias, cred->dwTargetAlias); kull_m_string_ptr_replace(&cred->Comment, cred->dwComment); kull_m_string_ptr_replace(&cred->UnkData, cred->dwUnkData); kull_m_string_ptr_replace(&cred->UserName, cred->dwUserName); kull_m_string_ptr_replace(&cred->CredentialBlob, cred->CredentialBlobSize); } return cred; }
PKULL_M_CRED_VAULT_POLICY kull_m_cred_vault_policy_create(PVOID data/*, DWORD size*/) { PKULL_M_CRED_VAULT_POLICY policy = NULL; if(policy = (PKULL_M_CRED_VAULT_POLICY) LocalAlloc(LPTR, sizeof(KULL_M_CRED_VAULT_POLICY))) { RtlCopyMemory(policy, data, FIELD_OFFSET(KULL_M_CRED_VAULT_POLICY, Name)); policy->Name = (LPWSTR) ((PBYTE) data + FIELD_OFFSET(KULL_M_CRED_VAULT_POLICY, Name)); RtlCopyMemory(&policy->unk0, (PBYTE) policy->Name + policy->dwName, FIELD_OFFSET(KULL_M_CRED_VAULT_POLICY, key) - FIELD_OFFSET(KULL_M_CRED_VAULT_POLICY, unk0)); policy->key = kull_m_cred_vault_policy_key_create((PBYTE) policy->Name + policy->dwName + FIELD_OFFSET(KULL_M_CRED_VAULT_POLICY, key) - FIELD_OFFSET(KULL_M_CRED_VAULT_POLICY, unk0)); kull_m_string_ptr_replace(&policy->Name, policy->dwName); } return policy; }