頁(yè)游安全攻與防
網(wǎng)頁(yè)游戲的安全問(wèn)題,在剛?cè)肼毥佑|的時(shí)候,寫(xiě)過(guò)兩篇比較淺顯的文章。雖然頁(yè)游安全總體上并沒(méi)有顯著變化,沒(méi)有新的攻擊方法,也沒(méi)有新的防御方法,我個(gè)人的工作重心也由頁(yè)游安全轉(zhuǎn)向了手游安全,但出于完美主義的偏執(zhí),還是希望寫(xiě)一篇覆蓋完整的頁(yè)游安全文章,希望能給頁(yè)游產(chǎn)業(yè)一點(diǎn)幫助。
一、協(xié)議安全(swf安全):自動(dòng)封包 (重點(diǎn))
頁(yè)游,最最核心的就是客戶端(swf)與服務(wù)端的游戲通信了。游戲通信產(chǎn)生的封包,內(nèi)容是否可識(shí)別,可篡改,可重放,處理邏輯是否有漏洞,都決定了這款游戲是否有重大的漏洞。
我們知道頁(yè)游前端和后臺(tái)的通信一般有兩者方式,一種是http連接,一種是socket連接,前者適用于小型頁(yè)游,例如內(nèi)嵌在QQ平臺(tái)的QQ農(nóng)場(chǎng),后者適用于大型頁(yè)游。
不同的通信方式,產(chǎn)生的數(shù)據(jù)包格式也不一樣,像HTTP AMF的可以使用charles來(lái)抓包查看,像sockets的可以使用WPE抓包查看。
以socket 通信為例,協(xié)議采用自定義格式,一般由兩部分組成,包頭與包體,包頭一般是固定長(zhǎng)度,包體為可變長(zhǎng)度。包頭一般是一些基本信息,例如包長(zhǎng)度,版本號(hào),命令號(hào),用戶ID,序列號(hào)等;包體就是操作命令對(duì)應(yīng)的接收參數(shù),參數(shù)個(gè)數(shù)不同,參數(shù)類(lèi)型不同會(huì)導(dǎo)致包體長(zhǎng)度不同。
只要摸清楚協(xié)議算法,即包是如何生成的,就可以構(gòu)造數(shù)據(jù)包與服務(wù)器自由通話,這一后果是非常嚴(yán)重的。自由通話意味著你不需要老老實(shí)實(shí)的在客戶端操作,一條數(shù)據(jù)包就能代替你一連串的操作,例如發(fā)送一條數(shù)據(jù)包完成一個(gè)任務(wù),常用于快速升級(jí),淘寶上的頁(yè)游代練絕大多數(shù)都是采用的這種方式;自由通話更意味著你可以繞過(guò)客戶端的邏輯判斷,傳任意參數(shù)給服務(wù)端。說(shuō)到這里,你可能覺(jué)得只要服務(wù)端能正常處理來(lái)自客戶端的參數(shù),不出邏輯錯(cuò)誤,不出配置錯(cuò)誤,就萬(wàn)事大吉。這種想法很常見(jiàn),例如上海寶開(kāi)公司的某個(gè)開(kāi)發(fā)就說(shuō)過(guò),我們的游戲邏輯判斷都在服務(wù)端,我們沒(méi)有外掛。我推測(cè)這個(gè)人應(yīng)該不怎么上外網(wǎng)。
理想是豐滿的,現(xiàn)實(shí)是骨感的,怎么能保證后臺(tái)不將邏輯寫(xiě)錯(cuò),策劃運(yùn)營(yíng)不將配置弄錯(cuò)呢,特別是在高強(qiáng)度的通宵加班后。你可能說(shuō)靠測(cè)試呀,中國(guó)頁(yè)游行業(yè),配給給游戲的測(cè)試人員是非常少的,相應(yīng)的測(cè)試時(shí)間也是遠(yuǎn)遠(yuǎn)不足的,并且測(cè)試技術(shù)也非常需要提高,總的來(lái)說(shuō),在頁(yè)游行業(yè),能做完整協(xié)議測(cè)試的公司不多。但玩家,特別是從事外掛制作代練服務(wù)的打金工作室會(huì)“幫你”好好地徹底地做協(xié)議測(cè)試。他們會(huì)先反編譯客戶端上的SWF文件(緩存中的,內(nèi)存中的)得到協(xié)議生成算法,制作成封包工具,遍歷每個(gè)協(xié)議號(hào),每個(gè)參數(shù)輸入,讓你的錯(cuò)誤無(wú)從遁形。
我見(jiàn)過(guò)一個(gè)非常聰明的外掛制作者,在外掛中添加了腳本分享平臺(tái),號(hào)召大家共同摸索,將有問(wèn)題的封包以腳本的方式上傳以供大家下載,這種集思廣益真的很妙,腳本的分享會(huì)給“找bug”精神獎(jiǎng)勵(lì),將其帳號(hào)公布出來(lái)以供大家瞻仰,因此樂(lè)意分享的人很多。而且作者還很負(fù)責(zé)的有腳本審核機(jī)制,并支持快捷的查詢。這是什么樣的用戶體驗(yàn)呀,這就是頁(yè)游外掛界的app store
看到這里,你或許想,我保護(hù)好SWF文件,不讓其逆向不就行了嗎?有需求,就有滿足需求的地方,市面上有不少給SWF提供加密服務(wù)的收費(fèi)產(chǎn)品,例如Amayeta SWF Encrypt 和 DComSoft SWF Protector ,因?yàn)槭召M(fèi),沒(méi)用過(guò)這些產(chǎn)品,不知道具體原理,但據(jù)了解,最常用SWF加密方式,就是破壞SWF標(biāo)準(zhǔn)文件頭,通過(guò)向SWF的二進(jìn)制文件的文件頭寫(xiě)入無(wú)意義的數(shù)據(jù),從而導(dǎo)致反編譯軟件無(wú)法正常解析SWF文件。下圖是使用反編譯器打開(kāi)加密的SWF文件,會(huì)提示無(wú)法解析
我們可以對(duì)比一下采用這種加密方式的swf文件頭內(nèi)容:
(1)未加密swf文件
正常的SWF文件,文件頭部是由一個(gè)三字節(jié)的標(biāo)識(shí)符開(kāi)始,為0×46、0×57、0×53(“FWS”)或者0×43、0×57、0×53(“CWS”)其中之一。“FWS”標(biāo)識(shí)符說(shuō)明該文件是未壓縮的SWF文件,“CWS”標(biāo)識(shí)符則說(shuō)明該文件前8個(gè)字節(jié)之后(即文件長(zhǎng)度字段之后)的全部數(shù)據(jù)為開(kāi)源的標(biāo)準(zhǔn)ZLIB方式壓縮。#p#
(2)加密后的SWF文件
很明顯,文件頭部變成了無(wú)意義的符號(hào)。
實(shí)現(xiàn)函數(shù)示例(參考http://blog.sina.com.cn/s/blog_731fdd2b01010u9k.html)
有加密就有解密,加密的SWF文件需要還原,雖然反編譯不了加密后的SWF文件,但可以反編譯解密文件找到解密代碼來(lái)還原加密SWF文件的文件頭。(參考 http://www.2cto.com/Article/201211/167406.html )
很明顯,這種SWF加密方法沒(méi)什么作用。于是大家想著如何用一種無(wú)法反編譯的實(shí)現(xiàn)方法來(lái)隱藏加密算法,例如利用Alchemy能夠編譯C/C++代碼為AS字節(jié)碼但無(wú)法被反編譯的特性來(lái)隱藏加密算法。其實(shí)我懷疑目前有工具將Alchemy還原成C了,例如ASV(actionscript view 2012)就號(hào)稱是目前最強(qiáng)悍的SWF解密工具,網(wǎng)上都有該工具的團(tuán)購(gòu)消息了。
我不懂SWF的加密解密,但我知道有一條萬(wàn)能守則,任何加密在內(nèi)存中都是解密狀態(tài)的。當(dāng)無(wú)法解密的時(shí)候,就從內(nèi)存中查找導(dǎo)出吧,我們可以先使用SWF Memory Dumper從瀏覽器內(nèi)存中導(dǎo)出解密并解壓縮的SWF文件,再用傳播程度都爛大街的碩思閃客反編譯得到源碼。這一方法對(duì)游戲協(xié)議安全來(lái)說(shuō),是非常非常非常悲劇的。如下圖所示,包的組成結(jié)構(gòu),包中各個(gè)字段的生成算法都可以通過(guò)逆向解密SWF文件獲得!
例如下圖為游戲協(xié)議結(jié)構(gòu)
例如下圖就是游戲協(xié)議對(duì)應(yīng)的命令號(hào)
例如下圖為游戲配置表
一切的一切,都注定了要想完全解決協(xié)議安全問(wèn)題,只有靠AS混淆了。目前有一些收費(fèi)軟件提供AS混淆,例如secureSWF 。但奇怪的是,沒(méi)有多少頁(yè)游公司實(shí)施AS混淆。
寫(xiě)到這里,或許你會(huì)幻想游戲協(xié)議算法不會(huì)被逆向得知,那不就完事大吉了嗎?再次申明,現(xiàn)實(shí)是殘忍的,即使不知道協(xié)議算法,照樣可以修改游戲封包。我們可以通過(guò)耐心的反復(fù)操作來(lái)對(duì)比封包的不同,定位到修改點(diǎn)。一般使用WPE工具,修改包體。WPE工具的關(guān)鍵就是過(guò)濾器,查找到符合指定特征的封包,將特定的位置替換為修改的值。如下圖所示,
除了封包篡改,最簡(jiǎn)單的連封包結(jié)構(gòu)都不要猜測(cè)的就是封包重放作弊了,例如打怪是一條封包,只要反復(fù)重放該封包,就能輕易刷取經(jīng)驗(yàn)值了。
好的協(xié)議設(shè)計(jì),一定要考慮到防御封包篡改和封包重放,最簡(jiǎn)單的方法是在封包的某個(gè)字段加入一個(gè)序列號(hào),該序列號(hào)包含包體完整性檢驗(yàn)值,時(shí)間因素值,來(lái)區(qū)分封包是否是重放的,是否有被篡改。
有了好的協(xié)議設(shè)計(jì),協(xié)議是否安全了呢?協(xié)議的實(shí)現(xiàn)方法在客戶端SWF中,這一事實(shí)又講安全問(wèn)題引回到SWF被逆向的問(wèn)題上,只要被成功逆向,一切努力都打水漂了。雖然防御艱難,但也不能放棄,一種方法不行,可以用多種方法??偟膩?lái)說(shuō),為了協(xié)議安全,可以做如下措施(不僅僅從技術(shù)上):
1.好的協(xié)議設(shè)計(jì),防重放與篡改
2.SWF加密 ,注意加密算法的安全,最好AS混淆
3.耐心的做協(xié)議檢測(cè),開(kāi)發(fā)在提交測(cè)試前,做協(xié)議測(cè)試;測(cè)試在完成了功能測(cè)試,性能測(cè)試后也要搞好協(xié)議測(cè)試;策劃運(yùn)營(yíng)對(duì)配置表做認(rèn)真的檢查;
4.設(shè)計(jì)一套監(jiān)控系統(tǒng),監(jiān)控游戲中的收益與消費(fèi),大量的刷取物品肯定會(huì)在數(shù)值變化中體現(xiàn)出來(lái);
5.留意游戲論壇,游戲QQ群里是否有新漏洞的披露,外掛是否有更新;
6.頻繁更換加密算法,與外掛制作者PK更新速度。#p#
二、自動(dòng)游戲+加速
自動(dòng)游戲,簡(jiǎn)單的說(shuō)就是模擬鼠標(biāo)或鍵盤(pán)對(duì)游戲UI的操作,代替你做重復(fù)的工作。最簡(jiǎn)單的自動(dòng)游戲腳本可以使用按鍵精靈來(lái)制作,先對(duì)正常操作進(jìn)行錄制,然后編輯,設(shè)置熱鍵,最后回放即可。程序?qū)崿F(xiàn)中一般會(huì)有以下幾個(gè)關(guān)鍵函數(shù)
(1)模擬鍵盤(pán)
VOID keybd_event(
BYTE bVk, // 虛擬鍵碼
BYTE bScan, // 掃描碼
DWORD dwFlags,
ULONG_PTR dwExtraInfo // 附加鍵狀態(tài)
)
(2)模擬鼠標(biāo)
VOID mouse_event(
DWORD dwFlags, // motion and click options
DWORD dx, // horizontal position or change
DWORD dy, // vertical position or change
DWORD dwData, // wheel movement
ULONG_PTR dwExtraInfo // application-defined information
)
自動(dòng)游戲的作弊方式常見(jiàn)于對(duì)戰(zhàn)刷怪類(lèi)游戲,自動(dòng)識(shí)別地圖中怪物出現(xiàn)的位置,自動(dòng)出招打怪,自動(dòng)拾取掉落寶物。往往還會(huì)配合加速外掛,總的來(lái)說(shuō),就是靠達(dá)成那種不知疲倦(腳本操作)、準(zhǔn)確度高(自動(dòng)識(shí)別地圖中UI特征)、快速(對(duì)頁(yè)游就是加速flash的動(dòng)畫(huà)播放速度)的操作方式來(lái)快速升級(jí)。
自動(dòng)游戲類(lèi)型外掛的防御比較簡(jiǎn)單,增加人機(jī)識(shí)別的因素,類(lèi)似于論壇避免批量注冊(cè),采用只有人類(lèi)才能識(shí)別的驗(yàn)證碼(題外話,不少網(wǎng)站的驗(yàn)證碼其實(shí)可以機(jī)器識(shí)別),例如對(duì)于對(duì)戰(zhàn)類(lèi)游戲,記錄每次對(duì)戰(zhàn)的頻率和操作時(shí)間特性,對(duì)異常的操作彈出圖片驗(yàn)證,中斷自動(dòng)游戲。
在實(shí)施圖片驗(yàn)證的時(shí)候,要考慮到兩個(gè)要素:
一是圖片是否真正的機(jī)器難以識(shí)別,要預(yù)防簡(jiǎn)單的像素采集技術(shù);
二是圖片庫(kù)是否及時(shí)更新,要預(yù)防圖片庫(kù)的遍歷。
而加速外掛,也常見(jiàn)于對(duì)戰(zhàn)類(lèi)游戲。改變操作速度有兩種情況。一種是使用變速齒輪之類(lèi)的加速外掛加快flash動(dòng)畫(huà)播放速度,一種是速度值為游戲中的某個(gè)變量值,修改了對(duì)應(yīng)的數(shù)值。
對(duì)于加快flash動(dòng)畫(huà)播放速度的加速外掛,我們可以通過(guò)對(duì)比客戶端服務(wù)端時(shí)間是否同步來(lái)檢測(cè),當(dāng)檢測(cè)到異常的時(shí)候,可以彈出圖片驗(yàn)證,中斷加速。
對(duì)于速度由游戲中數(shù)值控制的,做好協(xié)議安全,使其無(wú)法改封包中對(duì)應(yīng)的數(shù)值;做好SWF反逆向保護(hù),使其無(wú)法修改源碼中控制速度的邏輯。#p#
三、內(nèi)存安全:內(nèi)存修改
修改游戲在內(nèi)存中的數(shù)值是經(jīng)典的單機(jī)游戲作弊方法,同樣也適用于網(wǎng)頁(yè)游戲,原因很簡(jiǎn)單,不可能每個(gè)來(lái)自客戶端的數(shù)據(jù),服務(wù)端都做驗(yàn)證。(看看頁(yè)游公司開(kāi)發(fā)前端和后臺(tái)的比例吧!)以社交類(lèi)網(wǎng)頁(yè)游戲?yàn)槔?,其中?huì)內(nèi)嵌不少小游戲,這些小游戲可能是用來(lái)賺取游戲經(jīng)驗(yàn)或貨幣等數(shù)值的,很顯然,這種類(lèi)型的小游戲基本就是主邏輯在客戶端的單機(jī)游戲,只是最后將游戲分?jǐn)?shù)上傳給服務(wù)器,服務(wù)器再根據(jù)游戲分?jǐn)?shù)的不同來(lái)下發(fā)相應(yīng)數(shù)額的游戲貨幣。我們完全可以在積分上傳前,在內(nèi)存中查找并修改該數(shù)值。 如下圖所示,用cheat engine去查找IE進(jìn)程中游戲分?jǐn)?shù)。
(cheat engine是我最喜歡的內(nèi)存修改工具,手游上的內(nèi)存修改工具和這個(gè)比起來(lái)簡(jiǎn)直是胎兒版的。該工具支持自定義格式的內(nèi)存搜索,具備強(qiáng)大的反匯編功能,更妙的是可以直接生成外掛,特別贊的是竟然采用了游戲通關(guān)的方式來(lái)教授工具使用,我的博客中有第八關(guān)于第九關(guān)通關(guān)方法)
程序?qū)崿F(xiàn)一般會(huì)有以下幾個(gè)關(guān)鍵函數(shù)
(1)讀取進(jìn)程數(shù)據(jù)ReadProcessMemory
(2) 查找,查找算法可以按數(shù)值類(lèi)型、掃描類(lèi)型及內(nèi)存掃描方式來(lái)實(shí)現(xiàn)
例如數(shù)值類(lèi)型有二進(jìn)制,1字節(jié),2字節(jié),4字節(jié)(游戲最常用),8字節(jié),浮點(diǎn)數(shù),雙浮點(diǎn)數(shù),文本,字節(jié)數(shù)組,自定義(這個(gè)最牛);
例如掃描類(lèi)型可以支持精確查找,模糊查找(比...大,比...小,兩者之間),數(shù)值變化趨勢(shì)(數(shù)值處于增加中,數(shù)值出于減少中,數(shù)值沒(méi)有變動(dòng),與首次掃描數(shù)值相同,數(shù)值增加了某個(gè)指定值,數(shù)值減少了某個(gè)指定值);
例如內(nèi)存掃描方式有自定義掃描起始與終止地址,同時(shí)掃描只讀內(nèi)存,深度掃描,快速掃描,掃描時(shí)暫停游戲
(3)寫(xiě)數(shù)據(jù)WriteProcessMemory
內(nèi)存修改的防御,有以下幾種建議:
(1)重要數(shù)值在內(nèi)存中拆分存放,使其無(wú)法簡(jiǎn)單定位到(會(huì)使得游戲邏輯變復(fù)雜)
(2)默認(rèn)可以修改,在服務(wù)端控制收益上線。(考慮到成本,為目前主流控制方法)#p#
四、存檔安全:存檔修改
在flas在flash單機(jī)游戲時(shí)代,修改本地存檔文件,是游戲作弊的重要方式,相信有不少人就用過(guò)Flash存檔修改器。
隨著頁(yè)游興起到現(xiàn)在的頁(yè)游繁盛,依賴于存檔進(jìn)行邏輯判斷的設(shè)計(jì)減少了,但這塊也不能完全忽略掉??倳?huì)有一些功能是需要調(diào)用本地存檔的。例如登錄模塊中,記住密碼功能,會(huì)將密碼信息存儲(chǔ)在本地,以IE瀏覽器為例,在C:\Documents and Settings\(你的Windows用戶名)\Application Data\Macromedia \Flash Player\#SharedObjects\(一些隨機(jī)數(shù)字和字母)\ 文件夾下就可以看到存儲(chǔ)密碼的SOL文件,可以使用minerva工具查看,如下圖所示,密碼明文明文存儲(chǔ)的,SOL文件是永久性保存的,除非手動(dòng)清除,如果玩家在公共環(huán)境下登錄,就會(huì)有盜號(hào)威脅。
也有些開(kāi)發(fā)意識(shí)到了這個(gè)問(wèn)題,而采用加密存儲(chǔ)方式,一般采用md5(其實(shí)md5不是真正的加密算法)。md5解密的在線網(wǎng)站非常多,如下圖所示,密碼通過(guò)兩次md5后存儲(chǔ),我們可以在http://www.cmd5.com/ 查到。
所以建議存檔加密,采用自定義的加密算法,例如md5后轉(zhuǎn)置再md5,等等。#p#
五、帳號(hào)安全/充值安全:盜號(hào)/低價(jià)充值
帳號(hào)安全和充值安全不僅頁(yè)游如此,所有游戲,甚至所有線上應(yīng)用都如此。如果說(shuō)開(kāi)是個(gè)大的話題,我僅僅介紹頁(yè)游中常見(jiàn)的威脅與防御。
(一)、帳號(hào)安全
威脅:
1.外掛盜號(hào)
例如下面號(hào)稱可以無(wú)限刷取游戲貨幣的外掛,實(shí)際上在用戶輸入帳號(hào)和密碼后,將信息發(fā)送給盜號(hào)者的郵箱。
2. 社工盜號(hào)
在游戲中獲取信任,以為對(duì)方代練等好處為引誘盜取帳號(hào)?;蛲ㄟ^(guò)獲取個(gè)人信息,從密保問(wèn)題下手進(jìn)行盜號(hào)。
3.從游戲的帳號(hào)管理中心等web入口下手,進(jìn)行盜號(hào)。
例如登錄模塊沒(méi)有驗(yàn)證碼或驗(yàn)證碼實(shí)現(xiàn)機(jī)制漏洞,使用字典掃描批量盜號(hào)
4.傳輸嗅探盜號(hào)
5.利用帳號(hào)申訴流程漏洞進(jìn)行盜號(hào)
例如有些申訴打分機(jī)制存在提供多次充值證明就可以取回密碼的方式,先充值,再盜號(hào)。
防御:
1.安全意識(shí)宣傳
2.弱口令檢測(cè)
3.異地登錄提醒
4.登錄行為監(jiān)控
5.設(shè)計(jì)好帳號(hào)相關(guān)功能,例如申訴流程
(二)、充值安全
威脅:
1.社工
在網(wǎng)上發(fā)帖慌稱發(fā)現(xiàn)充值漏洞,騙取貪心網(wǎng)友給自己指定的帳號(hào)進(jìn)行充值
2.利用手機(jī)充值漏洞
使用快過(guò)期的手機(jī)廢卡進(jìn)行充值,大多數(shù)的充值不會(huì)再次檢測(cè)手機(jī)卡是否存活狀態(tài)
3.利用寬帶充值漏洞
盜取寬帶帳號(hào)進(jìn)行充值,由于不會(huì)實(shí)際影響游戲收益,頂多會(huì)出現(xiàn)受害者損失嚴(yán)重的情況下投訴帶來(lái)的不好影響。
4. 真正的充值漏洞
比如說(shuō)廣泛采用的點(diǎn)卡充值,可能存在點(diǎn)卡被重放使用的漏洞
防御:
1.安全意識(shí)宣傳
2.充值相關(guān)功能的安全檢測(cè)
結(jié)論
總的來(lái)說(shuō),頁(yè)游的各種外掛問(wèn)題很普遍,端游有的它都有,但安全防御不如端游,這很大程度上是因?yàn)轫?yè)游的開(kāi)發(fā)周期短,生存周期也短,例如較長(zhǎng)的神仙道游頁(yè)才兩年了,甚至大多數(shù)頁(yè)游,只是為了短時(shí)間洗用戶搶錢(qián),因此不會(huì)投入人力物力在外掛防御方面,或許第三方的安全服務(wù)會(huì)有點(diǎn)市場(chǎng)吧,比如說(shuō)他們樂(lè)意購(gòu)買(mǎi)支持多項(xiàng)目的AS混淆工具??傊?,頁(yè)游是個(gè)浮躁的市場(chǎng),只有生命周期強(qiáng)大的游戲,才會(huì)注意到外掛問(wèn)題。





































