數據文件加密與解密技術在網絡游戲中的應用

網絡游戲已經成為網絡業(yè)三大贏利且利潤豐厚的領域之一,但由于網絡黑客對游戲的破壞,許多網絡游戲被迫關閉,因此必須對網絡黑客常用的游戲解密行為進行剖析,使得游戲編程人員和開發(fā)商徹底地了解其破解方式,在游戲底層阻斷黑客的破壞行為。

本文正是以此為出發(fā)點,分析網絡游戲中常用的加密機制,找出它們的弊端,仿真黑客的解密過程,最后提出防范黑客攻擊的幾種應對方案。

一、加密技術

1、對稱加密技術

對稱加密算法(symmetric algorithm),又叫傳統(tǒng)加密算法,它要求發(fā)送方和接收方在安全通信之前,商定一個密鑰,對稱算法的安全性依賴于密鑰,泄漏密鑰就意味著任何人都可以對他們發(fā)送或接收的消息解密,所以密鑰的保密性對通信至關重要.對稱加密的優(yōu)點在于實現算法的效率高、速度快.對稱加密的缺點在于密鑰的管理過于復雜。假設有N個用戶進行對稱加密通信,如果按照上述方法,則他們要產生N(N-1)把密鑰,每一個用戶要記住或保留N-1把密鑰,當N很大時很難記憶,而保留起來又會使密鑰泄漏的可能性增加。常用的對稱加密算法有DES、DEA等。圖1是DES加密算法的結構圖。

數據文件加密與解密技術在網絡游戲中的應用

2、非對稱加密技術

非對稱加密技術又叫公開密鑰算法,它用作加密的密鑰不同于用作解密的密鑰,而且解密密鑰不能根據加密密鑰計算出來。在這種加密算法中,加密密鑰被叫做公開密鑰,而解密密鑰被叫做私有密鑰。非對稱加密的缺點在于實現算法的效率低、速度慢,非對稱加密的優(yōu)點在于用戶不必記憶大量的提前商定好的密鑰。但為了保證可靠性,非對稱加密算法需要一種與之相配合使用的公開密鑰管理機制,常用的非對稱加密算法有RSA等。

二、網絡游戲中的解密技術

1、靜態(tài)分析

通過上面的知識發(fā)現,網絡游戲的加密算法都有一定的規(guī)律,比如算法中都含有一系列的異或、移位、加減、乘除和重復運算過程。本文首先對游戲的客戶端進行反編譯,然后查找具有這些特征的代碼,既然找到了加密算法,那么接下來的工作就是慢慢分析代碼,則解密方案就有了。此種解密方式要求程序員有較深的匯編功底,但是卻是最易使用的一種軟件解密方式,反編譯的工具有很多,如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、動態(tài)分析

封包是指由sockets協(xié)議進行發(fā)送與接收的數據包,網絡游戲中的封包大都是經過加密的,所以對游戲解密算法的研究其實就是對數據包的解密操作,目前破解封包加密與解密算法的方法主要是通過動態(tài)調試技術來實現的,其原理是首先通過動態(tài)調試跟蹤并取出加密與解密算法的代碼段,然后再通過分析這些代碼最終得出結論。

大家知道游戲程序加密與解密算法的代碼永遠存在于程序中;其次在程序流的執(zhí)行過程中,加密與解密算法的代碼一定會被執(zhí)行,動態(tài)調試工具可以采用OllyDbg工具,動態(tài)調試主要是跟蹤代碼的執(zhí)行,而查找加密與解密代碼段就是一個跟蹤的過程,下面用OllyDbg工具對QQ軍旗客戶端進行跟蹤的過程。

第一步:運行OlIyDbg,直接加載QQ軍旗客戶端,F9直接運行程序,發(fā)現沒有錯誤,即QQGame沒有進行壓縮。

第二步:設置斷點跟蹤QQGame的執(zhí)行,可以用F8單步執(zhí)行程序,得到跟蹤結果如下:

call dword ptr ds: [edx+ 00];添加QQGame劍系統(tǒng)托盤。

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的修改就變得非常容易,這就是破解的全過程。

三、網絡游戲防范破解的幾種方案

