游戏外挂是怎么炼成的
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
本人曾經(jīng)幫朋友開發(fā)了一款DNF外掛程序,其重要功能是使用賬戶列表中的用戶名密碼自動(dòng)登錄DNF,后面的事情交給按鍵精靈完成。
外掛是一條黑色產(chǎn)業(yè)鏈,由于騰訊的保護(hù)程序相當(dāng)強(qiáng)悍,如今要做出一個(gè)外掛將非常困難。外掛是怎么贏利的?很多人了解的模式是直接把外掛賣給需要外掛的人。而在本例中,外掛的作用是給那些機(jī)器自動(dòng)代打,獲取游戲幣,再通過渠道將游戲幣換成人民幣。運(yùn)行這些代打機(jī)器的作坊有一個(gè)專用的名稱叫“工作室”。當(dāng)然此工作室非彼工作室。這些工作室會(huì)購(gòu)買最廉價(jià)的電腦,每臺(tái)電腦可以同時(shí)運(yùn)行幾個(gè)對(duì)系統(tǒng)要求不高的游戲,24小時(shí)不間斷自動(dòng)代打,雖然有的游戲會(huì)限制在線時(shí)間,但是由于賬號(hào)眾多,可以輪番使用。這些賬號(hào)從哪里來的?有一批人專門會(huì)養(yǎng)號(hào),然后再賣給工作室。
在早期,游戲知名度比較低的情況下,游戲廠商希望有更多的人氣,所以對(duì)工作室的行為是睜一只眼閉一只眼。
言歸正傳,要實(shí)現(xiàn)自動(dòng)登錄DNF,需要以下幾個(gè)步驟
這些功能都沒有什么太多技術(shù)含量,前期使用MFC開發(fā),為了開發(fā)方便,后面就轉(zhuǎn)成WPF實(shí)現(xiàn)。
守護(hù)程序除了上述正常流程外,還有日志記錄,通過郵件發(fā)送,自動(dòng)重啟等功能。
自動(dòng)登錄
外掛主程序用到了一個(gè)大名鼎鼎的大漠插件,而且使用該插件需要付費(fèi)。付費(fèi)后會(huì)給你一個(gè)dll文件。
首先,我們需要從配置文件中讀取游戲大區(qū)數(shù)據(jù),然后我們需要注冊(cè)大漠插件dm.reg()。
然后,通過調(diào)用dm.find_wnd函數(shù)查找游戲主窗口。找到后需要綁定主窗口,方便使用按鍵精靈進(jìn)行自動(dòng)點(diǎn)擊游戲中的區(qū)域。
狀態(tài)自動(dòng)機(jī)
在自動(dòng)登錄的過程中,有些流程會(huì)有所變化,比如可能會(huì)彈出輸入驗(yàn)證碼窗口,還有就是每一個(gè)步驟需要等待一個(gè)不確定的動(dòng)畫等。所以就使用了狀態(tài)自動(dòng)機(jī)去做。提前設(shè)置好每一種狀態(tài)在遇到特定動(dòng)作的時(shí)候進(jìn)入某一個(gè)下一個(gè)狀態(tài)。
確定當(dāng)前步驟
如何確定當(dāng)前畫面中是否有輸入框呢? 這就要用到dm的圖片匹配功能。我們事先將游戲畫面中有特征的畫面截取一小部分,作為判斷依據(jù)。例如判斷是否是選擇大區(qū)的狀態(tài)。則用提前準(zhǔn)備的截圖去匹配屏幕。
總體流程就是,選擇服務(wù)器->選擇大區(qū)->輸入用戶名密碼->登錄成功。
驗(yàn)證碼自動(dòng)輸入
有時(shí)候登錄的時(shí)候會(huì)彈出輸入驗(yàn)證碼,這驗(yàn)證碼很變態(tài),是四個(gè)輪流閃爍的圖。機(jī)器肯定無(wú)法識(shí)別。這時(shí)候就誕生了產(chǎn)業(yè)鏈中的另外一環(huán),就是人工識(shí)別驗(yàn)證碼。 在某個(gè)偏遠(yuǎn)的地區(qū),公司雇傭一堆平時(shí)沒事做的大媽,盯著屏幕發(fā)送過來的驗(yàn)證碼,人工識(shí)別然后把驗(yàn)證碼打入消息框傳回外掛程序中,程序再用按鍵精靈去打入驗(yàn)證碼框中。 這個(gè)服務(wù)也需要付費(fèi)的。所以外掛也是需要付出成本的。利潤(rùn)會(huì)分配的產(chǎn)業(yè)鏈中的各個(gè)環(huán)節(jié)。
避免被騰訊保護(hù)程序查殺
騰訊的保護(hù)程序——DProtector會(huì)隨著游戲的啟動(dòng)而啟動(dòng),不可以被殺,否則游戲不會(huì)正常運(yùn)行。這個(gè)保護(hù)程序可以監(jiān)控進(jìn)程列表中的可疑程序,并阻止可疑程序的執(zhí)行。那么如何才能避免被它發(fā)現(xiàn)呢?這就需要用到流氓軟件360使用的技術(shù)了——驅(qū)動(dòng)級(jí)編程!
進(jìn)程保護(hù)驅(qū)動(dòng)程序
驅(qū)動(dòng)程序的權(quán)限很高,可以訪問系統(tǒng)內(nèi)核,而普通程序則不行。所以很多計(jì)算機(jī)病毒都是驅(qū)動(dòng)級(jí)的程序,查殺比較困難,普通的操作無(wú)法清除。 使用visual studio 開發(fā)windows驅(qū)動(dòng)的時(shí)候,需要安裝WindowsKernelModeDriver8.1 工具集。配置類型選擇Driver。最后我們會(huì)生成一個(gè)sys文件。 在內(nèi)核驅(qū)動(dòng)中,我們可以偵測(cè)到對(duì)進(jìn)程的所有的操作,我們可以篩選出需要保護(hù)的進(jìn)程,當(dāng)遇到諸如掛起進(jìn)程,終止進(jìn)程之類的操作的時(shí)候,我們可以攔截,這樣就無(wú)法終止該進(jìn)程了。
進(jìn)程保護(hù)進(jìn)階
還有更為變態(tài)的方法,就是修改系統(tǒng)的SSDT表。
ssdt全稱為System Services Descriptor Table,中文為系統(tǒng)服務(wù)描述符表,ssdt表就是把ring3的Win32 API和ring0的內(nèi)核API聯(lián)系起來。SSDT并不僅僅只包含一個(gè)龐大的地址索引表,它還包含著一些其它有用的信息,諸如地址索引的基地址、服務(wù)函數(shù)個(gè)數(shù)等。
#pragma pack(1) //SSDT表的結(jié)構(gòu) typedef struct ServiceDescriptorEntry {unsigned int *ServiceTableBase;unsigned int *ServiceCounterTableBase; //Used only in checked buildunsigned int NumberOfServices;unsigned char *ParamTableBase; }ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t; #pragma pack()__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable; //變量名是不能變的,因?yàn)槭菑耐獠繉?dǎo)入 //這個(gè)是查詢某個(gè)函數(shù)的地址的一個(gè)宏 #define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)_function+1)]我們可以定義一個(gè)自己的函數(shù),然后修改地址,讓系統(tǒng)調(diào)用API的時(shí)候調(diào)用我們自己的函數(shù)。
//修改 ZwOpenProcess 函數(shù)地址OldZwOpenProcess = (ZWOPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess));(SYSTEMSERVICE(ZwOpenProcess)) = NewZwOpenProcess; NTSTATUS NewZwOpenProcess(OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL) {//用來替換的新函數(shù)NTSTATUS nStatus = STATUS_SUCCESS;if ((long)ClientId->UniqueProcess == pid){DbgPrint("保護(hù)進(jìn)程 PID:%ld\n", pid);return STATUS_ACCESS_DENIED;}//剩下的交給我們的原函數(shù)nStatus = OldZwOpenProcess(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);return STATUS_SUCCESS; }驅(qū)動(dòng)程序安裝程序
驅(qū)動(dòng)程序?qū)懞昧?#xff0c;我們還需要一個(gè)安裝程序去安裝這個(gè)驅(qū)動(dòng)程序。這個(gè)也沒啥技術(shù)含量,就是一個(gè)自動(dòng)化的過程,包括啟動(dòng)驅(qū)動(dòng)程序注冊(cè)好的系統(tǒng)服務(wù),還有卸載功能。
反外掛
游戲公司的反外掛和外掛之前就如同病毒和殺毒軟件一樣,是一個(gè)道高一尺魔高一丈的過程,上使用的這些手段,早已不是什么新鮮玩意兒了。這場(chǎng)較量會(huì)一直持續(xù)下去,希望國(guó)家在這方面的法律能夠不斷健全,消滅灰色、黑色產(chǎn)業(yè)鏈,讓大家有一個(gè)健康的市場(chǎng)環(huán)境,把智慧用到正途上。
轉(zhuǎn)載于:https://my.oschina.net/langhuihui/blog/2245442
總結(jié)
以上是生活随笔為你收集整理的游戏外挂是怎么炼成的的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV-Python入门教程7-P
- 下一篇: Node.js模块以及模块加载机制