二.《澤諾尼亞》明文CALL
了解發(fā)包函數(shù)
1.一款網(wǎng)絡(luò)游戲,必定是會(huì)發(fā)包的,對于PC端而言,想要進(jìn)行網(wǎng)絡(luò)通訊,就拿最簡單的CS架構(gòu)而言勢必會(huì)調(diào)用win32 API函數(shù)或底層函數(shù)

2.這里列舉出常用的API如:send sendto wsasend wspsend
3.有一些正向開發(fā)經(jīng)驗(yàn)的同學(xué),肯定是見過這幾個(gè)函數(shù)的
4.接下來我們來看看這款游戲到底是調(diào)用的那個(gè)API呢?或者說是哪幾個(gè)呢?
確定發(fā)包函數(shù)
1.我們選中匯編窗口,按ctrl+g,輸入send,回車跳轉(zhuǎn)到該函數(shù)頭部

2.來到函數(shù)頭部,我們下F2斷點(diǎn),確定是否是send發(fā)包

3.發(fā)現(xiàn)下斷就斷,很明顯可知很大可能性是send發(fā)包
確定包地址是否固定
1.確定了send發(fā)包,現(xiàn)在我們來看看該函數(shù)的函數(shù)類型,主要看參數(shù)
int?send(?SOCKET?s,?const?char?FAR?*buf,?int?len,?int?flags?);
2.注意看第二個(gè)參數(shù)是一個(gè)指針,指向一個(gè)緩存區(qū)地址,我們需要發(fā)送的數(shù)據(jù)就存放在這個(gè)緩沖區(qū)中,第三個(gè)參數(shù)是緩沖區(qū)大小,說白了就是需要發(fā)送數(shù)據(jù)有多少字節(jié)
3.現(xiàn)在我們斷下看看這個(gè)CALL的第二個(gè)參數(shù)是否是固定地址
4.在不同操作下,我們發(fā)現(xiàn)rdx是固定的地址,由此可見是固定地址

確定是否線程發(fā)包
1.我們上面確定了是send發(fā)包的包地址是一個(gè)固定地址,接下來就好辦了,只需要進(jìn)一步確定是否是線程發(fā)包就可以找到明文CALL
2.首先我們要確定該游戲是否用到了線程發(fā)包
3.我們這里在send下斷點(diǎn),這里我們尋路觸發(fā),注意這里最好操作快點(diǎn),因?yàn)橛行奶挠绊?/p>
4.我們操作快一點(diǎn),分別在尋路,喊話斷下,按Ctrl+F9不斷返回,看是否返回地址一樣
5.經(jīng)過分析不同的操作居然返回的地址幾乎一樣,由此可見在一個(gè)線程中循環(huán)執(zhí)行發(fā)包
6.到這里就可以確定是線程發(fā)包
跳出線程發(fā)包
1.我們確定為線程發(fā)包,主要目的是為了跳出線程發(fā)包,找到明文CALL
2.現(xiàn)在我們看看如何跳出線程發(fā)包呢?其實(shí)說白了就是跳出線程
3.這里給大家畫了一個(gè)正向代碼的架構(gòu)模型圖,方便看看

4.正如大家看到的,我們在send流程斷下的地方,都屬于線程2的范疇,而需要找到明文CALL,則需要跳出(Ctrl+F9)線程2
5.為了跳出線程2,靠Ctrl+F9是不可能跳出去的,因?yàn)槲覀兛吹揭粋€(gè)線程不停的在循環(huán)檢索固定地址的數(shù)據(jù)
6.這時(shí)候就需要借助內(nèi)存數(shù)據(jù)的訪問寫入斷點(diǎn),從而跨線程的尋找調(diào)用代碼
7.這里明確要記住的是,你只有內(nèi)存數(shù)據(jù)的訪問寫入才有跨線程的特性,而僅僅靠簡單的Ctrl+F9執(zhí)行到返回是不可能跨線程的
8.所以怎么跳出去呢?其實(shí)很簡單,上面我們也確定了包地址是固定的,所以只需要在包地址下寫入斷點(diǎn)就會(huì)跳出線程啦
9.這里還需要說明下, 經(jīng)過我們觀察心跳包是8字節(jié)也就是只修改了包緩沖區(qū)前8字節(jié),所以找好在那個(gè)包地址(首地址+偏移)下寫入是尤其重要的!

10.當(dāng)我們尋路的時(shí)候,發(fā)現(xiàn)修改的是超過8字節(jié)的緩沖區(qū),這時(shí)候我們就可以利用這個(gè)特點(diǎn),盡量在后8字節(jié)下寫入

11.當(dāng)下寫入后,我們尋路,此時(shí)就斷到了線程2以外的代碼處啦

12.到這里,基本可以大概率確定跳出去了,但是我們還是需要確定一下!
確定是否跳出線程成功
1.其實(shí)確定是很簡單的,那就是通過功能觸發(fā)斷下,多返回幾層,找到分支的那個(gè)點(diǎn)就可以啦
2.正如上面模型圖給大家畫的那樣,這里給大家再畫一個(gè)流程圖

3.通過幾個(gè)功能的返回CALL分析,我們最終確定了再返回的第二層就是明文CALL,因?yàn)檫@個(gè)CALL是基本上所有關(guān)于發(fā)包的功能都會(huì)斷下,而只要再返回一層,那就只有
在單獨(dú)的功能才能斷下啦

4.好啦,到此澤諾尼亞的明文CALL就找到了,是不是很簡單!
5.最后感謝大家對迪大學(xué)院的支持!285530835