Specification
cc``` void parse_r5ac_string(EngineContext* ctx, u64 offset, std::vector vec_data, std::vector vec_key, size_t length) { for (size_t i = 0ull; i < length; i++) { vec_data[i] ^= vec_key[i]; } printf("r5apex_dx12.exe + 0x%llx, '%s'\n", offset, reinterpret_cast(vec_data.data())); } //printf("[+] instruction pattern has been validated, decoding...\n"); u64 off_data = get_operand_addressor_offset( instructions[0] ); u64 off_key = get_operand_addressor_offset( instructions[2] ); if (off_data < 1 || off_key < 1) { //printf("[!] failed to obtain DATA and KEY offsets. (0x%llx)\n", load_address - ctx->base); return; } //printf(" off_data: 0x%llx, off_key: 0x%llx\n", off_data, off_key); u64 addrof_data = ctx->base + off_data; u64 addrof_key = ctx->base + off_key; size_t operation_length = get_encryption_length( instructions[3] ); if (operation_length < 1) { //printf("[!] failed to obtain proper operation length. (0x%llx)\n", load_address - ctx->base); return; } if (operation_length > 0x10000) return; //printf("LENGTH: 0x%llx\n", operation_length); std::vector vec_data( operation_length ); std::vector vec_key( operation_length ); memcpy(vec_data.data(), POINTER_OF(addrof_data), operation_length); memcpy(vec_key.data(), POINTER_OF(addrof_key), operation_length); parse_r5ac_string( ctx, load_address - ctx->base, vec_data, vec_key, operation_length ); } ```