艾格拉斯张鹏:重度手游防外挂及安全
生活随笔
收集整理的這篇文章主要介紹了
艾格拉斯张鹏:重度手游防外挂及安全
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
艾格拉斯張鵬:重度手游防外掛及安全
圖/文 游戲茶館
前言
? ? ? ? ?2015年1月10日,【問道一線】品牌沙龍第一期,有幸邀請到的艾格拉斯創(chuàng)始人之一、CTO張鵬先生,以《游戲防外掛及安全》為主題,進(jìn)行了近60分鐘的線下分享。在文前,再次向艾格拉斯,及張鵬先生本人表示誠摯的謝意。
? ? ? ? ?張鵬以艾格拉斯自研、自運(yùn)營,2012年7月上線,目前支持8個(gè)語種的重度手游《英雄戰(zhàn)魂》為背景,對游戲安全做以下五個(gè)大類做分享:游戲服務(wù)器防外掛、游戲服務(wù)器防黑、web平臺的api安全、客戶端防外掛和備份。
(注:【問道一線】是游戲茶館和CSDN共同主辦,獨(dú)屬于開發(fā)者的純技術(shù)小型手游分享會,每期一個(gè)主題,根據(jù)主題邀請一線人物獻(xiàn)身說案,講述開發(fā),運(yùn)營中,跳過的那些“坑”。俗稱,開發(fā)純干貨。)
一、游戲服務(wù)器防外掛
1、客戶端的安全和網(wǎng)絡(luò)連接
? ? ? ? ?做ARPG,通信這塊兒是要非常注重安全的,曾經(jīng)我們遇到過,有用戶用截包器把包攔下來了,然后把數(shù)據(jù)改了,再發(fā)過來。其實(shí)現(xiàn)在,在手機(jī)游戲上,之前游戲的外掛、黑客,都能遇到。? ? ? ? 我們在通信這塊兒,是強(qiáng)鏈接,在加密的方式上,你的密鑰不能是固定的,我們使用的是一個(gè)有序的秘鑰,比如,這次我們是“1”,下次是“2”,在下次是“3”……當(dāng)然,這只是舉了一個(gè)例子。
? ? ? ? 這樣做的好處是,一旦你的游戲包被用戶截住以后,他沒有把辦法通過這個(gè)包的秘鑰或固定方式去破解。當(dāng)然,他要是看到了你游戲的原碼或者是分析了代碼的工作方式,那也沒轍。因?yàn)檫@是在客戶端做的事情。
? ? ? ? 更加完整的加密方式,需要非對稱加密。服務(wù)端和客戶端約定一個(gè)鑰匙,這個(gè)鑰匙需要一個(gè)公鑰和次鑰進(jìn)行匹配,通過約定的鑰匙雙方進(jìn)行通信。每個(gè)包在發(fā)送之前,都是用不同的鑰匙加密,每次加密通過錯(cuò)位等方式,將相同數(shù)據(jù)加密的結(jié)果每次都不一樣,這樣他們就很難分析。
? ? ? ? 以前在PC活躍的外掛開發(fā)者,在做手游外掛的時(shí)候,基本是無所不用其極,我們遇到最嚴(yán)重的,是直接把安卓包,直接把里面的SO這個(gè)文件破解,反編譯把其中一個(gè)指令給改了。
? ? ? ?首先第一點(diǎn),在游戲過程中得把大門守好。
2、防加速
? ? ? ? 加速是最影響用戶體驗(yàn)的行為。也是對游戲影響最直接的。之前,《英雄戰(zhàn)魂》也遇到過這樣的問題,有一個(gè)玩家,他發(fā)某一個(gè)技能的頻率就很高,游戲是10秒發(fā)一次,他是1秒發(fā)一次;另外是對其他用戶,兩個(gè)人PK,用戶花的錢比對手多,卻一秒鐘被打死了。? ? ? ? 這個(gè)怎么解決?由客戶端向服務(wù)器,定期的發(fā)一個(gè)數(shù)據(jù)包,這個(gè)包的內(nèi)容是當(dāng)前時(shí)間。這樣子可以做2各方面的事情:一方面是服務(wù)器能根據(jù)包,接收到這個(gè)包的頻率,這個(gè)包發(fā)過來監(jiān)測客戶端,如果加速了,客戶端頻率會升高(當(dāng)然會有一個(gè)誤差值),如果過高我們會給他暗地里記上一筆,如果持續(xù)增高,那么這個(gè)用戶就是在作弊了。還有一種加速是,不改發(fā)包頻率,改客戶端某一個(gè)操作的頻次,提高頻次,服務(wù)器通過頻率沒法解決,可以客戶端的時(shí)間來監(jiān)測。
? ? ? ? 一般加速外掛,不是針對某一游戲設(shè)計(jì)的,是通用的,把整個(gè)系統(tǒng)或者是進(jìn)程的速度提升上來。通過客戶端第一個(gè)包和最后一個(gè)包的時(shí)間差,與服務(wù)器第一個(gè)包和最后一次接受的包的時(shí)間做比較,如果時(shí)間差越來越大,那么這個(gè)玩家就是在作弊。
3、賬號登陸校驗(yàn)
? ? ? ? 賬號登陸系統(tǒng),防止用戶被盜號。有時(shí)候,游戲設(shè)計(jì)者會把用戶名和密碼放在客戶端,如果有些用戶裝著惡意程序,有可能會被盜號,那么驗(yàn)證這一塊兒,主要是防止用戶的密碼在傳輸?shù)倪^程中被盜。比如HTTP在傳輸過程中,密碼傳輸和簡單的加密,都很容易被破解。? ? ? ? 一種方式是,使用HTTPS,現(xiàn)在基本大的網(wǎng)站和安全性比較高的網(wǎng)站,比如淘寶、支付寶這樣子的,登陸都使用的是HTTPS,另一個(gè)就是,采用服務(wù)器與服務(wù)器之間的通信,這個(gè)是可信的,然后為了使傳輸過程中,密碼不泄露,采用了MD5加密(這個(gè)加密是單向加密,只能加不能減),最后匹配這2個(gè)MD5的串兒密碼是不是一樣的。
? ? ? ? 有一個(gè)經(jīng)驗(yàn)給大家分享:如果你用它的密碼,生成了一個(gè)MD5的串兒,那這個(gè)串兒就會永遠(yuǎn)有效,用戶也可以拿著去登陸,這個(gè)是不允許的,所以我們在這個(gè)加密MD5的時(shí)候,讓它加入一個(gè)時(shí)間戳,這個(gè)時(shí)間戳,它不能太精準(zhǔn),太精確會有問題。比如你精確到秒級,服務(wù)器那端也是秒級, 這2個(gè)串兒的驗(yàn)證是通不過的。比如,那個(gè)是3秒加密的,到這邊也需要3秒加密,而實(shí)際上服務(wù)器這邊是變化的,隨著時(shí)間增加,所以把時(shí)間精確到10分鐘以內(nèi)比較合適,再設(shè)置時(shí)把時(shí)間單位精確到毫秒,但把后面6位都填為0,然后它的時(shí)間應(yīng)該在17分鐘左右,往前推17分鐘,往后推17分鐘,這樣產(chǎn)生一個(gè)MD碼,那么就是加密方和匹配方,這2個(gè)只要相差在正負(fù)17分鐘之內(nèi),就是可以驗(yàn)證通過的,這樣就能防止用戶拿著一個(gè)MD5碼就去登陸。
4、關(guān)鍵數(shù)據(jù)服務(wù)器校驗(yàn)
? ? ? ? ?關(guān)鍵數(shù)據(jù)(如技能CD、走路速度及距離)服務(wù)器校驗(yàn),防止技能加速,瞬移,穿墻。部分采信客戶端,關(guān)鍵數(shù)據(jù)以服務(wù)器為基準(zhǔn)。戰(zhàn)斗數(shù)值以服務(wù)器為準(zhǔn)。? ? ? ? ?游戲過程中如果用戶采用加速或者是修改客戶端的形式,使一些關(guān)鍵數(shù)據(jù),比如發(fā)招的頻率發(fā)生改變的時(shí)候,你不能無所事事了,這時(shí)候你需要去做一個(gè)校驗(yàn),允許這個(gè)大招每10秒才能發(fā)送一次,那么我就記下,把這個(gè)招的上次發(fā)生的時(shí)間和這次發(fā)生的時(shí)間,考慮網(wǎng)絡(luò)傳輸?shù)臅r(shí)間差(需要有一定誤差允許),比如你在7、8秒發(fā)過來我也是允許的,但是你要是在5秒或者是更短的時(shí)間發(fā)過來,就不被允許了。你可以發(fā),但是不會生效,就像某個(gè)人打了一拳過去,但是并沒有少血。
? ? ? ? 有時(shí)候,你判定太嚴(yán)的話,用戶有時(shí)候真的是因?yàn)槭蔷W(wǎng)絡(luò)原因傳輸速度的問題,導(dǎo)致用戶被踢下線了,打電話過來質(zhì)問客服。以前,客服就有被罵哭的。其實(shí),我們在驗(yàn)證的時(shí)候,不能太嚴(yán),如果多次被記錄有違規(guī)的情況,給他再做進(jìn)一步處理。
? ? ? ? 主要是說,服務(wù)器端對一些關(guān)鍵性的東西,要做一些校驗(yàn),并且這個(gè)在計(jì)算過程中,以服務(wù)器為準(zhǔn),目前,我們公司的游戲,大多所有戰(zhàn)斗、傷害數(shù)值等有關(guān)的數(shù)值,都是以服務(wù)器產(chǎn)生的,在最多的時(shí)候,服務(wù)端會說,我打到誰了,服務(wù)端會驗(yàn)證,可不可能打得著。戰(zhàn)斗過程的傷害這些,全是由服務(wù)器來計(jì)算的??蛻舳?#xff0c;作為一個(gè)表現(xiàn),來反饋給用戶。
5、監(jiān)控指令發(fā)送頻率
? ? ? ? 這個(gè)監(jiān)控指令的發(fā)送頻率,跟剛才那個(gè)是有關(guān)系的,某一些指令你發(fā)送過于頻繁的話呢,會導(dǎo)致這個(gè)游戲失去平衡,用戶在它那兒,只要對他有利的,任何辦法,他都可能用得上,所以,是需要監(jiān)控某一些指令的發(fā)送頻率。? ? ? ? 為什么單列出這一點(diǎn),是有一些指令它其實(shí)發(fā)送頻率本來就很高,有一些是每秒甚至每500毫秒發(fā)一次,所以你在校驗(yàn)的時(shí)候,很難在2個(gè)指令之間判定是否符合條件,因?yàn)榫W(wǎng)稍微卡一下,200毫秒就過去了,如果這個(gè)技能是500毫秒的話,它已經(jīng)超過一半了,所以很難。所以,統(tǒng)計(jì)一段時(shí)間之內(nèi)的平均發(fā)送頻率,這樣最終能夠判定這個(gè)用戶是否真正在作弊。一段時(shí)間之內(nèi)平均發(fā)送時(shí)間超過了一半,那么就是有問題的。
? ? ? ? 那么,當(dāng)我們監(jiān)測到用戶可能在作弊的時(shí)候,我們就讓客戶端發(fā)回來這個(gè)用戶的進(jìn)程列表,然后通過這些進(jìn)程列表,配置了已知的外掛的進(jìn)程名字,因?yàn)槭澜缟贤鈷旆浅6?#xff0c;有些用戶可能自己開發(fā)了一個(gè)外掛,所以,只能對已知的比較知名的,去比較監(jiān)測,如果說有大量的用戶反饋,某一個(gè)用戶在作弊,然后我們會調(diào)出來他的進(jìn)程列表,看是否有可疑。比如,如果有一個(gè)人在每次被反映他在作弊的時(shí)候,都有一個(gè)進(jìn)程,并且這個(gè)進(jìn)程是未知的,不知道是干嘛的,那就比較可疑了。那么,這件事情,就變成人工的了。
二、游戲服務(wù)器防黑
? ? ? ?當(dāng)游戲相對市場來說,用戶比較多的時(shí)候,黑客就有利可圖。1、操作系統(tǒng)最小化安裝
? ? ? ? 首先,很多公司都是用linux,用windows很少了。在裝的時(shí)候,最小化安裝,然后開放的服務(wù)和端口最少,只把我們需要的應(yīng)用端開了,其他的端口都關(guān)著。因?yàn)?#xff0c;有些應(yīng)用它有漏洞,如果你沒有專業(yè)的技術(shù)去處理這些問題,很有可能他就從某一個(gè)漏洞進(jìn)來了。
2、 遠(yuǎn)程操作限制
? ? ? ? 然后,我們一般是用SSH去登陸遠(yuǎn)程的計(jì)算機(jī),還有呢我們的mysql端口,這些面向公網(wǎng)開放的話,是很不安全的,后來呢我們利用ss5代理登陸ssh,mysql,所有游戲服務(wù)器,采用遠(yuǎn)程終端管理系統(tǒng)進(jìn)行管理,服務(wù)器自上架后,所有的管理操作由此系統(tǒng)完成,管理系統(tǒng)單點(diǎn)登錄,僅開放一個(gè)服務(wù)端口,有效防止黑客入侵。對操作者來說是一樣的。當(dāng)然,如果公司比較有錢,可以搞一個(gè)硬件防火墻。? ? ? ?ss5代理服務(wù)器安全,啟用SSH證書登錄驗(yàn)證,禁止root密碼登陸方式。這樣,可以防止密碼泄露的情況下被黑。
3、GM遠(yuǎn)程操作限制
? ? ? ? 另外一個(gè),遠(yuǎn)程操作限制。最早的時(shí)候,有用戶切入到系統(tǒng)里面來了,拿到了我們GM工具,這是給客服用戶,它拿到這個(gè)東西以后,開始給別人加錢,在淘寶上賣,賣磚石,賣代幣這種形式來串改游戲數(shù)據(jù)。后來,我們在這塊兒加入了一個(gè)用戶驗(yàn)證信息,以服務(wù)器到服務(wù)器的通信形式。現(xiàn)在登陸的這個(gè)用戶是否是合法的。4、應(yīng)用啟動權(quán)限
? ? ? ? 在服務(wù)器上,起應(yīng)用的時(shí)候,千萬不用root,我們最早那波被入侵的時(shí)候,就是因?yàn)槲覀兊膉ava應(yīng)用或者是服務(wù)什么,都是以root來啟動,然后黑客一旦進(jìn)來以后,什么都看見了,最后把所有的系統(tǒng)整理以后,不能以root方式啟動,必須給他創(chuàng)建一個(gè)新的用戶, 然后用那個(gè)用戶啟動,并且那個(gè)用戶,只對那個(gè)文件夾或某一個(gè)應(yīng)用生效,要不然就很危險(xiǎn)。5、數(shù)據(jù)庫管理
? ? ? ?mysql用戶權(quán)限分離:root,操作用戶,游戲用戶數(shù)據(jù)庫的密碼文件采用多次加密方式,系統(tǒng)內(nèi)不存在明文密碼。并且數(shù)據(jù)庫密碼周期性的更新。防止侵入后,數(shù)據(jù)庫密碼泄露。? ? ? ?把操作用戶分離,跟系統(tǒng)這塊創(chuàng)建新的用戶來運(yùn)行是一樣的道理。就是不能把root開放給游戲或者是很多的人。最后,就是系統(tǒng)內(nèi)核、數(shù)據(jù)庫、jdk及時(shí)升級或打補(bǔ)丁。
?案例1:
? ? ? ? 早期,因沒有啟用socks5單點(diǎn)登陸服務(wù)器,服務(wù)應(yīng)用采用root啟動,僅使用iptables來限制,遭到了黑客入侵,利用服務(wù)漏洞進(jìn)入我們服務(wù)器,并安裝木馬代碼塊,利用“中國菜刀” 遠(yuǎn)程登陸入侵。? ? ? ? 這個(gè)叫“中國菜刀”的黑客工具,入侵進(jìn)來以后,在我們一個(gè)HTTP的一個(gè)服務(wù)器上,掛了這個(gè)東西。這實(shí)際上是一個(gè)很簡單的PHP/JSP 的一個(gè)網(wǎng)頁,但他能通過這個(gè)網(wǎng)頁做很多事情。它獲取到GM工具以后,拿到了比較高權(quán)限的用戶密碼,把號盜走了。
案例2
? ? ? ? ?早期,黑客利用專有g(shù)mtool工具入侵游戲服務(wù)端修改數(shù)據(jù)? ? ? ? ?解決辦法,啟用了認(rèn)證服務(wù)器,服務(wù)器應(yīng)用https服務(wù),采用s2s通信,避免入侵及損失。
三、web平臺的api安全
? ? ? ?通常web平臺的安全主要指通行證驗(yàn)證系統(tǒng),充值系統(tǒng)服務(wù)端,渠道sdk服務(wù)端。1、應(yīng)用服務(wù)器管理功能限制
? ? ? ? 應(yīng)用服務(wù)器(Glassfish)的管理端口只允許ss5代理服務(wù)器的IP訪問;應(yīng)用服務(wù)器使用非root用戶啟動,以防止黑客入侵成功后獲得操作系統(tǒng)的控制權(quán)限,并通過iptables的端口轉(zhuǎn)發(fā)功能,將對80端口的請求轉(zhuǎn)發(fā)至應(yīng)用服務(wù)器提供服務(wù)的端口;? ? ? ? 對游戲服務(wù)器或渠道方訪問的API接口(如:充值回調(diào))設(shè)置了IP白名單;我們公司使用的是一個(gè)Glassfish集群提供的一些充值等服務(wù),他的管理端口不能對公眾開放,必須使用單點(diǎn)登陸的方式去訪問,使用非root啟動,少開端口,對一些比較特別的IP使用白名單,Ip白名單,比如說:充值回調(diào)。百度、360等渠道告訴我們這個(gè)游戲充值成功了的時(shí)候,只允許它個(gè)別的IP來訪問,不允許公眾來訪問。
2、密碼別名
? ? ? ?在應(yīng)用服務(wù)器內(nèi)配置需要使用密碼的資源時(shí)(如:數(shù)據(jù)庫連接池),通過應(yīng)用服務(wù)器提供的密碼別名功能,隱藏?cái)?shù)據(jù)庫賬號的明文密碼。? ? ? ?當(dāng)部署的應(yīng)用需要使用數(shù)據(jù)庫資源時(shí),只需將別名注入到應(yīng)用中,應(yīng)用只能獲得數(shù)據(jù)庫連接,無法獲取到數(shù)據(jù)庫賬號。
?防止在開發(fā)過程中,數(shù)據(jù)庫還有一些其他的密碼泄露。解決密碼以明文方式顯示。
3、數(shù)據(jù)庫限制
? ? ? 為應(yīng)用分配賬號時(shí),創(chuàng)建獨(dú)立的表空間,且只對此賬號可見,同時(shí)收回賬號對表、表索引、存儲過程、函數(shù)的刪除權(quán)限
四、客戶端防外掛
1、資源檢測機(jī)制
? ? ? ? 由于限制了其他作弊方式,玩家中通過修改客戶端的資源來使某些值變化,比如速度值,技能cd等。? ? ? ?檢測客戶端資源文件md5,報(bào)告給服務(wù)器做驗(yàn)證。
2、內(nèi)存數(shù)據(jù)混淆和修改
? ? ? ?關(guān)鍵數(shù)據(jù)內(nèi)存混淆已及修改檢測,玩家位移,玩家位置的檢測,跟客戶端的關(guān)鍵數(shù)據(jù)內(nèi)存混淆相結(jié)合,關(guān)鍵數(shù)據(jù)傳送服務(wù)器校驗(yàn),位移位置數(shù)據(jù),有效防止玩家穿墻,加速,瞬移等作弊手段。? ? ? ?有些用戶用瘋狗還有其他內(nèi)存修改器,去改游戲運(yùn)行過程當(dāng)中的數(shù),當(dāng)然怎么改,通過不同的匹配數(shù),改一下匹配一下,改一下匹配一下,最后查找到這個(gè)位置是血,然后把它鎖定成10萬,永遠(yuǎn)不死的。改了以后,再去和別人PK,把血鎖定,就永遠(yuǎn)不會死。怎么解決?一個(gè)是我通過要服務(wù)器去驗(yàn)證,另外一個(gè)在客戶端,在制作的時(shí)候,把關(guān)鍵數(shù)據(jù)在內(nèi)存里面混淆。
? ? ? 在內(nèi)存里不是以一個(gè)通常的數(shù)字放在里面,而是經(jīng)過加密,用戶是找不著這個(gè)數(shù)的,普通的用戶不能通過內(nèi)存修理器去改這個(gè)數(shù)據(jù)。
3、文本資源加密
? ? ? ? 通過可逆的加密算法,加密敏感的文本資源,使用戶不能通過簡單的二進(jìn)制查看得到具體的內(nèi)容。? ? ? ?這個(gè)通常不會對游戲平衡性產(chǎn)生影響,但是也不好。從公司出去的東西,不讓用戶改,自定義改變格式,用戶就不可以用一些普通的方式去竄改。
? ? ? ? 數(shù)據(jù)庫,主從要分離。當(dāng)你的用戶量很大的時(shí)候,主庫寫,從庫讀。主庫不要做統(tǒng)計(jì)功能,比如你要看日活多少,3天內(nèi)登錄多少,不要在主庫上去做,在從庫上去做,這樣不影響主庫服務(wù)用戶。以前,我們嘗試過半夜3點(diǎn)鐘去做這些統(tǒng)計(jì),但還是有一會兒用戶就登不上。
? ? ? ? 然后把二進(jìn)制LOG打開,防止在極端的情況下,回檔。有時(shí)候,硬件壞了的情況,數(shù)據(jù)配置錯(cuò)了,刷錢,刷物品等。把這些工作做好了,你想恢復(fù)到幾點(diǎn)幾分,都能恢復(fù)過去。我們一般是保存10天。
? ? ? ? 每一天有一個(gè)備份,這個(gè)東西是實(shí)時(shí)的,這個(gè)是冷備,我可以從某一天備份的時(shí)間,和編LOG的時(shí)間。每次大家在更新之前,一定要備份,防止策劃、程序上的一些BUG,導(dǎo)致用戶在上去以后把數(shù)據(jù)搞亂了。
? ? ? ?服務(wù)器最好用raid,我們主要的數(shù)據(jù)庫呢都是用raid10,一個(gè)是速度快,另外是它安全性很高。
后記
? ? ? ? 分享這些,是希望大家提一個(gè)概念性的東西,知道哪些地方有坑,因?yàn)槲覀冏雒恳患r(shí)間、人力和金錢的成本。遇到安全性問題,一定要馬上解決,因?yàn)橛脩舻男判姆浅V匾?#xff0c;如果用戶信心崩塌了,你這個(gè)游戲基本就走不遠(yuǎn)了。今天,我對我們遇到了哪些坑兒,是怎么解決的分享,就到這兒。謝謝。
總結(jié)
以上是生活随笔為你收集整理的艾格拉斯张鹏:重度手游防外挂及安全的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虎嗅 24 小时点赞器,一个案例附带一个
- 下一篇: 工作汇报ppt案例_职场PPT实战:秒杀