其次我在这里申明几点:其一本文的很多内容来源于互联网,因此感谢他们的无私支持。其二,我个人是外挂反对者,我不希望我的文章被用于不正当的行业,我仅仅希望这文章可以对防堵外挂做一些贡献。其三,很重要,希望大家看看而已,其实并没有什么深奥的都是很简单的知识,希望大家不要想入非非去做一些不该做的事情。最后一句:游戏无限,时光有限,朋友无价,游戏虚拟,希望大家可以珍惜现实生活,分清虚拟与现实。
1、网络游戏分类:
一、封包滤镜类:
凡是网游,都会通过封包向服务器(可以认为封包就是上网数据流)发送和接收数据,如买东西、移动、打怪等,而这些封包,不一定都加密,即使加密了,也不会很复杂。因为网游是耗费带宽太大的东西,如果加密解密过程复杂了。数据量会变大,服务器处理的数据会变多,从而游戏就会变卡。故,封包只要有足够的耐心和经验,是完全可以解密的,从而就可以发送虚假的数据,欺骗服务器达到刷钱、或自动打怪、或攻击暴增等等不法目的。
二、游戏客户端脱壳
这个比较复杂点,也就是把游戏的客户端进行脱壳(也就是让游戏原代码能够看到),分析里面的数据,从而避免某些不利的分支执行。在游戏里的表现就可以达到例如:无敌(拦截死亡分支程序的执行)。恐怖吧好在。这种高手极为稀少,即使有也不屑于做破坏游戏这种低级的事。大家还是安全的,呵呵。
三、动作模拟类
这种就非常大众化了,我也是看到了官方的日志,才接触到的按键精灵,呵呵。在我看来,这是一种集成了某种开发软件对计算机外设硬件操作代码。并把对用户有用的部分简单化的工具,也支持简单的编程。这类工具,不可能做成变态的外挂,但是可以避免很多的手工重复操作。封不封个人认为无所谓。像这个游戏就提供了搜寻目标的图标,对不变态的这类工具,好像官方留有一定余地。
四、还有其它的很多外挂:
极少见,最狂的一类,呵呵。攻击服务器。修改数据。这是官方与骇客的对战。偶怕怕,精神上支持官方。:)
2、完美世界加密封包代码:
10002FBE 55 push ebp
10002FBF 8BEC mov ebp,esp
10002FC1 53 push ebx
10002FC2 56 push esi
10002FC3 57 push edi
10002FC4 8B4D 08 mov ecx,dword ptr ss:[ebp+8]
10002FC7 8B55 0C mov edx,dword ptr ss:[ebp+C]
10002FCA 837D 10 00 cmp dword ptr ss:[ebp+10],0
10002FCE 76 6B jbe short 1000303B
10002FD0 8A99 00010000 mov bl,byte ptr ds:[ecx+100]
10002FD6 FEC3 inc bl
10002FD8 8899 00010000 mov byte ptr ds:[ecx+100],bl
10002FDE 81E3 FF000000 and ebx,0FF
10002FE4 8A040B mov al,byte ptr ds:[ebx+ecx]
10002FE7 8D340B lea esi,dword ptr ds:[ebx+ecx]
10002FEA 8A99 01010000 mov bl,byte ptr ds:[ecx+101]
10002FF0 02D8 add bl,al
10002FF2 8899 01010000 mov byte ptr ds:[ecx+101],bl
10002FF8 81E3 FF000000 and ebx,0FF
10002FFE 8A040B mov al,byte ptr ds:[ebx+ecx]
10003001 8D3C0B lea edi,dword ptr ds:[ebx+ecx]
10003004 8A1E mov bl,byte ptr ds:[esi]
10003006 8806 mov byte ptr ds:[esi],al
10003008 33C0 xor eax,eax
1000300A 881F mov byte ptr ds:[edi],bl
1000300C 8A81 01010000 mov al,byte ptr ds:[ecx+101]
10003012 33DB xor ebx,ebx
10003014 8A99 00010000 mov bl,byte ptr ds:[ecx+100]
1000301A 8A0408 mov al,byte ptr ds:[eax+ecx]
1000301D 02040B add al,byte ptr ds:[ebx+ecx]
10003020 8A1A mov bl,byte ptr ds:[edx]
10003022 25 FF000000 and eax,0FF
10003027 8A0408 mov al,byte ptr ds:[eax+ecx]
1000302A 32D8 xor bl,al
1000302C 8B45 10 mov eax,dword ptr ss:[ebp+10]
1000302F 881A mov byte ptr ds:[edx],bl
10003031 42 inc edx
10003032 8BDA mov ebx,edx
10003034 2B5D 0C sub ebx,dword ptr ss:[ebp+C]
10003037 3BD8 cmp ebx,eax
10003039 ^ 72 95 jb short 10002FD0
1000303B 5F pop edi
1000303C 5E pop esi
1000303D 5B pop ebx
1000303E C9 leave
1000303F C2 0C00 retn 0C
需要说明的几点:本程序是用汇编语言编写,应该很多大学相关专业都有涉及这门语言,在这里就不做过多的解释了,其次在程序中EAX为总字符,EBX为已经加密了多少。
arg4:[ebp+8]//加密码表,长度0x100[0..$FF], 100,101存放临时结果
arg8:[ebp+C]]//Buffer,要加密的数据;每次加密一个字节,简单的xor,add,和码表运算
argc:[ebp+10]//BufferSize,加密的数据字节数
将以上语句翻译为高级语言的可以用以下语句表示:
typedef struct {
unsigned char table[256];
unsigned char a;
unsigned char b;
} arg1;
void encrypt(arg1* handle, unsigned char *data, int len)
{
register unsigned char *ptr = data;
register unsigned char m;
if( len <= 0 ) return;
do {
handle->a++;
m = handle->table[handle->a];
handle->b += m;
handle->table[handle->a] = handle->table[handle->b];
handle->table[handle->b] = m;
*(ptr) = handle->table[*(ptr)] ^ handle->table[m+handle->table[handle->a]];
ptr++;
} while(ptr-data<len);
}