#pragma once #include #include "WGPLShuffle.h" #include namespace WGPL { #define CHECK_RETURN_CALLSTACK DWORD ret_ptr_dlrjsTmwlakdy = 0; \ __asm {pushad} \ __asm {mov eax, ebp} \ __asm {add eax, 4} \ __asm {mov eax, dword ptr ds:[eax]} \ __asm {mov ret_ptr_dlrjsTmwlakdy, eax} \ __asm {popad}; \ if( (ret_ptr_dlrjsTmwlakdy <= 0x00401000) || (ret_ptr_dlrjsTmwlakdy >= 0x00885000) ) \ { \ MessageBoxA(NULL, "CallStack Error!!!", 0, 0); \ exit(0); \ } \ class DUMMY { public: DUMMY(){} }; template < class _Type > class SecureContainer { public: SecureContainer() { } ~SecureContainer() { Destroy(); } void SetValue( _Type *pValue ); _Type *GetValue(); void Destroy(); private : std::vector <_Type *> m_ObjList; Shuffle m_iIndex; // ¼º´ÉÀ̽´·Î ShuffleÀÇ checksum »ç¿ë¾ÈÇÔ }; template < class _Type > _Type *SecureContainer<_Type>::GetValue() { _Type *pValue = m_ObjList[m_iIndex]; CHECK_RETURN_CALLSTACK return pValue; } template < class _Type> void SecureContainer<_Type>::SetValue( _Type *pValue ) { //CODE_GUARD m_iIndex = rand()%10; for (int i=0; i < 10; i++) { if (i != m_iIndex) m_ObjList.push_back((_Type *)new DUMMY); else m_ObjList.push_back(pValue); } } template < class _Type > void SecureContainer<_Type>::Destroy() { for ( int i=0; i<(int)m_ObjList.size(); i++ ) { if ( i == m_iIndex ) { delete m_ObjList[i]; } else { delete ((DUMMY *)m_ObjList[i]); } } m_ObjList.resize(0); } }