国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

對(duì)反游戲外掛技術(shù)的思考及實(shí)現(xiàn)

wangtdgoodluck / 3559人閱讀

摘要:內(nèi)部調(diào)用外掛使用逆向技術(shù)分析出游戲內(nèi)部的匯編代碼,把里面對(duì)游戲玩家有利的函數(shù)作為外掛的實(shí)現(xiàn)功能。檢測(cè)代碼段在游戲沒有運(yùn)行之前,修改添加或刪除文件的二進(jìn)制信息可以起到修改程序流程的作用,從而起到外掛的作用。

前言

現(xiàn)如今,有很多游戲外掛軟件,它們可以修改游戲顯示的數(shù)據(jù)和內(nèi)部代碼,來達(dá)到謀取利益的目的。在實(shí)現(xiàn)反外掛技術(shù)前,我先介紹一下常見的三種外掛:
1.模擬類外掛:該外掛可以說是最早的外掛了,它是往游戲發(fā)送偽造的按鍵消息來模擬人的手工操作。實(shí)現(xiàn)的思路為:

1.在Ring3層使用SendMassage、PostMassage、keybd_event、mouse_event等向消息隊(duì)列中發(fā)送按鍵消息

2.使用回調(diào)函數(shù)KeyboardClassServiceCallback和MouseClassServiceCallback往類驅(qū)動(dòng)輸入摁鍵消息。

?2.內(nèi)部Call調(diào)用外掛:使用逆向技術(shù)分析出游戲內(nèi)部的匯編代碼,把里面對(duì)游戲玩家有利的函數(shù)作為外掛的實(shí)現(xiàn)功能。實(shí)現(xiàn)的思路為:

1.使用逆向工具,去除殼和里面的反調(diào)試功能

2.分析游戲的使用過程、玩家自身的信息、背包信息、敵人信息等

3.逆向分析出游戲的明文發(fā)包功能

4.根據(jù)游戲的明文發(fā)包函數(shù)和報(bào)文信息分析游戲內(nèi)部功能實(shí)現(xiàn)的函數(shù)

?3.脫機(jī)外掛:分析出游戲客戶端和服務(wù)端之間的通信邏輯,使用自己發(fā)送和接受數(shù)據(jù)來跟服務(wù)端進(jìn)行交互。實(shí)現(xiàn)的思路如下:

1.使用逆向工具,去除殼和里面的反調(diào)試功能

2.逆向分析游戲中的匯編代碼,分析出加解密算法及各種資源信息

3.分析出登錄封包,獲取各種跟游戲相關(guān)的信息

4.整合尋路算法,實(shí)現(xiàn)掛機(jī)

保護(hù)call函數(shù)和基址數(shù)據(jù)

1.最近玩植物大戰(zhàn)僵尸和連連看等游戲的時(shí)候發(fā)現(xiàn),這些游戲需要通過啟動(dòng)程序才能正常運(yùn)行,那么我突發(fā)奇想,如果在程序運(yùn)行前,修改游戲中的部分代碼段數(shù)據(jù),等需要運(yùn)行游戲時(shí)再通過另一個(gè)程序恢復(fù)代碼段數(shù)據(jù),那么就可以起到保護(hù)游戲的作用。

2.對(duì)于游戲外掛制作者,他們經(jīng)常習(xí)慣性的使用OD工具和CE工具、ida工具等,找出游戲的基址數(shù)據(jù)(也為全局變量)和內(nèi)部call,然后修改基址數(shù)據(jù)或者修改執(zhí)行流程,調(diào)用內(nèi)部call。那么在游戲運(yùn)行前就對(duì)基址數(shù)據(jù)地址和某些call后接地址進(jìn)行修改,等需要運(yùn)行游戲時(shí),再修改回基址地址和call調(diào)用的地址,就可以起到反外掛的作用。

3.接下來,介紹一下這樣做的作用:

4.簡(jiǎn)單介紹一下實(shí)現(xiàn)的流程:

1.讀取PE文件信息到內(nèi)存中,遍歷PE文件中的代碼段,找到函數(shù)頭部地址和使用的全局變量地址;

