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