Краш при вызове функции
я хочу обфусцировать свой код и сделал отдельный синглтон для ксора адресов переменных. При вызове ксора ключей происходит краш: Вызвано исключение по адресу 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. Соответственно и результат кривой.