2021騰訊游戲安全技術(shù)復(fù)賽pc客戶端安全wp
作者論壇賬號:Qfrost
題目說明:
shootgame是一個游戲,hack.exe是游戲shootergame的一個外掛程序。
運行shootgame游戲,運行hack.exe,成功執(zhí)行外掛功能并分析外掛實現(xiàn)過程。
實現(xiàn)一個與hack.exe的功能相同的,但是游戲邏輯原理不同的外掛程序。(游戲邏輯原理不同:指外掛程序?qū)ψx寫游戲數(shù)據(jù)結(jié)構(gòu)或代碼的攻擊內(nèi)容不同,并不是讀寫內(nèi)存方式、注入內(nèi)存方式、外掛核心核心代碼載體差異的不同)
評分標準:滿分10分
flag(2分)? ? 成功執(zhí)行hack功能,給出外掛執(zhí)行成功的flag。
代碼(3分)? ? 與hack.exe外掛功能相同,但實現(xiàn)原理與hack.exe不同的程序源碼,僅需要提供可編譯的工程完整代碼,不需要提供已經(jīng)編譯出來的bin文件。
文檔(4分)? ? 詳細描述解題過程,如涉及編寫程序,必須提供源代碼。
時間(1分)? ? 正確提交flag、代碼、文檔的順序,第1名計1分,后每1名-0.05分。
很明顯,今年是寫掛了。本fw通了兩個宵只能很勉強的做出幾個簡單的功能。羨慕帶哥直接dump SDK兩小時生成帶幾十個功能的蓋。(師傅們tql
hack.exe
加載程序進IDA,main函數(shù)開頭解密字符串,試圖打開hack.dat文件,因為dat文件不存在,所以hack.exe退出

我隨便創(chuàng)了一個文件然后往里面寫了一些東西,然后hack.exe就可以往下運行讀取其中的內(nèi)容然后進decode解密,decode函數(shù)里面是SSE優(yōu)化后的解密算法,其中有兩個分支,若長度大于0x40會走SSE優(yōu)化的算法,若小于則走下面的分支,但本質(zhì)的解密算法是一樣的。具體算法后面給出分析

這一部分是計算shellcode的長度,shellcode會用于dll的加載

再下面v9就是decode函數(shù)對hack.dat解密出來的內(nèi)容,通過取值取出ProcName,結(jié)合上下文可以知道這個ProcName就是游戲的進程名,在下面的?CreateToolhelp32Snapshot + Process32First?進程枚舉中搜索游戲進程
再往下走下面兩個循環(huán)分別是解密出flag和check flag

如果check成功則解密出 flag:%s 字符串并調(diào)用printf函數(shù)輸出flag

下面會解密出一個dll并申請空間用于后續(xù)的注入

起動調(diào)程序,通過setIP手動的讓程序運行decode函數(shù)解密DLL,然后通過idc腳本對其dump確定是一個dll文件,附dump.idc


利用注入器將DLL注入到游戲中,彈出提示,測試發(fā)現(xiàn)帶有右鍵自瞄的外掛功能

回過頭來繼續(xù)看hack.exe。后面一大段都是解密出各種函數(shù)(這里就不一一截圖了)

最后將dll,shellcode寫入到游戲進程空間并起遠線程調(diào)用shellcode加載dll


可以看到外掛成功啟動并輸出flag

Flag: 2RSRhrofoWtLeLrJCSlTireznrtx.oeLxuehyyAwbpCOZq0tsS7MZyVdOUoE8
DumpFile.dll
直接看這個dll發(fā)現(xiàn)很亂,來回看了一下發(fā)現(xiàn)是封裝了一個hook引擎進去。外掛注入后可以實現(xiàn)右鍵自瞄的功能,同時只有敵人離自己在一定范圍內(nèi)才會觸發(fā)自瞄。因為是按鍵自瞄,直接想到GetAsyncKeyState函數(shù)。IDA看dll的導(dǎo)入表果然看到交叉引用,只有sub_180005050一個函數(shù)調(diào)用過該函數(shù),確定此處為作弊功能

發(fā)現(xiàn)浮點數(shù)寫操作,0x398很像是一個偏移,附加上去跟了一下

動調(diào)跟了發(fā)現(xiàn)這兩個值分別是角色的上下?lián)u擺角和左右偏移角。向上回溯尋找v16的來源定位到這個地方

獲得計算公式,發(fā)現(xiàn)此處的基址是出于作弊模塊空間的,回到初始化函數(shù)找到原基址,輸入CE


以此為入手點,從頭看這個作弊函數(shù)。這個大循環(huán)就是自瞄了

