网络游戏已经成为网络业三大赢利且利润丰厚的领域之一,但由于网络黑客对游戏的破坏,许多网络游戏被迫关闭,因此必须对网络黑客常用的游戏解密行为进行剖析,使得游戏编程人员和开发商彻底地了解其破解方式,在游戏底层阻断黑客的破坏行为。

本文正是以此为出发点,分析网络游戏中常用的加密机制,找出它们的弊端,仿真黑客的解密过程,最后提出防范黑客攻击的几种应对方案。

一、加密技术

1、对称加密技术

对称加密算法(symmetric algorithm),又叫传统加密算法,它要求发送方和接收方在安全通信之前,商定一个密钥,对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信至关重要.对称加密的优点在于实现算法的效率高、速度快.对称加密的缺点在于密钥的管理过于复杂。假设有N个用户进行对称加密通信,如果按照上述方法,则他们要产生N(N-1)把密钥,每一个用户要记住或保留N-1把密钥,当N很大时很难记忆,而保留起来又会使密钥泄漏的可能性增加。常用的对称加密算法有DES、DEA等。图1是DES加密算法的结构图。

数据文件加密与解密技术在网络游戏中的应用

2、非对称加密技术

非对称加密技术又叫公开密钥算法,它用作加密的密钥不同于用作解密的密钥,而且解密密钥不能根据加密密钥计算出来。在这种加密算法中,加密密钥被叫做公开密钥,而解密密钥被叫做私有密钥。非对称加密的缺点在于实现算法的效率低、速度慢,非对称加密的优点在于用户不必记忆大量的提前商定好的密钥。但为了保证可靠性,非对称加密算法需要一种与之相配合使用的公开密钥管理机制,常用的非对称加密算法有RSA等。

二、网络游戏中的解密技术

1、静态分析

通过上面的知识发现,网络游戏的加密算法都有一定的规律,比如算法中都含有一系列的异或、移位、加减、乘除和重复运算过程。本文首先对游戏的客户端进行反编译,然后查找具有这些特征的代码,既然找到了加密算法,那么接下来的工作就是慢慢分析代码,则解密方案就有了。此种解密方式要求程序员有较深的汇编功底,但是却是最易使用的一种软件解密方式,反编译的工具有很多,如Hedit、W32dasm黄金版等。下面的代码是利用W32dasm黄金版对QQ游戏军旗游戏的客户端进行反汇编查找到的部分加密算法。

mov al, byte ptr [ebp-OC]

mov cl, byte ptr [ebp+FFFFFB39]

mov byte ptr [ebp+ FFFFFB38] ,al

mov al, byte ptr [ebp-OB]

mov dl.cl

-- - - ------ -以上是加密初始化部分 --- - -

add esp,OOOOOOOC

xor dl, al and dl, 07

xor clr dl mov dl, cl

xor dl, al and dI, 38

xor e-l, dI mov cU , cl

xor dl,al and aI,CO

and dl,40 xor cl,dl

shl al,l and cl.7F

or al,cl mov byte ptr [ebp+ FFFFFB39],al

--------以上是加密的实现过程包括异或,移位等-------

mov al,byte ptr[ebp-OA]

mov byte ptr[ ebp十FFFFFB3A] ,al

mov al,byte ptr [ebp-09]

mov byte ptr [ebp+FFFFFB3B] ,al

mov al, byte ptr [ebp-08J

mov byte ptr[ebp+FFFFFB3Cl.al

rnov al,byte ptr[ebp-07]

mov byte ptr [ebp+FFFFFB3D], al

. mov eax, dword ptr [ebp-06]

mov byte ptr [ebp+ FFFFFB3E] ,al

mov byte ptr[ebp+FFFFFB3F],ah

mov ax, word ptr[ebp-04]

mov byte ptr Lebp+ FFFFFB40],al

mov byte ptr [ebp十FFFFFB41].ah

mov eax,dword ptr [004463FC]

nxⅣedx,dword ptr[eax+ 0000138C]

------以上是加密的退出处理转存过程-------

2、动态分析

封包是指由sockets协议进行发送与接收的数据包,网络游戏中的封包大都是经过加密的,所以对游戏解密算法的研究其实就是对数据包的解密操作,目前破解封包加密与解密算法的方法主要是通过动态调试技术来实现的,其原理是首先通过动态调试跟踪并取出加密与解密算法的代码段,然后再通过分析这些代码最终得出结论。

大家知道游戏程序加密与解密算法的代码永远存在于程序中;其次在程序流的执行过程中,加密与解密算法的代码一定会被执行,动态调试工具可以采用OllyDbg工具,动态调试主要是跟踪代码的执行,而查找加密与解密代码段就是一个跟踪的过程,下面用OllyDbg工具对QQ军旗客户端进行跟踪的过程。

第一步:运行OlIyDbg,直接加载QQ军旗客户端,F9直接运行程序,发现没有错误,即QQGame没有进行压缩。

第二步:设置断点跟踪QQGame的执行,可以用F8单步执行程序,得到跟踪结果如下:

call dword ptr ds: [edx+ 00];添加QQGame剑系统托盘。

calldword ptr ds:[eax+5C];打开游戏大厅画面。

第三步:输入密码登陆游戏,在内存映射中搜索用户名和密码,数据如下:

OOF42 A34 1E D6 D8 83 F6 BD AD BA FE,重出江湖-NOI

OOF42940 77 61 6E 67 38 31 30 33 32 34 w123654789

OOF429F4 55 50 39 67 71 67 70 UP9gqgp

OOF42A04 56 70 48 70 35 50 38 44 62 VI)Kp5P8Db

UP9gqgpVpKp5P8Db是服务器传过来的加密密钥的明文,每次登录服务器传过来的密钥都不同。