2.在代碼段中,找出調(diào)用函數(shù)的call指令,把call后接地址進(jìn)行修改,對(duì)于數(shù)據(jù),找到使用全局變量的mov指令,修改地址操作數(shù);

3.運(yùn)行時(shí),使用CreateProcess函數(shù)創(chuàng)建線程并掛起,然后恢復(fù)代碼段中的數(shù)據(jù)并運(yùn)行進(jìn)程

5.我開發(fā)了一款反游戲外掛工具(該工具及其源碼可在文章末尾下載)來模擬這個(gè)過程,在文件選擇框選擇要保護(hù)的PE文件,把需要保護(hù)的函數(shù)及數(shù)據(jù)添加到左邊欄中,執(zhí)行保護(hù)時(shí),在PE文件目錄下會(huì)生成已保護(hù)的PE文件,點(diǎn)擊運(yùn)行時(shí),就能正常運(yùn)行。

檢測(cè)代碼段

1.在游戲沒有運(yùn)行之前,修改、添加或刪除PE文件的二進(jìn)制信息可以起到修改程序流程的作用,從而起到外掛的作用。實(shí)現(xiàn)的技術(shù)有:在代碼段的空白區(qū)域添加"洞穴代碼",修改OEP的值,讓程序跳轉(zhuǎn)到洞穴代碼;使用Inline HOOK執(zhí)行外掛功能函數(shù);修改代碼段中的跳轉(zhuǎn)指令和call后接地址,執(zhí)行游戲內(nèi)部匯編指令或者調(diào)動(dòng)內(nèi)部call等

2.在游戲運(yùn)行時(shí),通過外掛工具動(dòng)態(tài)修改、添加或刪除進(jìn)程代碼段數(shù)據(jù)或者動(dòng)態(tài)注入shellcode同樣也能起到修改程序流程的作用,那么需要校驗(yàn)PE文件和游戲內(nèi)存數(shù)據(jù)就可以檢測(cè)出游戲外掛。

3.在實(shí)際運(yùn)用中,可以計(jì)算出PE文件的校驗(yàn)值,存放在游戲第三方程序的數(shù)據(jù)段中或者存放在游戲的服務(wù)器端,那么在游戲運(yùn)行前校驗(yàn)PE文件值和運(yùn)行時(shí)動(dòng)態(tài)檢驗(yàn)進(jìn)程內(nèi)存,接下來使用工具來模擬這個(gè)過程:

1.選擇PE文件計(jì)算PE文件校驗(yàn)值和記錄代碼段數(shù)據(jù);

2.選擇需要校驗(yàn)的文件,同樣也計(jì)算出校驗(yàn)值并比較是否變化;

3.選擇正在運(yùn)行的進(jìn)程,比較代碼段數(shù)據(jù)是否變化。

4.實(shí)現(xiàn)的思路為:

1.使用MD5算法計(jì)算出前后PE文件的校驗(yàn)值,并進(jìn)行比較;

?2.先使用數(shù)組存放PE文件代碼段數(shù)據(jù),后讀取進(jìn)程內(nèi)存中的代碼段數(shù)據(jù),然后比較數(shù)組數(shù)據(jù)是否相同

?5.在游戲運(yùn)行時(shí),把游戲運(yùn)行過程中使用過的函數(shù)及其相關(guān)的寄存器信息存放在服務(wù)端,在服務(wù)端檢測(cè)函數(shù)的調(diào)用流程,就可以判斷游戲內(nèi)部call有沒有非法調(diào)用。不過我這里模擬這個(gè)過程的方式是把函數(shù)運(yùn)行時(shí)的信息寫到日志文件中,查看日志信息來判斷游戲內(nèi)部call是否被非法調(diào)用。

6.實(shí)現(xiàn)的思路為:

1.調(diào)式進(jìn)程,循環(huán)接受調(diào)式事件;

2.在剛開始調(diào)式時(shí),把函數(shù)頭部修改為CC;

3.當(dāng)發(fā)現(xiàn)中斷時(shí),判斷發(fā)生中斷的地址是否為函數(shù)頭部地址,是的話,把線程上下文信息記錄在日志文件中

