游戲安全丨喊話CALL分析-分析參數(shù)

文章主要內(nèi)容是有參CALL如何分析參數(shù),在寫匯編時如何把參數(shù)寫進(jìn)去以及如何調(diào)用。
以喊話CALL為例,喊話CALL是用代碼來調(diào)用,打印任意的話。
1.打開x86dbg,文件-附加-打開游戲

2.bp send(設(shè)置send函數(shù)的斷點)回車,斷點,再運行

3.在游戲中,點擊“當(dāng)前”,輸入123456,再運行x86dbg

4.點擊調(diào)用堆棧,找到斷點,復(fù)制整個表格

5.新建分析文本,粘貼整個表格,只留下主線程,在第三層74開始分析

6.運行,然后斷點禁用或刪除

7.Ctrl+G返回到這里,確定

8.返回到是Nop,它的上一層就是調(diào)用的call,可以看到有三個參數(shù)rdx、r8d(r8的32位)、rcx(在64位類似fastcall,它的前四個參數(shù)分別是rcx、rdx、r8、r9)

喊話CALL是會帶一個發(fā)送的文本,有文本參數(shù),所以先找一下參數(shù)。
9.1 點擊call的地方下斷點,在游戲內(nèi)-當(dāng)前-發(fā)送文本

9.2來看一下參數(shù),發(fā)現(xiàn)其他rax、rsi、r10、r11里有文本,但在r8、r9、rcx、rdx里沒有

因此判斷不是我們要找的CALL,是底層或上一層call,取消斷點
9.3文本參數(shù)應(yīng)該前四個參數(shù)里

9.4 Ctrl+G返回到這里,確定

9.5下個斷點,走動一下(防止是其他call),再說一句話,回車

9.6斷下來,發(fā)現(xiàn)r8符合要求

9.7把參數(shù)記下來,然后斷點運行

9.8復(fù)制寄存器,只留通用寄存器

9.9把rcx、rdx、r8、r9參數(shù)復(fù)制下來,可以確定r8是字符串地址
10.找rdx參數(shù)
10.1 Ctrl+G返回到這里,確定

10.2測試rdx,在當(dāng)前多喊幾次話,發(fā)現(xiàn)寄存器沒有值,所以認(rèn)為rdx是寫死的值-0

10.3再切換主隊,發(fā)現(xiàn)rdx有變化,所以判定rdx是說話的方式

10.4當(dāng)前模式是0,組隊模式是2,團(tuán)隊模式是12
11.找r9參數(shù)
11.1測試r9,多喊幾遍,r9沒有變化,r9是寫死的值-FFFFFFFF

12.找rcx參數(shù)
12.1復(fù)制rcx,重啟游戲并重新打開x86dbg,文件-附加-打開游戲

12.2喊話-斷點,發(fā)現(xiàn)rcx的值變了,所以需要找一下值

12.3返回調(diào)用,發(fā)現(xiàn)rcx來自與rbp+620,然后找一下620

使用x64dbg繼續(xù)調(diào)也可以,使用ida看起來更方便
12.4把64位客戶端在64ida里打開

12.5 CTRL+G跳轉(zhuǎn)到返回的位置上,發(fā)現(xiàn)沒有rcx賦值

13.因為很難找到rcx,所以找到另一個突破點
13.1在寄存器里發(fā)現(xiàn)rbx和rcx一樣,就以rbx為突破點,找到了rbx對rcx的賦值

13.2懷疑沒有通過src對rcx賦值,而是通過rbx對rcx賦值之后,通過跳轉(zhuǎn)到參數(shù)傳遞,直接調(diào)用喊話CALL

13.3 若是上述情況,需要先找rbx的值
13.3.1發(fā)現(xiàn)是變量Var EB0給rbx賦值

13.3.2再尋找變量Var EB0,發(fā)現(xiàn)是rax賦值給變量Var EB0

13.3.3 rax值來源于上面的call,call的返回值是rax

13.4 Rcx=那個call的返回值
13.4.1進(jìn)一層,Rax就是call的返回值+48,然后取值

13.4.2再進(jìn)去一層,發(fā)現(xiàn)一個基址放在rax里

13.4.3 Rcx=[0x基址+0x48]

到此數(shù)據(jù)分析的四個參數(shù)已經(jīng)都找到了