第四步:寻找调用OOF42940这个内存地址的那段汇编代码,则这段代码的人口点就是QQGame游戏的加密算法的人口点,部分结果如下:

---------加密的初始化部分----------

add al,0

add byte ptr ds:[ eax],a1

Oja short CmdCente.OOF429A7

outs dx, byte ptr es.: [edi];输出字符串到制定地址

--------下面是加密过---------

cmp hyre ptr ds:[ bx+di] ,dh;

校验[bx+dil是否为dhxar byte pu ds:[ebx],dh;

ebx的值与dh异或运算

xor dh, byte ptr ds: [eax+ eax];异或运算

add byte ptr ds: [eaxl, al

add byte ptr ds: [eax], al

add byte ptr ds:[edxl,cl

add byte ptr ds: [edi],bh

outs dx,byte ptr es: [edi];

输出字符串到指定地址mov edi, 309FF9AO;

将309FF9AO传送给ediiretd

cmps byte ptr ds:[esi].byte ptr es:[edi];

串比较mov ecx,18528834;

将18528834传送给ecxout 4D,al;

指定端口号OULS dx, dword ptr es: [edi];

输出字符串到制定地址push esi mov esp,684A94C1 dec edi and eax.42888A50;

eax与42888A50做与运算

cmp al,byte ptr ds: [eax]

add byre ptr ds: [eax],al

add byte ptr ds:[eax],al

add byte ptr ds: [eaxl,bh

ins byte ptr es:[edil,dx

jno shon: CrndCente.OOF4293C;

程序不溢出跳转

最后:知道了密钥和加密函数的入口点,那么对QQGame的修改就变得非常容易,这就是破解的全过程。

三、网络游戏防范破解的几种方案

网络游戏面临着随时受到黑客攻击的巨大挑战,因此防范黑客破解成了游戏开发成本的重要组成部分,找到几种有效的防范方案已迫在眉睫。首先服务器应该对所有客户端数据采取不信任的态度,尽量避免网络游戏的关键计算放在客户端;其次是防止黑客程序做出超过人为操作的指令频率,来保持游戏平衡性。下面是具体的几种防范措施。

1、防止分析和伪造数据包

网络游戏的架构中,服务器/客户端这种结构是最常见的,那么所有玩家做出的操作,最终都一定会以数据包的形式发给服务器,因此最易被人监听篡改的部分就是网络传输的数据包了。

考虑到程序要适应各种不同的硬件,游戏开发商只能调用系统中网络通讯的API函数。但是机器毕竟在玩家手中,可以使用多种方式截获这些接收和发送的数据包。唯一可行的方案是对传输的数据包进行加密,选择一种最佳的加密算法是首先要解决的问题,第一,必须是对称加密算法,因为对称加密算法的加密和解密速度都很快;第二,不能占用太多的内存;第三,不要产生过大的数据冗余,因为网络游戏的数据包大都是几个游戏操作指令,那么几个字节的冗余都会显得太大.基于以上三点考虑,目前较常用的是利用数据分组后再进行位交换的类DES加密算法。如果需要一个更为经济的算法,那么可以做一个将数据包里数据利用密钥(一个握手时传人的数据)打乱的算法,与DES不同,可以舍弃防止人家黑盒分析的高强度数学方法,而采用一些更简易的算法,不用对数据做位操作,针对字节的操作使得加解密速度都很快。

还应该注意的是,不能对加密算法随意地简化,如果仅仅是对数据包进行循环再和一个密钥。做异或运算,那么这种加密算法的强度就会太低。但是可以先写一个伪随机数发生器,把种子作为密钥在握手时传人,初始化这个随机数数列,然后从数列中依次取出和网络传输的数据包数据逐个异或,黑盒破解的难度就会大很多。

2、防止反编译

事实上,程序一旦到了用户手上,根本无法阻止用户的修改,必须要靠更高的技术手段来解决。

(1)加大程序阅读难度

反编译和动态跟踪的目的是理解游戏制作人员的程序设计意图,来编写一个程序替代合法的客户端或者对客户端做修改,完成一些“非法”的操作.虽然开发商无法阻止黑客阅读代码,但是却可以加大程序的阅读难度,可以采用一些专业的设计模式,在游戏开发程序员的角度看,源码将变得更加清晰;由于程序本身的模式和机器模式相
差较远使得编译生成的汇编执行文件难以阅渎。

(2)用脚本语言编写加密和解密模块

可以使用脚本语言来完成程序逻辑,因为用脚本语言编写的数据包加密模块,解密难度是相当大的。脚本语言可选择Pyrhon或Lu,有研发实力的公司,也可以自行开发一种脚本语言,不对外公布,以保障游戏代码的安全性。

(3)避免在内存留下完整的明文

尽可能地不要在内存留下完整的明文,因为黑客在毫无头绪的情况下,大都通过假设内存中有一段明文数据,比如用户输入的一串聊天字符串,搜索内存得到这串数据的物理地址,然后反向查找处理这些数据的位置。

如果没有这些可供参考的数据点,反编译跟踪整个客户端程序的工作量就太大了。另外,socket API调用的位置也往往是跟踪的切入点,因此在设计通讯模块的时候应该合理设计,使得实际处理网络数据的程序入口远离这些敏感点。

小知识之W32Dasm

W32Dasm是一个静态反汇编工具,也是破解人常用的工具之一,它也被比作破解人的屠龙刀。W32Dasm10.0修改版是经Killer在W32Dasm8.93基础上修改的,修改后的W32Dasm功能更强大,能完美显示中文字符串及VB程序,内含16进制编辑器,破解修改软件更容易,可谓是反汇编极品。