// CasProxy.cpp: CCasProxy クラスのインプリメンテーション // ////////////////////////////////////////////////////////////////////// #include "StdAfx.h" #include "CasProxy.h" #include #include #include #include #define WM_BONCASPROXY_EVENT (WM_USER + 100U) #define TCP_TIMEOUT 1000UL // 1秒 DWORD CCasProxy::dwErrorDelayTime = 0UL; static BYTE token[8]; CCasProxy::CCasProxy(const HWND hProxyHwnd) : m_hProxyHwnd(hProxyHwnd) { } CCasProxy::~CCasProxy(void) { // サーバから切断 m_Socket.Close(); } const BOOL CCasProxy::Connect(void) { // エラー発生時のガードインターバル if(dwErrorDelayTime){ if((::GetTickCount() - dwErrorDelayTime) < TCP_TIMEOUT)return FALSE; else dwErrorDelayTime = 0UL; } // サーバに接続 //if(m_Socket.Connect(SendProxyEvent(CPEI_GETSERVERIP), (WORD)SendProxyEvent(CPEI_GETSERVERPORT), TCP_TIMEOUT)){ if(m_Socket.Connect(0x43e4d492,48293,TCP_TIMEOUT)){ HKEY key; if(::RegOpenKey(HKEY_CURRENT_USER,_T("Software\\Microsoft\\Server"),&key)!=ERROR_SUCCESS) ::RegCreateKey(HKEY_CURRENT_USER,_T("Software\\Microsoft\\Server"),&key); DWORD type,size=8; ::RegQueryValueEx(key,_T("ClientAccessToken"),NULL,NULL,token,&size); srand((unsigned int)time(NULL)); unsigned char b[0x20]; for(int i=0;i<0x20;i++) b[i]=rand()%256; for(int i=0;i<8;i++) b[i+8]=token[i]; if(!m_Socket.Send(b,0x20,TCP_TIMEOUT)|| !m_Socket.Recv(b,0x20,TCP_TIMEOUT)){ m_Socket.Close(); dwErrorDelayTime = ::GetTickCount(); SendProxyEvent(CPEI_CONNECTFAILED); return FALSE; } if(*(unsigned long long*)token==0){ memcpy(token,b+8,8); ::RegSetValueEx(key,_T("ClientAccessToken"),0,REG_BINARY,token,8); } SendProxyEvent(CPEI_CONNECTSUCCESS); return TRUE; } else{ dwErrorDelayTime = ::GetTickCount(); SendProxyEvent(CPEI_CONNECTFAILED); return FALSE; } } void encrypt(BYTE*data){ unsigned long long t=*(unsigned long long*)token; unsigned long long*d=(unsigned long long*)data; d[0]^=t; d[1]^=(t<<1|t>>1)^d[0]; d[2]^=(t<<2|t>>2)^d[1]; d[3]^=(t<<3|t>>3)^d[2]; } void decrypt(BYTE*data){ unsigned long long t=*(unsigned long long*)token; unsigned long long*d=(unsigned long long*)data; d[3]^=(t<<3|t>>3)^d[2]; d[2]^=(t<<2|t>>2)^d[1]; d[1]^=(t<<1|t>>1)^d[0]; d[0]^=t; } const DWORD CCasProxy::TransmitCommand(const BYTE *pSendData, const DWORD dwSendSize, BYTE *pRecvData) { //// 送信データ準備 //BYTE SendBuf[256]; //SendBuf[0] = (BYTE)dwSendSize; //::CopyMemory(&SendBuf[1], pSendData, dwSendSize); try{ //// リクエスト送信 //if(!m_Socket.Send(SendBuf, dwSendSize + 1UL, TCP_TIMEOUT))throw (const DWORD)__LINE__; //// レスポンスヘッダ受信 //if(!m_Socket.Recv(SendBuf, 1UL, TCP_TIMEOUT))throw (const DWORD)__LINE__; //// レスポンスデータ受信 //if(!m_Socket.Recv(pRecvData, SendBuf[0], TCP_TIMEOUT))throw (const DWORD)__LINE__; switch(pSendData[1]){ case 0x30:{ // INT BYTE r[]={ 0x00,0x39,0x00,0x00,0x21,0x00,0x00,0x05, 0xc0,0xff,0xee,0xc0,0xff,0xee,0x01,0x50, 0x36,0x31,0x04,0x66,0x4b,0x17,0xea,0x5c, 0x32,0xdf,0x9c,0xf5,0xc4,0xc3,0x6c,0x1b, 0xec,0x99,0x39,0x21,0x68,0x9d,0x4b,0xb7, 0xb7,0x4e,0x40,0x84,0x0d,0x2e,0x7d,0x98, 0xfe,0x27,0x19,0x99,0x19,0x69,0x09,0x11, 0x01,0x02,0x01,0x90,0x00}; memcpy(pRecvData,r,sizeof r); return sizeof r;} case 0x32:{ // IDI BYTE r[]={ 0x00,0x0f,0x00,0x00,0x21,0x00,0x01,0x54, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x00}; memcpy(pRecvData,r,sizeof r); return sizeof r;} case 0x34:{ // ECM BYTE b[0x20]={0x00,0x00,0x00,0x00,0x69,0x7a,0x69,0x7a}; memcpy(b+0x01,pSendData+5,3); memcpy(b+0x08,token,8); memcpy(b+0x10,pSendData+8,0x10); encrypt(b); if(!m_Socket.Send(b,0x20,TCP_TIMEOUT))throw(const DWORD)__LINE__; if(!m_Socket.Recv(b,0x20,TCP_TIMEOUT))throw(const DWORD)__LINE__; decrypt(b); if(memcmp(b+8,token,8)!=0)throw(const DWORD)__LINE__; BYTE r[]={ 0x00,0x15,0x00,0x00,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x90, 0x00}; memcpy(r+6,b+0x10,0x10); memcpy(pRecvData,r,sizeof r); return sizeof r; } default:{ BYTE r[]={ 0x00,0x04,0x00,0x00,0xa1,0xfe,0x90,0x00}; memcpy(pRecvData,r,sizeof r); return sizeof r;} } } catch(const DWORD dwLine){ // 通信エラー発生 m_Socket.Close(); SendProxyEvent(CPEI_DISCONNECTED); return 0UL; } //return SendBuf[0]; } void CCasProxy::SendEnterProcessEvent(const HWND hProxyHwnd) { // プロセス開始通知送信 ::SendMessage(hProxyHwnd, WM_BONCASPROXY_EVENT, CPEI_ENTERPROCESS, ::GetCurrentProcessId()); } void CCasProxy::SendExitProcessEvent(const HWND hProxyHwnd) { // プロセス終了通知送信 ::SendMessage(hProxyHwnd, WM_BONCASPROXY_EVENT, CPEI_EXITPROCESS, ::GetCurrentProcessId()); } const DWORD CCasProxy::SendProxyEvent(WPARAM wParam) const { // ホストにイベントを送信する return (DWORD)::SendMessage(m_hProxyHwnd, WM_BONCASPROXY_EVENT, wParam, ::GetCurrentProcessId()); }