www.pudn.com > MirServer.rar > mircode.cpp
// mircode.cpp: implementation of the mircode class. // ////////////////////////////////////////////////////////////////////// #include "mircode.h" #include "bindef.h" #includestatic BOOL g_bMWMode = FALSE; int CodeMWGameCode( BYTE * p1, int bytecount, char * p2 ); int UnMWGameCode( char * p1, BYTE * p2 ); int SetMirWorldMode() { g_bMWMode = TRUE; return 1; } char ucase( char c ) { // char cres = '\0'; if( c >= 'a' && c <= 'z' ) { c+= 'A' - 'a'; return c; } return c; } int hex2int( char c ) { if( c >= 'A' && c <= 'F' ) { return (int)(c - 'A' + 10 ); } else if( c >= '0' && c <= '9' ) { return (int)( c - '0' ); } return 0; } char hextable[] = "0123456789ABCDEF"; char int2hex( int v ) { v &= 0xf; return hextable[v]; } int UnNameCode( char * in, char * out ) { int i = 0; //int size = strlen( in ); while( in[i] != '\0' ) { out[i] = (in[i] & 0x3f ) << 2; out[i] |= (in[i + 1] & 0xc0 ) >> 6; i ++; } out[i] = '\0'; return 1; } int CodeGateCode( char * in, char * out ) { int lcnt = strlen( in ) ; int i = 0; int icode = 0; int tcode = 0; int hbyte = 0; int lbyte = 0; int _edi = 0xf667; for( i = 0;i < lcnt;i ++ ) { icode = ((int)in[i]) & 0xff; //tcode = icode; //icode = ((int)out[i]) & 0xff; tcode = icode; tcode ^= ((_edi & 0xffff)>>8); hbyte = (tcode & 0xf0 )>>4; lbyte = (tcode & 0xf ); out[i * 2] = int2hex( hbyte ); out[i * 2 + 1] = int2hex( lbyte ); _edi = (((_edi + tcode ) * 0xce6d ) & 0xffff ) + 0x58bf; } out[i * 2] = '\0'; return 1; } int UnGateCode( char * in, char * out ) { if( in == NULL ) return 0; int lcnt = strlen( in ) >> 1; if( lcnt == 0 ) return 0; if( in[0] == (char)0)//'\0' ) return 0; int i = 0; int icode = 0; int _edi = 0xf667; for( i = 0;i < lcnt;i ++ ) { out[i] = ((hex2int( ucase( in[i * 2])) & 0xf )<<4); out[i] += hex2int( ucase( in[i * 2 + 1])) & 0xf; icode = ((int)out[i]) & 0xff; out[i] ^= ((_edi & 0xffff)>>8); _edi = (((_edi + icode ) * 0xce6d ) & 0xffff ) + 0x58bf; } out[lcnt] = (char)0;//'\0'; return 1; } int UnGameCode( char * p, BYTE * out ) { //if( g_bMWMode ) // return UnMWGameCode( p, out ); int i = 0; int ilen = 0, olen = 0; int iptr = 0, optr = 0; BYTE * pb = (BYTE*)p; BYTE b1,b2,b3,b4; if( p == NULL || out == NULL) return 0; ilen = strlen( p ); if( ilen <= 0 ) return 0; *((DWORD*)&p[ilen]) = 0x3c3c3c; olen = (ilen * 6) / 8; for( i =0;i < ((ilen + 3)/4);i ++ ) { b1 = (pb[iptr++] - 0x3c) & 0x3f; b2 = (pb[iptr++] - 0x3c) & 0x3f; b3 = (pb[iptr++] - 0x3c) & 0x3f; b4 = (pb[iptr++] - 0x3c) & 0x3f; out[optr++] =(( b1 & b00111111) << 2 )| ((b2 & b00110000) >> 4); out[optr++] =(( b2 & b00001111) << 4 )| ((b3 & b00111100) >> 2); out[optr++] =(( b3 & b00000011) << 6 )| b4; } out[olen] = '\0'; return olen; } int CodeGameCode( BYTE * in, int size, BYTE * out ) { //if( g_bMWMode ) // return CodeGameCode( in, size, out ); int i = 0,ilen = 0; int idxout = 0; int idxin = 0; // int icode = 0; int reallen = 0; ilen = size; ilen = (size + 2)/3; BYTE b1,b2,b3; reallen = (size * 8 + 5) / 6; (*(DWORD*)&in[size])=0; // ileft = size % 3; for( i = 0;i < ilen;i ++ ) { b1 = in[idxin++]; b2 = in[idxin++]; b3 = in[idxin++]; out[idxout++] = ((b1 & b11111100) >> 2)+'<'; out[idxout++] = (((b1 & b00000011) << 4)|((b2 & b11110000) >> 4))+'<'; out[idxout++] = (((b2 & b00001111) << 2)|((b3 & b11000000) >> 6))+'<'; out[idxout++] = (b3 & b00111111)+'<'; } out[reallen]= '\0'; return 1; } static const char codetable1[] = "vutszyxwnmlkrqpofedcjihg^]\\[ba`_VUTSZYXWNMLKRQPOFEDCJIHG>=<;BA@?"; static const char codetable[] = "vutszyxwnmlkrqpofedcjihg^]\\[ba`_VUTSZYXWNMLKRQPOFEDCJIHG>=<;BA@?"; static const char codetable2[] = "fedcjihg^]\\[ba`_vutszyxwnmlkrqpoFEDCJIHG>=<;BA@?VUTSZYXWNMLKRQPO"; static const char codetable3[] = "uvstyzwxmnklqropefcdijgh]^[\\ab_`UVSTYZWXMNKLQROPEFCDIJGH=>; ; ;<"; BYTE GetBM( BYTE b , const char * table ) { int len = strlen( table ); int i = 0; for( i = 0;i < len;i ++ ) { if( (BYTE)table[i] == b ) return (BYTE)i; } return (BYTE)0; } int CodeMWGameCode( BYTE * p1, int bytecount, char * p2 ) { int optr = 0, iptr = 0; BYTE b1,b2,b3; int i = 0; for(i = 0;i < bytecount/3;i++) { b1 = p1[iptr++]; b2 = p1[iptr++]; b3 = p1[iptr++]; p2[optr++] = (b1 & 0x3) | (( b1 & 0xf0)>>2); p2[optr++] = (b2 & 0x3) | (( b2 & 0xf0)>>2); p2[optr++] = (b3 & 0x3f); p2[optr++] = (b1 & 0xc) | ((b2 & 0xc)>>2) | ((b3 & 0xc0)>>2 ); p2[optr-4] = codetable1[p2[optr-4]]; p2[optr-3] = codetable1[p2[optr-3]]; p2[optr-2] = codetable2[p2[optr-2]]; p2[optr-1] = codetable3[p2[optr-1]]; } i = bytecount % 3; if( i == 1 ) { b1 = p1[iptr++]; p2[optr++] = (b1 & 0x3) | ((b1 & 0xf0)>>2); p2[optr++] = ((b1 & 0xc)>>2); p2[optr-2] = codetable1[p2[optr-2]]; p2[optr-1] = codetable5[p2[optr-1]]; } else if( i == 2 ) { b1 = p1[iptr++]; b2 = p1[iptr++]; p2[optr++] = (b1 & 0x3) | (( b1 & 0xf0)>>2); p2[optr++] = (b2 & 0x3) | (( b2 & 0xf0)>>2); p2[optr++] = (b1 & 0xc) | (( b2 & 0xc)>>2); p2[optr-3] = codetable1[p2[optr-3]]; p2[optr-2] = codetable1[p2[optr-2]]; p2[optr-1] = codetable4[p2[optr-1]]; } p2[optr] = '\0'; return optr; } int UnMWGameCode( char * p1, BYTE * p2 ) { BYTE b1, b2, b3, b4; BYTE * p = (BYTE*)p1; int ilen = strlen(p1); int i = 0; int iptr = 0; int optr = 0; // MessageBox( 0, p1, 0, 0 ); for( i = 0;i < ilen/4;i ++ ) { b1 = p[iptr++]; b2 = p[iptr++]; b3 = p[iptr++]; b4 = p[iptr++]; b1 = GetBM( b1, codetable1 ); b2 = GetBM( b2, codetable1 ); b3 = GetBM( b3, codetable2 ); b4 = GetBM( b4, codetable3 ); p2[optr++] = (b1 & 0x3) | (b4 & 0xc ) | ((b1 & 0x3c)<<2); p2[optr++] = (b2 & 0x3) | ((b4 & 0x3) << 2) | ((b2 & 0x3c)<<2); p2[optr++] = (b3 & 0x3f) | ((b4 & 0x30)<<2); } ilen %= 4; b1 = p[iptr ++]; b2 = p[iptr ++]; b3 = p[iptr ++]; if( ilen == 3 ) { b1 = GetBM( b1, codetable1 ); b2 = GetBM( b2, codetable1 ); b3 = GetBM( b3, codetable4 ); p2[optr++] = (b1 & 0x3 ) | (b3 & 0xc) | ((b1 & 0x3c)<<2 ); p2[optr++] = (b2 & 0x3 ) | ((b3 & 0x3 )<<2 ) | (( b2 & 0x3c)<<2 ); }else if( ilen == 2 ) { b1 = GetBM( b1, codetable1 ); b2 = GetBM( b2, codetable5 ); p2[optr++] = (b1 & 0x3 ) | ((b2 & 0x3)<<2) | ((b1 & 0x3c)<<2 ); } p2[optr] = '\0'; // MessageBox( 0, (char*)p2, 0, 0 ); return optr; }