It seems your assertion is correct - there are quite a few indicators that Denuvo shares the code generator with VMProtect. For example, the way control flow works between handlers is the same (e.g. push qword ptr [r12+rax*8], retn). Also, rbp points to the vm stack and rsi points to the opcode program, respectively. In that regard, no difference to how VMP works...interesting