一.《澤諾尼亞》背包物品數(shù)據(jù)分析和遍歷
尋找突破口
1.首先尋找突破口,圍繞一個(gè)“變”字去找
2.之前在別的課程中也給同學(xué)們說(shuō)過(guò),我們?cè)谡冶嘲锲繁闅v,無(wú)非就是要先拿到物品對(duì)象
3.然而要拿到物品對(duì)象,必須先拿到物品屬性,然后逆向分析拿到物品對(duì)象
4.那么問(wèn)題來(lái)了, 怎么拿到物品屬性呢?
5.這時(shí)候就要找到我們能夠通過(guò)CE容易搜索出來(lái)的數(shù)據(jù),比如:物品的數(shù)量
6.因?yàn)閿?shù)量我們很好去控制他的數(shù)量
CE尋找數(shù)據(jù)
1.我們就搜索背包里面的藥品數(shù)量

2.觀察藥品數(shù)量當(dāng)前為520,經(jīng)過(guò)我們改變和精確搜索,還剩下3個(gè)結(jié)果

3.怎么確定這3個(gè)地址那個(gè)是真正的物品數(shù)量的數(shù)據(jù)呢?
4.猶豫數(shù)量少,我們可以一個(gè)一個(gè)挨著修改,然后觀察游戲物品數(shù)量的變化,從而得知那個(gè)是真正的數(shù)據(jù)

5.修改后發(fā)現(xiàn)是第三個(gè)地址

6.好,接下來(lái)拿到地址,我們用XDBG附加游戲,觀察數(shù)據(jù)

尋找對(duì)象
1.接下來(lái)我們就需要找這個(gè)數(shù)據(jù)存在那個(gè)對(duì)象下,下一個(gè)硬件寫(xiě)入斷點(diǎn)

2.我們?nèi)ゴ蚬譁p少血量,從而斷到寫(xiě)入數(shù)量的匯編代碼處

3.斷下來(lái)后,觀察到rax+18就是我們的數(shù)量地址,那么rax應(yīng)該就是結(jié)構(gòu)體首地址或者對(duì)象首地址

4.此時(shí)rax等于這個(gè)值0000021FAC59D750

5.我們觀察這個(gè)地址,發(fā)現(xiàn)0000021FAC59D750+18的地址中的值0x1FC確實(shí)是我們的物品數(shù)量

尋找對(duì)象來(lái)源
1.接下來(lái)我們繼續(xù)找rax等于0000021FAC59D750的來(lái)源,往上分析
2.結(jié)果發(fā)現(xiàn)就在本層這個(gè)rax來(lái)源一個(gè)CALL的返回值

3. 這個(gè)時(shí)候我們?cè)谶@個(gè)CALL下斷,為了確認(rèn)下是否返回的是否是我們上面的對(duì)象
4.結(jié)果在這個(gè)CALL里面發(fā)現(xiàn)來(lái)源是rsi

5.繼續(xù)找rsi來(lái)源

6.發(fā)現(xiàn)rsi來(lái)源rbp,同時(shí)rbp來(lái)源[rdx],結(jié)果就在我們以為來(lái)源是rdx的時(shí)候,我們發(fā)現(xiàn)rdx是堆棧地址,也就是來(lái)源是這個(gè)CALL的rdx參數(shù),也就是第二個(gè)參數(shù)
7.好!這個(gè)時(shí)候我們來(lái)到這個(gè)CALL下斷再看看rdx參數(shù)里面存著什么

8.觀察到,的確,在調(diào)用這個(gè)CALL的時(shí)候,rdx堆棧里面已經(jīng)存著對(duì)象了
9.接下來(lái)就繼續(xù)找堆棧里面對(duì)象的來(lái)源
10.當(dāng)我們往上找的時(shí)候,發(fā)現(xiàn)緊接著上面的CALL就有一個(gè)很熟悉的匯編語(yǔ)句

11.lea rdx, ss:[rsp+0x38]有經(jīng)驗(yàn)的同學(xué)就知道這句匯編結(jié)合調(diào)用下面的CALL并把rdx作為第二個(gè)參數(shù)的含義是什么
12.其實(shí)就是傳遞一個(gè)局部變量的地址,然后CALL內(nèi)部把需要的值寫(xiě)入rdx指向的地址中去
13.現(xiàn)在我們驗(yàn)證下,我們斷下

14..咦!我們居然發(fā)現(xiàn)我們需要的對(duì)象怎么存在這個(gè)堆棧里面呢?其實(shí)是有的,只是經(jīng)過(guò)這個(gè)CALL,才會(huì)被寫(xiě)入,也就是這個(gè)CALL很可能是一個(gè)獲取對(duì)象的CALL,并把對(duì)象寫(xiě)入到rdx堆棧地址中,說(shuō)明我們的猜測(cè)應(yīng)該是對(duì)的,最終堆棧里面的對(duì)象來(lái)源就是這個(gè)CALL
15.分析參數(shù),發(fā)現(xiàn)此時(shí)rdx堆棧地址里面存這2個(gè)對(duì)象,同時(shí)r8我們發(fā)現(xiàn)類似一個(gè)ID

16.經(jīng)過(guò)這個(gè)CALL,rdx由原來(lái)的沒(méi)有對(duì)象被寫(xiě)入了2個(gè)對(duì)象,剛好第一個(gè)對(duì)象就是我們需要找的物品對(duì)象