//調(diào)式進(jìn)程DebugActiveProcess(pid):                           //循環(huán)等待調(diào)式事件                           while (WaitForDebugEvent(&de, INFINITE))                                   {                                   ......                                   PEXCEPTION_RECORD per = &pde->u.Exception.ExceptionRecord;                                   //觸發(fā)創(chuàng)建調(diào)式進(jìn)程事件時(shí)                                   if (CREATE_PROCESS_DEBUG_EVENT == de.dwDebugEventCode)                                       //修改函數(shù)頭部                                       SetUserFunc(&de);                               //觸發(fā)異常事件時(shí)                                   else if (EXCEPTION_DEBUG_EVENT == de.dwDebugEventCode)                                       //判斷觸發(fā)異常地址                                    if (OnExceptionDebugEvent(&de))                                       continue;                           //繼續(xù)接受調(diào)式事件                                   ContinueDebugEvent(de.dwProcessId, de.dwThreadId, dwContinueStatus);                                    }

HOOK檢測(cè)

1.現(xiàn)在,有各種各樣的HOOK技術(shù),包括 InLine HOOK、IAT HOOK、API HOOK等,其中大部分需要注入dll來實(shí)現(xiàn)HOOK功能,那么游戲運(yùn)行時(shí),服務(wù)端或者游戲第三方程序可以檢測(cè)有無dll注入,有的話,及時(shí)清除掉。實(shí)現(xiàn)的思路為:

1.先記錄游戲運(yùn)行過程中用的dll文件名;2.游戲運(yùn)行時(shí)遍歷進(jìn)程使用的dll文件名,若遇到不名dll文件名,則進(jìn)行釋放;

2.使用工具模擬這個(gè)過程:選擇進(jìn)程,選中dll文件所在目錄,點(diǎn)擊檢測(cè)dll,就可檢測(cè)出進(jìn)程中是否有dll注入。

3.那么,除了檢測(cè)dll文件外,還可以檢測(cè) IAT表和函數(shù)內(nèi)部代碼的跳轉(zhuǎn)指令來判斷游戲中是否有IAT HOOK或者InLine HOOK(跟API HOOK差不多,范圍比API HOOK小,我這里就不介紹了),實(shí)現(xiàn)的過程為:

1.選中游戲PE文件后,定位到導(dǎo)入表目錄,遍歷INT表中的_IMAGE_THUNK_DATA,通過里面的聯(lián)合體u1,來獲取游戲運(yùn)行后IAT表中的函數(shù)地址;

2.選中進(jìn)程,讀取進(jìn)程內(nèi)存中IAT表信息并比較函數(shù)地址,不同則說明有 IAT HOOK;

3.對(duì)于InLine HOOK,讀取進(jìn)程代碼段中函數(shù)區(qū)域的跳轉(zhuǎn)指令操作數(shù),若發(fā)現(xiàn)跳轉(zhuǎn)到別的函數(shù)區(qū)域,則說明有InLine HOOK;

4.使用工具模擬這個(gè)過程:選中進(jìn)程和PE文件,再點(diǎn)擊 IAT HOOK按鈕或者InLine HOOK按鈕就可進(jìn)行檢測(cè)。

多開檢測(cè)和動(dòng)態(tài)調(diào)式工具檢測(cè)

1.現(xiàn)在的打金工作室可以同時(shí)開多個(gè)號(hào)來刷金幣,那么需要限制游戲多開,當(dāng)動(dòng)態(tài)調(diào)式進(jìn)程時(shí),在任務(wù)管理器中可以看到調(diào)式工具的主線程成了調(diào)式進(jìn)程,那么調(diào)式器內(nèi)存里面必然會(huì)有調(diào)式進(jìn)程的內(nèi)存信息,那么找到調(diào)式工具后再查找里面是否含有游戲進(jìn)程的內(nèi)存信息,若有則可以判斷,游戲處于調(diào)式狀態(tài)。

2.對(duì)于防多開,經(jīng)常會(huì)用到下面的代碼,那么外掛制作者修改跳轉(zhuǎn)指令或者NOP掉匯編代碼就可以實(shí)現(xiàn)多開。為了防止這種情況,我這里把CreateMutex函數(shù)頭部修改為CC,使用調(diào)式器的方式不斷監(jiān)控異常事件,當(dāng)CreateMutex函數(shù)頭部觸發(fā)中斷異常時(shí),獲取互斥體變量名(地址為:ESP+8),并判斷該變量名是否出現(xiàn)過,若出現(xiàn)過,則檢測(cè)出進(jìn)程出現(xiàn)多開。實(shí)現(xiàn)的關(guān)鍵代碼如下:

//創(chuàng)建互斥體    HANDLE hMutex = CreateMutex(NULL,FALSE,"XXXXXX");    DWORD dret = GetLastError();    if(hMutex)    {        if (ERROR_ALREADY_EXISTS == dret)        {            CloseHandle(hMutex);            return 0;        }    }   .............    //WaitForSingleObject(hMutex,INFINITE);  ............    ReleaseMutex(hMutex);     return 0;}

檢測(cè)多開的關(guān)鍵代碼:

//解除HOOK 恢復(fù)原值        WriteProcessMemory(&pde->dwProcessId, g_pCreateMutex,&g_Orignal,sizeof(BYTE),NULL);        //獲取線程上下文        ctx.ContextFlags = CONTEXT_CONTROL;        GetThreadContext(g_cpdi2.hThread,&ctx);        //得到ESP+8的值        ReadProcessMemory(g_cpdi2.hProcess, LPVOID(ctx.Esp + 0x8), &EspContent, sizeof(DWORD), NULL);        printf("EspContent: %x/n", EspContent);        //取出地址并獲取字符串        Name[NameNum++] = (char*)(EspContent);        //判斷有無重復(fù)互斥名        list list1;        for (int i = 0; i < NameNum; i++)        {            list1.push_back(Name[i]);        }        int len1 = list1.size();        list1.unique();        int len2 = list1.size();        //長(zhǎng)度不等,則有重復(fù)元素        if (len1 != len2)        {            IsOpenMore = 1;            return -1;        }        //讓EIP為當(dāng)前地址        ctx.Eip = (DWORD)g_pCreateMutex;        //設(shè)置線程上下文        SetThreadContext(g_cpdi2.hThread, &ctx);        //繼續(xù)調(diào)式        ContinueDebugEvent(pde->dwProcessId, pde->dwThreadId, DBG_CONTINUE);

3.對(duì)于多開檢測(cè),我還想出了三種檢測(cè)方法:

1.獲取進(jìn)程代碼段信息,使用代碼段信息匹配的方式來判斷是否有相同的進(jìn)程運(yùn)行;

2.獲取進(jìn)程所有的窗口句柄,匹配查找有無跟窗口標(biāo)題相同的窗口,有則說明多開;

3.對(duì)進(jìn)程名進(jìn)行匹配;

4.對(duì)于調(diào)式工具檢測(cè),還是使用代碼段識(shí)別法:獲取OD工具中代碼段信息匹配尋找相同進(jìn)程,若有,則再識(shí)別內(nèi)部有無游戲進(jìn)程的內(nèi)存信息并且再判斷調(diào)式進(jìn)程是否為調(diào)式工具的子進(jìn)程,兩者有一成立,則說明游戲進(jìn)程處于調(diào)式狀態(tài),實(shí)現(xiàn)的關(guān)鍵代碼如下:

void ToolAndOpenMore::GetToolCode(BYTE* ToolCode, CString strPath){    //把PE文件加載到內(nèi)存中    PVOID PeBuffer =PEFileToMemory(CStringToCharSz(strPath));    //PE文件頭    pPEHeader = (PIMAGE_FILE_HEADER)((DWORD)PeBuffer + pDosHeader->e_lfanew + 0x4);    //節(jié)表數(shù)量    DWORD SectionNum = pPEHeader->NumberOfSections;    //PE可選頭    pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + IMAGE_SIZEOF_FILE_HEADER);    DWORD EP = pOptionHeader->AddressOfEntryPoint;    //代碼段節(jié)表頭    pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader + pPEHeader->SizeOfOptionalHeader);    tpSectionHeader = pSectionHeader;    int j = 0;    //遍歷OEP之后的代碼段數(shù)據(jù)    for (int i = tpSectionHeader->PointerToRawData; i < tpSectionHeader->PointerToRawData + tpSectionHeader->SizeOfRawData && j

5.接下來,使用工具進(jìn)行檢測(cè):多開檢測(cè)只需選中進(jìn)程點(diǎn)擊“多開檢測(cè)”按鈕即可;調(diào)式工具檢測(cè)要選中進(jìn)程和調(diào)式工具,操作情況如下所示:

添加反調(diào)式法

1.在游戲的PE文件中添加反調(diào)試,不為是一種較好的反外掛方法。在PE文件中修改TLS表信息,擴(kuò)大最后一個(gè)節(jié)表并在空白區(qū)域添加PIMAGE_TLS_DIRECTORY結(jié)構(gòu)信息、TLS回調(diào)函數(shù),并在TLS回調(diào)函數(shù)中添加反調(diào)試功能即可實(shí)現(xiàn)反調(diào)試。

?2.實(shí)現(xiàn)反調(diào)試的思路為:

1.把PE文件加載到內(nèi)存中,使用偏移的方式定位到TLS數(shù)據(jù)目錄,修改其中的 RVA字段值和Size字段值,讓 RVA指向PIMAGE_TLS_DIRECTORY起始地址;

2.定位到最后的節(jié)表結(jié)構(gòu)并增加SizeOfRawData的值和修改Characteristics的值,使最后的節(jié)表具有可執(zhí)行特性。

3.最后把生成的PIMAGE_TLS_DIRECTORY結(jié)構(gòu)數(shù)據(jù)和回調(diào)函數(shù)ShellCode復(fù)制到最后的節(jié)表中。

3.除了往PE文件添加TLS反調(diào)式外,還可以添加SEH反調(diào)試,實(shí)現(xiàn)的思路為:
?

1.先在代碼段,尋找足夠大的空閑區(qū)域,若沒有找到,則新增最后節(jié)表大??;

2.確定空閑區(qū)域開始地址,修改OEP的值,在空閑區(qū)域添加觸發(fā)SEH異常的Shellcode,在該Shellcode中有異常處理函數(shù),該異常處理函數(shù)會(huì)判斷游戲是否處于調(diào)式中,如果沒有處于調(diào)式狀態(tài)則跳回OEP中,否則中止;

4.接下來使用工具添加反調(diào)試,選中文件,點(diǎn)擊按鈕即可。

以上使用的工具和源碼可在該處下載:https://github.com/chenpan01/Anti_GameAssist。希望該工具及源碼對(duì)大家有所幫助,工具存在bug的話,歡迎提出,大家共同探討,共同提升!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/119317.html

相關(guān)文章

  • 我是如何學(xué)習(xí)游戲引擎?

    摘要:下面列舉了游戲開發(fā)中常見的崗位以及兩條常見的協(xié)作開發(fā)的流水線其實(shí)學(xué)習(xí)游戲引擎,前期對(duì)于任何崗位來說路線都是相似的,基本上就是一個(gè)熟悉基本操作理解基本概念拓展專業(yè)知識(shí)的過程。當(dāng)然這不是絕對(duì)的,任何引擎的開始階段和大成階段都是相似的。 這是【游戲開發(fā)那些事】第51篇原創(chuàng) 前言:游戲引擎,表面...

    未東興 評(píng)論0 收藏0
  • 上海 HTML5 峰會(huì)筆記整理與總結(jié)

    摘要:規(guī)則分為可能是錯(cuò)誤,最佳實(shí)踐,變量聲明等等,賀前輩的建議是能用的規(guī)則都用上。峰會(huì)中獎(jiǎng)品挺多的,可惜與我擦肩而過。 iWeb峰會(huì)的消息是在開場(chǎng)前兩天才從朋友圈看到,稍微有點(diǎn)匆忙,只花了不到兩個(gè)小時(shí)的時(shí)間了解下相關(guān)主題。發(fā)現(xiàn)涉及的知識(shí)還是蠻多的,甚至一些平時(shí)也沒有接觸過。所以一些關(guān)注點(diǎn),理解的層次都很有限,甚至可能有誤區(qū),僅供參考及知識(shí)面的拓展。 工具應(yīng)用類 峰會(huì)的主題是HTML5,又分為...

    tinyq 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<