GetAimTarget函數(shù)會嘗試匹配符合條件的自瞄目標,匹配成功則返回目標對象,否則返回-1,其也是通過枚舉角色結(jié)構(gòu)列表來實現(xiàn)的

然后會獲取每個角色的名字進行匹配


會在CampName函數(shù)中對名字進行字符串匹配

下面是距離計算邏輯


通過屏幕中心點與敵人的屏幕坐標 距離 來匹配距離準星 最近的敵人,若能匹配到,敵人對象就會通過v3返回。至此GetAimTarget函數(shù)分析完畢。

通過GetAimTarget取到的敵人對象,則通過內(nèi)存對其取坐標,易分析得0x164,0x168,0x16C分別為對象的X,Y,Z坐標
最后會對坐標做角度變換和歸一化處理,最終計算得到上下?lián)u擺角和左右偏移角填入游戲數(shù)據(jù)

至此外掛功能函數(shù)分析完畢
外掛攻擊的數(shù)據(jù)(實現(xiàn)自瞄的方式)

外掛實現(xiàn)
寫了兩個外掛,編譯環(huán)境均為??visual studio 2019 x64 release
Cheat1
純外部跨進程的通過修改鏡頭角度的實現(xiàn)右鍵自瞄



Cheat2
思路:因為要實現(xiàn)自瞄,而鏡頭又不知道還有什么別的攻擊方式,因此換了一個思路,把子彈出發(fā)的坐標改到敵人的坐標上,這樣可以開槍直接就可以打死敵人 并且可以無視任何建筑物。我從子彈數(shù)量入手,找到游戲開槍的地方,開槍的地方一定會有一個子彈開始坐標,我們先用CE搜索子彈數(shù)量,并對其下訪問斷點

定位到了子彈數(shù)量減少處。因為要實現(xiàn)修改子彈發(fā)射點到敵人坐標處,我們需要找到子彈發(fā)射的地方,因此這里向上回溯
回溯了一層發(fā)現(xiàn)大量的call,我們在頭部下斷,粗粗看了一下這些call,發(fā)現(xiàn)在子彈減少call的上一個call里調(diào)用了rand函數(shù)。

因為彈道是具有隨機性的, rand函數(shù)引起了我的注意,然后想起第一天在百度上搜到的關(guān)于這款游戲的開發(fā)文檔的源碼

上下看了一下發(fā)現(xiàn)其他部分也很像,認為這個call就是武器開火函數(shù)


從call的頭部下斷 然后在游戲中開槍 再往下可以看到調(diào)用了函數(shù)取了一個坐標,我不知道這個坐標具體是個什么坐標 但是肯定是跟彈道有關(guān)的坐標

我通過在此處下斷點,面對墻壁開槍,并修改了這些值,發(fā)現(xiàn)墻壁上沒有出現(xiàn)彈孔,認為這些值就是控制子彈的起始坐標,而下面這個call就是碰撞call。如果能修改這個參數(shù)為敵人的坐標,應(yīng)該就可以實現(xiàn)子彈全圖自瞄。 我采用了外部注入shellcode hook此處,跳轉(zhuǎn)到寫入的自瞄shellcode上,完成了參數(shù)的修改。經(jīng)測試,確實可以達到開槍后子彈能直接打中敵人并且無視建筑物的效果。 同時,在我添加bot后發(fā)現(xiàn)bot開槍也是經(jīng)過的這個函數(shù) 所以我們hook這個函數(shù) 不僅可以讓bot的子彈打不中我們 我們還可以打死這些bot (同時實現(xiàn)了無敵跟子彈穿墻追蹤的效果)
下面貼一下shellcode


待外掛啟動后,會先將shellcode注入游戲空間,并跨進程的不斷枚舉游戲?qū)ο罅斜?,發(fā)現(xiàn)存活的敵人便將其坐標寫入自瞄坐標內(nèi)存上,shellcode會在每次開槍的時候?qū)⒆悦樽鴺藘?nèi)存上的值替換到碰撞call的參數(shù)上,以此就可以實現(xiàn)站著不動開槍殺死全圖敵人且無敵的效果。




至此,外掛實現(xiàn)完畢
原文地址:https://www.52pojie.cn/thread-1415867-1-1.html
此活動來自騰訊游戲安全部門聯(lián)合吾愛破解論壇舉辦的【2021游戲安全技術(shù)競賽】,參加比賽實習(xí)綠色通道+豐厚獎金等著你,活動詳情:https://www.52pojie.cn/thread-1396337-1-1.html,印證那句話未知攻焉知防,只有了解攻擊才能更好做好防御,防外掛的思路可以源于做如何外掛。