17.接下來(lái)繼續(xù)找這個(gè)堆棧地址啥時(shí)候?qū)懭氲倪@2個(gè)對(duì)象
18.這下就好辦了,我們就在這個(gè)CALL下斷點(diǎn),然后轉(zhuǎn)到rdx堆棧地址,觀察此時(shí)是沒(méi)有我們所需要的對(duì)象,這個(gè)時(shí)候按F7進(jìn)入CALL,接著按F8,逐步分析啥時(shí)候?qū)懭肓诉@個(gè)rdx堆棧地址中得值
19.當(dāng)我們慢慢的分析,這里觀察到一個(gè)遍歷,而且還是一個(gè)結(jié)構(gòu)體數(shù)組,每個(gè)結(jié)構(gòu)體大小是0x60

20.發(fā)現(xiàn)一個(gè)結(jié)構(gòu)體數(shù)組,了解過(guò)數(shù)組概念的同學(xué)都知道,我們只需要找首地址就行了,也就是rcx的地址

21.發(fā)現(xiàn)這個(gè)r11首地址來(lái)源r15,然后在函數(shù)頭發(fā)現(xiàn)來(lái)源rcx,也就是這個(gè)CALL的第一個(gè)參數(shù)
22.我們看看rcx參數(shù)對(duì)象在內(nèi)存存的是什么,居然我們的結(jié)構(gòu)體數(shù)組在這個(gè)對(duì)象里面
分析結(jié)構(gòu)體數(shù)組所在對(duì)象
1.我們發(fā)現(xiàn)居然確實(shí)有一個(gè)結(jié)構(gòu)體數(shù)組

2.我們觀察下這個(gè)結(jié)構(gòu)體數(shù)組, 同時(shí)我們上面分析得到這個(gè)結(jié)構(gòu)體數(shù)組中每個(gè)結(jié)構(gòu)體大小為0x60

3.同時(shí)我們發(fā)現(xiàn)在每個(gè)0x60大小的結(jié)構(gòu)體中還有一個(gè)結(jié)構(gòu)體數(shù)組

4.我們進(jìn)入分析看看,居然發(fā)現(xiàn)這個(gè)結(jié)構(gòu)體數(shù)組中,每個(gè)大小為0x18,同時(shí)每個(gè)結(jié)構(gòu)體+8 +10的2個(gè)對(duì)象就是我們寫(xiě)入上面rdx堆棧地址中的2個(gè)值

5.原來(lái)如此,此時(shí)我們就找到了遍歷所在
6.但是!細(xì)心的同學(xué)發(fā)現(xiàn)我們的物品不是有32個(gè)嗎,這個(gè)結(jié)構(gòu)體數(shù)組才0xE

7.對(duì)的,的確是這樣的,其實(shí)正如上面我們所看到的,在rcx對(duì)象中有0x60結(jié)構(gòu)體,而每0x60結(jié)構(gòu)體中+8 +10有一個(gè)物品結(jié)構(gòu)體0x18數(shù)組
8.那么也就是把所有0x60結(jié)構(gòu)體的物品0x18大小結(jié)構(gòu)體數(shù)量加起來(lái)應(yīng)該就是我們物品總數(shù)了
9.我們看看剛好前3個(gè)0x60結(jié)構(gòu)體的物品0x18大小結(jié)構(gòu)體一共有32個(gè),這就對(duì)了

10.這里再說(shuō)下,為什么有3個(gè)0x60結(jié)構(gòu)體呢?
11.其實(shí)觀察過(guò)這個(gè)游戲的同學(xué)就明白了!我們看看這個(gè)背包界面他有3個(gè)類型按鈕,然后再數(shù)一數(shù)物品數(shù)量,你就明白啦?。?!



12.好了,到這里我們整個(gè)遍歷就找到了,還是比較簡(jiǎn)單,只是在這個(gè)CALL內(nèi)部需要分析一段時(shí)間,但是呢有經(jīng)驗(yàn)的同學(xué)其實(shí)根本不用去分析匯編了,只需要觀察這個(gè)結(jié)構(gòu)體數(shù)組我們?nèi)シ环瓋?nèi)存就能分析出來(lái)!
13.到這里我們分析了遍歷,知道了遍歷就在rcx對(duì)象中,那么rcx對(duì)象存在哪里呢???這個(gè)時(shí)候就需要往上分析找來(lái)源啦,這個(gè)步驟相對(duì)來(lái)說(shuō)就簡(jiǎn)單了很多!
尋找rcx來(lái)源
1.發(fā)現(xiàn)rcx來(lái)源[rcx+38]

2.這時(shí)候rcx就是一個(gè)對(duì)象了,因?yàn)槲覀冊(cè)?0的地方看到了虛函數(shù)表首地址

3.繼續(xù)分析找來(lái)源,發(fā)現(xiàn)來(lái)源rsi,結(jié)果在上面就看到來(lái)源一個(gè)CALL的返回值

4.進(jìn)入CALL,分析

5.輕松的找到偏移表達(dá)式:[[[0x00007FF798D8E448]+30]+28] 是一個(gè)對(duì)象數(shù)組,而我們需要的rcx對(duì)象在這個(gè)對(duì)象數(shù)組索引為0x4的地方

6.這個(gè)4來(lái)源是哪里呢?其實(shí)就是這個(gè)CALL的參數(shù)傳遞進(jìn)來(lái)的0xC,然后在CALL內(nèi)部被計(jì)算成了4,其實(shí)我們寫(xiě)死就行了,因?yàn)檎{(diào)用這個(gè)CALL的時(shí)候,匯編也是寫(xiě)死的

7.好了我們整個(gè)背包物品遍歷數(shù)據(jù)分析就到此結(jié)束了
8.敲了這么多字,希望大家喜歡,感謝同學(xué)們支持迪大學(xué)院285530835
9.多多點(diǎn)贊和收藏