網絡游戲面臨著隨時受到黑客攻擊的巨大挑戰(zhàn),因此防范黑客破解成了游戲開發(fā)成本的重要組成部分,找到幾種有效的防范方案已迫在眉睫。首先服務器應該對所有客戶端數據采取不信任的態(tài)度,盡量避免網絡游戲的關鍵計算放在客戶端;其次是防止黑客程序做出超過人為操作的指令頻率,來保持游戲平衡性。下面是具體的幾種防范措施。

1、防止分析和偽造數據包

網絡游戲的架構中,服務器/客戶端這種結構是最常見的,那么所有玩家做出的操作,最終都一定會以數據包的形式發(fā)給服務器,因此最易被人監(jiān)聽篡改的部分就是網絡傳輸的數據包了。

考慮到程序要適應各種不同的硬件,游戲開發(fā)商只能調用系統(tǒng)中網絡通訊的API函數。但是機器畢竟在玩家手中,可以使用多種方式截獲這些接收和發(fā)送的數據包。唯一可行的方案是對傳輸的數據包進行加密,選擇一種最佳的加密算法是首先要解決的問題,第一,必須是對稱加密算法,因為對稱加密算法的加密和解密速度都很快;第二,不能占用太多的內存;第三,不要產生過大的數據冗余,因為網絡游戲的數據包大都是幾個游戲操作指令,那么幾個字節(jié)的冗余都會顯得太大.基于以上三點考慮,目前較常用的是利用數據分組后再進行位交換的類DES加密算法。如果需要一個更為經濟的算法,那么可以做一個將數據包里數據利用密鑰(一個握手時傳人的數據)打亂的算法,與DES不同,可以舍棄防止人家黑盒分析的高強度數學方法,而采用一些更簡易的算法,不用對數據做位操作,針對字節(jié)的操作使得加解密速度都很快。

還應該注意的是,不能對加密算法隨意地簡化,如果僅僅是對數據包進行循環(huán)再和一個密鑰。做異或運算,那么這種加密算法的強度就會太低。但是可以先寫一個偽隨機數發(fā)生器,把種子作為密鑰在握手時傳人,初始化這個隨機數數列,然后從數列中依次取出和網絡傳輸的數據包數據逐個異或,黑盒破解的難度就會大很多。

2、防止反編譯

事實上,程序一旦到了用戶手上,根本無法阻止用戶的修改,必須要靠更高的技術手段來解決。

(1)加大程序閱讀難度

反編譯和動態(tài)跟蹤的目的是理解游戲制作人員的程序設計意圖,來編寫一個程序替代合法的客戶端或者對客戶端做修改,完成一些“非法”的操作.雖然開發(fā)商無法阻止黑客閱讀代碼,但是卻可以加大程序的閱讀難度,可以采用一些專業(yè)的設計模式,在游戲開發(fā)程序員的角度看,源碼將變得更加清晰;由于程序本身的模式和機器模式相
差較遠使得編譯生成的匯編執(zhí)行文件難以閱瀆。

(2)用腳本語言編寫加密和解密模塊

可以使用腳本語言來完成程序邏輯,因為用腳本語言編寫的數據包加密模塊,解密難度是相當大的。腳本語言可選擇Pyrhon或Lu,有研發(fā)實力的公司,也可以自行開發(fā)一種腳本語言,不對外公布,以保障游戲代碼的安全性。

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

盡可能地不要在內存留下完整的明文,因為黑客在毫無頭緒的情況下,大都通過假設內存中有一段明文數據,比如用戶輸入的一串聊天字符串,搜索內存得到這串數據的物理地址,然后反向查找處理這些數據的位置。

如果沒有這些可供參考的數據點,反編譯跟蹤整個客戶端程序的工作量就太大了。另外,socket API調用的位置也往往是跟蹤的切入點,因此在設計通訊模塊的時候應該合理設計,使得實際處理網絡數據的程序入口遠離這些敏感點。

小知識之W32Dasm

W32Dasm是一個靜態(tài)反匯編工具,也是破解人常用的工具之一,它也被比作破解人的屠龍刀。W32Dasm10.0修改版是經Killer在W32Dasm8.93基礎上修改的,修改后的W32Dasm功能更強大,能完美顯示中文字符串及VB程序,內含16進制編輯器,破解修改軟件更容易,可謂是反匯編極品。