游戲外掛一般出現(xiàn)在幾種人手里,一種是內(nèi)部人員沥寥,這類人是最了解游戲的正蛙,寫出的外掛又穩(wěn)定又不會(huì)被檢測(cè)出來(lái)被封號(hào)。一種是專業(yè)寫外掛的程序員营曼,寫外掛對(duì)于他們來(lái)說乒验,輕車熟路。還有一種就是大佬蒂阱,隨便研究就能寫出外掛的锻全。
處理游戲外掛,我接觸過的如下簡(jiǎn)單幾種方法录煤。
合法客戶端驗(yàn)證鳄厌,大多數(shù)游戲都是使用tcp這種可靠的面向連接的協(xié)議。那么我們?cè)诮⑵疬B接后對(duì)客戶端進(jìn)行合法驗(yàn)證妈踊,如果此客戶端是非法客戶端了嚎,那么直接關(guān)閉此連接即可。
當(dāng)時(shí)我做的比較簡(jiǎn)單。服務(wù)器生成一個(gè)加密的數(shù)據(jù)包歪泳,發(fā)給客戶端萝勤,客戶端解密了之后在發(fā)上來(lái),服務(wù)器做驗(yàn)證呐伞,具體詳細(xì)做法此處不再細(xì)講敌卓。
序列化協(xié)議。因?yàn)橛械娜怂窃谟媚愫戏ǖ目蛻舳嗽诘顷懹螒蛄媲猓词刮覀兊臄?shù)據(jù)包經(jīng)過壓縮打包之后趟径。內(nèi)容相同的數(shù)據(jù)包,最后的二進(jìn)制串是相同的癣防。這樣細(xì)心的人比較容易發(fā)現(xiàn)我們這個(gè)數(shù)據(jù)包是干嘛的蜗巧?他們可以試用wpe這類的工具截獲我們的數(shù)據(jù)包修改之后并重新發(fā)給服務(wù)器,這樣也能夠高效率的操作蕾盯。
對(duì)于這種情況幕屹,第一種方案可以采用序列化協(xié)議,就是我給每一個(gè)協(xié)議加一個(gè)id刑枝。這樣只有合法的客戶端知道真實(shí)的id是什么香嗓?這樣子你靠wpe這類的工具自動(dòng)化給服務(wù)器發(fā)協(xié)議,基本不可能装畅,除非你手工修改協(xié)議包或者另外寫程序修改協(xié)議包靠娱,要能準(zhǔn)確的知道真實(shí)的id,這個(gè)不是一件簡(jiǎn)單的事情掠兄。
另外一種就是對(duì)協(xié)議數(shù)據(jù)包進(jìn)行加密像云,這里如果是對(duì)稱加密的話,意義不大蚂夕。對(duì)稱加密的特點(diǎn)就是相同的內(nèi)容迅诬,加密出來(lái)的數(shù)據(jù)包是一樣的。這里可以試用非對(duì)稱加密婿牍,但是如果使用RSA這種方案侈贷。有點(diǎn)殺雞用牛刀的感覺,而且對(duì)服務(wù)器壓力巨大等脂。
可以自己實(shí)現(xiàn)一套偽非對(duì)稱加密算法俏蛮,只要相同的內(nèi)容,經(jīng)過這套算法加密出來(lái)上遥,最后的數(shù)據(jù)包都不一樣即可搏屑。這樣的做法簡(jiǎn)單,算法可控粉楚。服務(wù)器壓力也不大辣恋,也達(dá)成了我們的目標(biāo)亮垫。
對(duì)于這種偽非對(duì)稱加密算法西雀,可以這樣子做琅攘。我們先實(shí)現(xiàn)套偽隨機(jī)數(shù)生成函數(shù),通過設(shè)置相同的隨機(jī)種子诞挨,經(jīng)過一定次數(shù)的運(yùn)算底靠。服務(wù)器和客戶端生成的隨機(jī)數(shù)是相同的害晦,按照規(guī)則把這些隨機(jī)數(shù)插入到數(shù)據(jù)包中特铝,最后在補(bǔ)齊數(shù)據(jù)包為16的整數(shù)倍即可暑中,這樣子即使數(shù)據(jù)一樣,最后生成的每個(gè)數(shù)據(jù)包都看著不一樣鲫剿,且有很大變化鳄逾。
對(duì)于協(xié)議洪水。
可以這樣子做灵莲,給協(xié)議進(jìn)行計(jì)數(shù)雕凹,同一條協(xié)議,如果發(fā)了太多上來(lái)政冻,那么超過了一定的閥值枚抵,直接丟棄就好。
別整天想著怎么防外掛明场,游戲有人玩了再說吧汽摹。
好好做游戲,加油苦锨。