Jump to content

=FF=Go

初级会员
  • 帖子总数

    22
  • 注册时间

  • 上次访问

声誉

0 平淡人生
  1. 他是想同过嗅探得到真实ip和id的对应. mohaa应该看到的是被浩方封装过的伪ip
  2. mohaa 基于Q3引擎 ,采用 Q3 huffman 压缩算法编码, 给个头文件给你,自己去用吧。 /* ALL the code comes from the Q3fusion project of Andrey Nazarov: http://sourceforge.net/projects/q3fusion/ */ #include <string.h> #define MAX_MSGLEN 0x4000 #define VALUE(a) ((int )(a)) #define NODE(a) ((void *)(a)) #define NODE_START NODE( 1) #define NODE_NONE NODE(256) #define NODE_NEXT NODE(257) #define NOT_REFERENCED 256 #define HUFF_TREE_SIZE 7175 typedef void *tree_t[HUFF_TREE_SIZE]; // // pre-defined frequency counts for all bytes [0..255] // static int huffCounts[256] = { 0x3D1CB, 0x0A0E9, 0x01894, 0x01BC2, 0x00E92, 0x00EA6, 0x017DE, 0x05AF3, 0x08225, 0x01B26, 0x01E9E, 0x025F2, 0x02429, 0x0436B, 0x00F6D, 0x006F2, 0x02060, 0x00644, 0x00636, 0x0067F, 0x0044C, 0x004BD, 0x004D6, 0x0046E, 0x006D5, 0x00423, 0x004DE, 0x0047D, 0x004F9, 0x01186, 0x00AF5, 0x00D90, 0x0553B, 0x00487, 0x00686, 0x0042A, 0x00413, 0x003F4, 0x0041D, 0x0042E, 0x006BE, 0x00378, 0x0049C, 0x00352, 0x003C0, 0x0030C, 0x006D8, 0x00CE0, 0x02986, 0x011A2, 0x016F9, 0x00A7D, 0x0122A, 0x00EFD, 0x0082D, 0x0074B, 0x00A18, 0x0079D, 0x007B4, 0x003AC, 0x0046E, 0x006FC, 0x00686, 0x004B6, 0x01657, 0x017F0, 0x01C36, 0x019FE, 0x00E7E, 0x00ED3, 0x005D4, 0x005F4, 0x008A7, 0x00474, 0x0054B, 0x003CB, 0x00884, 0x004E0, 0x00530, 0x004AB, 0x006EA, 0x00436, 0x004F0, 0x004F2, 0x00490, 0x003C5, 0x00483, 0x004A2, 0x00543, 0x004CC, 0x005F9, 0x00640, 0x00A39, 0x00800, 0x009F2, 0x00CCB, 0x0096A, 0x00E01, 0x009C8, 0x00AF0, 0x00A73, 0x01802, 0x00E4F, 0x00B18, 0x037AD, 0x00C5C, 0x008AD, 0x00697, 0x00C88, 0x00AB3, 0x00DB8, 0x012BC, 0x00FFB, 0x00DBB, 0x014A8, 0x00FB0, 0x01F01, 0x0178F, 0x014F0, 0x00F54, 0x0131C, 0x00E9F, 0x011D6, 0x012C7, 0x016DC, 0x01900, 0x01851, 0x02063, 0x05ACB, 0x01E9E, 0x01BA1, 0x022E7, 0x0153D, 0x01183, 0x00E39, 0x01488, 0x014C0, 0x014D0, 0x014FA, 0x00DA4, 0x0099A, 0x0069E, 0x0071D, 0x00849, 0x0077C, 0x0047D, 0x005EC, 0x00557, 0x004D4, 0x00405, 0x004EA, 0x00450, 0x004DD, 0x003EE, 0x0047D, 0x00401, 0x004D9, 0x003B8, 0x00507, 0x003E5, 0x006B1, 0x003F1, 0x004A3, 0x0036F, 0x0044B, 0x003A1, 0x00436, 0x003B7, 0x00678, 0x003A2, 0x00481, 0x00406, 0x004EE, 0x00426, 0x004BE, 0x00424, 0x00655, 0x003A2, 0x00452, 0x00390, 0x0040A, 0x0037C, 0x00486, 0x003DE, 0x00497, 0x00352, 0x00461, 0x00387, 0x0043F, 0x00398, 0x00478, 0x00420, 0x00D86, 0x008C0, 0x0112D, 0x02F68, 0x01E4E, 0x00541, 0x0051B, 0x00CCE, 0x0079E, 0x00376, 0x003FF, 0x00458, 0x00435, 0x00412, 0x00425, 0x0042F, 0x005CC, 0x003E9, 0x00448, 0x00393, 0x0041C, 0x003E3, 0x0042E, 0x0036C, 0x00457, 0x00353, 0x00423, 0x00325, 0x00458, 0x0039B, 0x0044F, 0x00331, 0x0076B, 0x00750, 0x003D0, 0x00349, 0x00467, 0x003BC, 0x00487, 0x003B6, 0x01E6F, 0x003BA, 0x00509, 0x003A5, 0x00467, 0x00C87, 0x003FC, 0x0039F, 0x0054B, 0x00300, 0x00410, 0x002E9, 0x003B8, 0x00325, 0x00431, 0x002E4, 0x003F5, 0x00325, 0x003F0, 0x0031C, 0x003E4, 0x00421, 0x02CC1, 0x034C0 }; // // static Huffman tree // static tree_t huffTree; // // received from MSG_* code // static int huffBitPos; /* ======================================================================================= HUFFMAN TREE CONSTRUCTION ======================================================================================= */ /* ============ Huff_PrepareTree ============ */ void Huff_PrepareTree( tree_t tree ) { void **node; memset( tree, 0, sizeof( tree_t ) ); // create first node node = &tree[263]; VALUE( tree[0] )++; node[7] = NODE_NONE; tree[2] = node; tree[3] = node; tree[4] = node; tree[261] = node; } /* ============ Huff_GetNode ============ */ void **Huff_GetNode( void **tree ) { void **node; int value; node = tree[262]; if( !node ) { value = VALUE( tree[1] )++; node = &tree[value + 6407]; return node; } tree[262] = node[0]; return node; } /* ============ Huff_Swap ============ */ void Huff_Swap( void **tree1, void **tree2, void **tree3 ) { void **a, **b; a = tree2[2]; if( a ) { if( a[0] == tree2 ) { a[0] = tree3; } else { a[1] = tree3; } } else { tree1[2] = tree3; } b = tree3[2]; if( b ) { if( b[0] == tree3 ) { b[0] = tree2; tree2[2] = b; tree3[2] = a; return; } b[1] = tree2; tree2[2] = b; tree3[2] = a; return; } tree1[2] = tree2; tree2[2] = NULL; tree3[2] = a; } /* ============ Huff_SwapTrees ============ */ void Huff_SwapTrees( void **tree1, void **tree2 ) { void **temp; temp = tree1[3]; tree1[3] = tree2[3]; tree2[3] = temp; temp = tree1[4]; tree1[4] = tree2[4]; tree2[4] = temp; if( tree1[3] == tree1 ) { tree1[3] = tree2; } if( tree2[3] == tree2 ) { tree2[3] = tree1; } temp = tree1[3]; if( temp ) { temp[4] = tree1; } temp = tree2[3]; if( temp ) { temp[4] = tree2; } temp = tree1[4]; if( temp ) { temp[3] = tree1; } temp = tree2[4]; if( temp ) { temp[3] = tree2; } } /* ============ Huff_DeleteNode ============ */ void Huff_DeleteNode( void **tree1, void **tree2 ) { tree2[0] = tree1[262]; tree1[262] = tree2; } /* ============ Huff_IncrementFreq_r ============ */ static void Huff_IncrementFreq_r( void **tree1, void **tree2 ) { void **a, **b; if( !tree2 ) { return; } a = tree2[3]; if( a ) { a = a[6]; if( a == tree2[6] ) { b = tree2[5]; if( b[0] != tree2[2] ) { Huff_Swap( tree1, b[0], tree2 ); } Huff_SwapTrees( b[0], tree2 ); } } a = tree2[4]; if( a && a[6] == tree2[6] ) { b = tree2[5]; b[0] = a; } else { a = tree2[5]; a[0] = 0; Huff_DeleteNode( tree1, tree2[5] ); } VALUE( tree2[6] )++; a = tree2[3]; if( a && a[6] == tree2[6] ) { tree2[5] = a[5]; } else { a = Huff_GetNode( tree1 ); tree2[5] = a; a[0] = tree2; } if( tree2[2] ) { Huff_IncrementFreq_r( tree1, tree2[2] ); if( tree2[4] == tree2[2] ) { Huff_SwapTrees( tree2, tree2[2] ); a = tree2[5]; if( a[0] == tree2 ) { a[0] = tree2[2]; } } } } /* ============ Huff_AddReference Insert 'ch' into the tree or increment it's frequency ============ */ static void Huff_AddReference( void **tree, int ch ) { void **a, **b, **c, **d; int value; ch &= 255; if( tree[ch + 5] ) { Huff_IncrementFreq_r( tree, tree[ch + 5] ); return; // already added } value = VALUE( tree[0] )++; b = &tree[value * 8 + 263]; value = VALUE( tree[0] )++; a = &tree[value * 8 + 263]; a[7] = NODE_NEXT; a[6] = NODE_START; d = tree[3]; a[3] = d[3]; if( a[3] ) { d = a[3]; d[4] = a; d = a[3]; if( d[6] == NODE_START ) { a[5] = d[5]; } else { d = Huff_GetNode( tree ); a[5] = d; d[0] = a; } } else { d = Huff_GetNode( tree ); a[5] = d; d[0] = a; } d = tree[3]; d[3] = a; a[4] = tree[3]; b[7] = NODE( ch ); b[6] = NODE_START; d = tree[3]; b[3] = d[3]; if( b[3] ) { d = b[3]; d[4] = b; if( d[6] == NODE_START ) { b[5] = d[5]; } else { d = Huff_GetNode( tree ); b[5] = d; d[0] = a; } } else { d = Huff_GetNode( tree ); b[5] = d; d[0] = b; } d = tree[3]; d[3] = b; b[4] = tree[3]; b[1] = NULL; b[0] = NULL; d = tree[3]; c = d[2]; if( c ) { if( c[0] == tree[3] ) { c[0] = a; } else { c[1] = a; } } else { tree[2] = a; } a[1] = b; d = tree[3]; a[0] = d; a[2] = d[2]; b[2] = a; d = tree[3]; d[2] = a; tree[ch + 5] = b; Huff_IncrementFreq_r( tree, a[2] ); } /* ======================================================================================= BITSTREAM I/O ======================================================================================= */ /* ============ Huff_EmitBit Put one bit into buffer ============ */ void Huff_EmitBit( int bit, unsigned char *buffer ) { if( !(huffBitPos & 7) ) { buffer[huffBitPos >> 3] = 0; } buffer[huffBitPos >> 3] |= bit << (huffBitPos & 7); huffBitPos++; } /* ============ Huff_GetBit Read one bit from buffer ============ */ int Huff_GetBit( unsigned char *buffer ) { int bit; bit = buffer[huffBitPos >> 3] >> (huffBitPos & 7); huffBitPos++; return (bit & 1); } /* ============ Huff_EmitPathToByte ============ */ void Huff_EmitPathToByte( void **tree, void **subtree, unsigned char *buffer ) { if( tree[2] ) { Huff_EmitPathToByte( tree[2], tree, buffer ); } if( !subtree ) { return; } // // emit tree walking control bits // if( tree[1] == subtree ) { Huff_EmitBit( 1, buffer ); } else { Huff_EmitBit( 0, buffer ); } } /* ============ Huff_GetByteFromTree Get one byte using dynamic or static tree ============ */ int Huff_GetByteFromTree( void **tree, unsigned char *buffer ) { if( !tree ) { return 0; } // // walk through the tree until we get a value // while( tree[7] == NODE_NEXT ) { if( !Huff_GetBit( buffer ) ) { tree = tree[0]; } else { tree = tree[1]; } if( !tree ) { return 0; } } return VALUE( tree[7] ); } /* ============ Huff_EmitByteDynamic Emit one byte using dynamic tree ============ */ static void Huff_EmitByteDynamic( void **tree, int value, unsigned char *buffer ) { void **subtree; int i; // // if byte was already referenced, emit path to it // subtree = tree[value + 5]; if( subtree ) { if( subtree[2] ) { Huff_EmitPathToByte( subtree[2], subtree, buffer ); } return; } // // byte was not referenced, just emit 8 bits // Huff_EmitByteDynamic( tree, NOT_REFERENCED, buffer ); for( i=7; i>=0; i-- ) { Huff_EmitBit( (value >> i) & 1, buffer ); } } /* ======================================================================================= PUBLIC INTERFACE ======================================================================================= */ /* ============ Huff_CompressPacket Compress message using dynamic Huffman tree, beginning from specified offset ============ */ int Huff_CompressPacket( unsigned char *msg, int offset, int cursize ) { tree_t tree; unsigned char buffer[MAX_MSGLEN]; unsigned char *data; int outLen; int inLen; int i; data = msg + offset; inLen = cursize - offset; if( inLen <= 0 || inLen >= MAX_MSGLEN ) { return(cursize); } Huff_PrepareTree( tree ); buffer[0] = inLen >> 8; buffer[1] = inLen & 0xFF; huffBitPos = 16; for( i=0; i<inLen; i++ ) { Huff_EmitByteDynamic( tree, data[i], buffer ); Huff_AddReference( tree, data[i] ); } outLen = (huffBitPos >> 3) + 1; memcpy( data, buffer, outLen ); return(offset + outLen); } /* ============ Huff_DecompressPacket Decompress message using dynamic Huffman tree, beginning from specified offset ============ */ int Huff_DecompressPacket( unsigned char *msg, int offset, int cursize, int maxsize ) { tree_t tree; unsigned char buffer[MAX_MSGLEN]; unsigned char *data; int outLen; int inLen; int i, j; int ch; data = msg + offset; inLen = cursize - offset; if( inLen <= 0 ) { return(cursize); } Huff_PrepareTree( tree ); outLen = (data[0] << 8) + data[1]; huffBitPos = 16; if( outLen > maxsize - offset ) { outLen = maxsize - offset; } for( i=0; i<outLen; i++ ) { if( (huffBitPos >> 3) > inLen ) { buffer[i] = 0; break; } ch = Huff_GetByteFromTree( tree[2], data ); if( ch == NOT_REFERENCED ) { ch = 0; // just read 8 bits for( j=0; j<8; j++ ) { ch <<= 1; ch |= Huff_GetBit( data ); } } buffer[i] = ch; Huff_AddReference( tree, ch ); } memcpy( data, buffer, outLen ); return(offset + outLen); } /* ============ Huff_EmitByte ============ */ void Huff_EmitByte( int ch, unsigned char *buffer, int *count ) { huffBitPos = *count; Huff_EmitPathToByte( huffTree[ch + 5], NULL, buffer ); *count = huffBitPos; } /* ============ Huff_GetByte ============ */ int Huff_GetByte( unsigned char *buffer, int *count ) { int ch; huffBitPos = *count; ch = Huff_GetByteFromTree( huffTree[2], buffer ); *count = huffBitPos; return ch; } /* ============ Huff_Init ============ */ void Huff_Init( void ) { int i, j; // build empty tree Huff_PrepareTree( huffTree ); // add all pre-defined byte references for( i=0; i<256; i++ ) { for( j=0; j<huffCounts[i]; j++ ) { Huff_AddReference( huffTree, i ); } } }
  3. 你的mohaa1.11的迷你服务器0.92版本的,修改了main 下的 gamex86.dll 等 几个dll吗? 我写了个服务器的外挂,原理是hook gamex86.dll,在原版的mohaa下没问题,可在0.92下服务器有崩溃的现象。 btw: 分析了mohaa server,确实是个没完成的作品,实在不知道EA和2015当初发生了什么龌龊。
  4. shixi 你分析的很卖力,你说了这么多无非就是想说我和你一样zb,你要这么认为我也没办法,你可以这样认为,如果这样你心理能平衡点的话我不介意,我不能左右一个正常人的思维,更何况是几个马甲**. 你们这几个天天在sunshine 和swat 挂着各种马甲zb 的**, 每天被人骂cnm很爽是不是?管理员一来,象头猪似的被人踢出去是不是更爽?
  5. 本来不想说了,懒得在开一新帖了,实在觉得这种**太无耻了。 今天中午在sunshine 又见识了**的风采,一开始用sniper,对枪总是快我一点,我一开始还以为遇到了O.o的马甲加上他ping好也没在意,打了一局图,丫换了机枪本色就露出来了,不幸被群众揭破骂了**几句,好了,开始用脚本满屏的刷了。5分钟后,sunshine当机。中午很多玩家都见识了丫的嘴脸,真的不知道对这种人说什么好..
  6. 说实话,楼上的shixi还真烦。 几个问题再向你解释清楚,免得你无知当个性。 1.mohaa的zb工具不是独创的,基本都是从Quake引擎类游戏继承下来的。至于研究它根本不是开着去服务器里虐人,既然我挂=FF=队标一天,就不会无耻到如你们一般。至于你是哪个战队的我也有所耳闻,所以我也不惊讶你的行为了。我写的东西,用不着你来评说,这些事本来就是兴趣业余,没考虑其它,如果你有能力也有志向去做,也可以,我觉得总比每天装着zb工具以虐人为乐强点。另外dmw只有silver member收费的,免费的scanner也是有的。 2.我用的是南方的电信,去北方的服务器情况我也懒得说了,至于为什么北方的DMW服务器多的原因我也懒得说了。 3.个人认为mohaa的TDM成赛后的乐趣性大大降低,Camper的打法实在是令人作呕,老实说T8L和E91他们TDM打法是我喜欢的,这也就是我为什么喜欢在sunshine的原因。 4.我不象你们总是针对某个人,我针对的是那些整天在服务器里zb的家伙,尤其是zb还要打出正义的旗号。按你们的说法去偷东西也是促进法制的,你尽可去试试警察对你的宽容尺度。 5.人老了就不幽默了,至少不会心虚还要强装出苍白的一点幽默,继续吧... 继续生活在你自己构想的虚拟假面后吧,你得到更多的应该是同情而不是鄙视。 好了,如果有兴趣可以继续你自己苍白的表演,也可以继续把你们浩方的几套马甲轮流出场,接下来,我只是看客,看看你们“幽默”的表演。。。。 好了,到此为止,不再和你们搅和了,面对一些连id都要临时注册的Camper, 感觉象是和空气在对话...  
  7. 几天没来,没想到这个帖子惹来这么多口水,原来以为zb的没胆量上来回复,没想到还真有脸皮厚到如此的,不过还是和服务器里一样穿个马甲象个乌龟,当然更不忘往我身上泼盆脏水。 几点澄清说明一下: 1.对zb的研究纯粹为了写反作弊的东西,以前写了一半有一天发现了dmw也就没写下去了。原因很多,主要有几个,一是玩家太少没什么价值,二是由于本人的战队身份,写出来的东西也不可能成为比赛用的公允反作弊工具。三 发现DMW 写的非常不错,而且一直在发展,也就没必要再跟随别人了(FF的老人都看过第一版本也是最后一版)。所以那时就把DMW介绍给国内的玩家,现在也很高兴看到成为国内moher的主选反zb器。 2.至于水平 ,我的水平马马虎虎,这类玩家这么少的游戏,高不高手有什么意义? 我喜欢和风格类似的人打着玩,比如T8L的圈们 和E91 等,说实话那样节奏可以快一点。厌恶zb的**,尤其是以zb虐人为乐趣的家伙,实在是很无耻的,本来一个娱乐的东西,为什么总是有些恶心的东西让人不愉快呢?以前用马甲打还被PLSD误会过,被拉到他们的服务器开着反zb单挑过,所以现在也从来不会用马甲上来打。玩游戏只是为了乐趣,不会象有些人想象的和他们自己一样龌龊。 3.一个如此过气的游戏也能引起作弊爱好者的兴趣,实在是无奈也是悲哀,其实你们完全可以选择那些人气旺盛的游戏去糟蹋的,实在不行据说QQ游戏多可以zb的,希望你们可怜可怜我们,留点乐趣给我们这些无聊得只能打打mohaa打发时间的老头子吧。 最后说一句: 小伙子们,别把无耻当坦白,尽管夜总会的小姐也从来不忌讳谈论她们的事业。 游戏快乐... 快乐游戏,何必呢?
  8. 地点:SWAT 服务器 时间:5.27晚 23点 axis前面3个**全是zb的, 统一 用的 wambot 加换名的脚本,打一个人换个名字(其中就有冒用=M-liugz的名字). 显然是一丘之貉. 很显然里面有那个以前嘴臭老骂人的** mohh 也就是现在的 DUI BU QI WO SHI PANTU 可怜的allies 就剩一人,基本出生不了.旁观的JORDAN也是个透视,可怜啊可怜,可惜ZB器不如人啊 说实话,zb玩到如此无聊和低级趣味的,我还是第一次见到. 以此类推,这类人平时都只能靠手X来解决苦闷的,现在估计光手都不行,要用砂纸才有可怜的一点快感了...
  9. 谢谢上面两位... 目前机器托管在世导机房双线,目前算是最好的双线机房了,sina和阿里巴巴都在这里, 除了这实在找不到更好的双线机房了,可能有些西部地区的来有点问题,其他地区问题都不大. 至于你说的停顿问题,是因为安装了snakeserverpatch的缘故,一般停顿的时候会有一名玩家被踢出,通常是因为CVAR复位检查不合法的缘故,也就是有zb嫌疑.这是目前不用安装客户端最好的检查zb方法了. 当然对一些zb手段还是防不了.
  10. 谢谢关心, 说点有用的行吗?
  11. 日,和DMW的沟通了,可能是我英文太烂,实在无法让他们理解我的需求,他们的客服多是以让我检查设置放火墙之类的方法来应对,我实在是计穷了,看看S-22能不能帮我和他们的开发人员沟通一下这个问题? 不胜感激...
  12. ftp://down0420:down@down2.bgxp.com/www_bg...ser_6.0_ENG.ISO
  13. 不影响啊,DMW3 scanner 不是可以管理64个服务器吗,只需要它能提供多ip映射同一mohaa服务器的功能就可以了. 说简单点就是允许一个mohaa server登记 2个或以上的ip. 至于这两个ip是否同一server很容易就检查出来了。 而且这个问题也是很普遍的,并不是很特殊啊,比如在内网开台mohaa服务器 192.168.1.8 然后把端口映射出去(202.xx.xx.xx和外网的一起游戏,这时候内网连接的mohaaserver是 192.168.1.8 ,而外网玩家连接的是 202.xx.xx.xx ,那么同样存在这个问题啊. client里的lan option 难道只考虑到了scanner在内网的情况,就没考虑mohaaserver在内网的情况吗?
  14. 最近FF增加了双线双ip的服务器,目前可以实现不同地区的用户通过不同的入口ip登陆服务器, 可是前期购买的DMW3 silver配合上有些问题. 分析了一下DMW 工作原理: 1.scanner通过Rcon 来设置了mohaa server SV_pure 这个CVAR 其中包含scanner的地址. 2.dmw client 通过hook mohaa.exe 得到Sv_pure 中内容,取出scanner的地址 连接scanner. 3.dmw client 连接上scanner 后,检查client 的正确性以及环境的合法,以及游戏文件的合法. 4.dmw client 将取得mohaa.exe 连接的mohaaserver地址+player的唯一标识(应该是challenge)+client用户的登录信息以及是否检查通过发送到scanner. 5.scanner通过rcon status 和 dumpuser 定时的刷新到玩家的信息并维持一张表playerlist,其中应该包含 serverip , player的唯一标识(应该是challenge),玩家的相关信息,是否通过client检查.... 6.scanner 匹配客户端传上来信息和这张玩家的列表,匹配的关键字应该是serverip+challenge,然后修改状态,找出没检查通过或没client没连接上的踢出. 问题出来了. 如果 dmwscanner scan 电信ip的server,那么连接到网通ip的用户从client 发回的信息中包含的serverip就是网通的地址,scanner 匹配不上,那么就把所有网通用户踢出. 同理 如果scan 网通ip的server,从电信的进的都被踢出. 如果两个都scan,更好了,虽然连接状态灯全亮,全被踢了. 目前我认为如果在用户列表和client信息匹配上,scanner使用了serverip做为了其中的元素,那么这个问题的解决必须通过修改DMWscanner来解决. 急切希望老猫能帮我们和DMW沟通一下,解决这个问题. 如果有更好的更简单的方法解决这个问题,也请不吝赐教.
  15. 哦,这样,如果只给机器提供的的双线对应双ip的接入,目前我只能用端口转发来实现绑定mohaa服务器,不知道有什么更好的方法吗? 比如TEAM或bridge.
×
×
  • 创建新的...