Краш при вызове функции

я хочу обфусцировать свой код и сделал отдельный синглтон для ксора адресов переменных. При вызове ксора ключей происходит краш: Вызвано исключение по адресу 0x00A310AF в ConsoleApplication6.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x40003D6C. Прощу помощь, код ниже. UPD: Да, очень важно, чтобы функция Xor( ) возвращала указатель, а g_XorClass не был им.

Код синглтона:

template< typename T>
class CXorPtr
{
private:
    uint64_t m_XorKey1 = uint64_t();
    uint64_t m_XorKey2 = uint64_t();
protected:
    CXorPtr()
    {
        m_XorKey1 = RandomHash();
        m_XorKey2 = m_XorKey1 ^ (uint64_t)this;
    }
public:
    __forceinline T& Xor()
    {
        return *reinterpret_cast<T*>(m_XorKey1 ^ m_XorKey2);
    }
};

Код класса, наследующего ксор:

class C_XorClass : public CXorPtr < C_XorClass* >
{
public:
    virtual void PrintAText( const char* strString )
    {
        std::cout << strString << std::endl;
    }
};

C_XorClass g_XorClass;

Вся шаманская магия:

int main( )
{
    g_XorClass.Xor( )->PrintAText( "hello from xored pointer" );
    return 0;
}

Ответы (1 шт):

Автор решения: user7860670

В этом примере при обфускации указателя используется указатель на CXorPtr<T>, а при деобфускации - указатель на T. Однако эти указатели не обладают свойством pointer-interconvertible. Соответственно и результат кривой.

→ Ссылка