012 分析技能冷却二叉树
文章目錄
- 前言
- 技能冷卻二叉樹
- 獲取技能名稱
- 總結(jié)
前言
學(xué)習(xí)完了最常用的數(shù)據(jù)結(jié)構(gòu),我們?cè)賮矸治鲇螒蛑衅渌墓δ?#xff0c;盡量將游戲中的所有數(shù)據(jù)分析完全,為后面的實(shí)際應(yīng)用積累經(jīng)驗(yàn)。
對(duì)于RPG游戲來說,技能數(shù)據(jù)是必不可少的。這次我們就來找技能相關(guān)的數(shù)據(jù)。
技能冷卻二叉樹
想要找到技能相關(guān)的數(shù)據(jù)結(jié)構(gòu),可以有很多突破口,比如技能名稱,技能ID,技能冷卻時(shí)間等等。以技能冷卻時(shí)間為例,找一下當(dāng)前的技能數(shù)據(jù)。
首先找到一個(gè)技能冷卻時(shí)間長的技能,以技能的當(dāng)前冷卻時(shí)間為突破口來找技能數(shù)據(jù)。
以這個(gè)技能為例,釋放技能,此時(shí)處于冷卻狀態(tài),冷卻時(shí)間開始倒計(jì)時(shí)。 在CE中選擇浮點(diǎn)型,未知初始值
然后一直掃描減少的數(shù)值
最后從多個(gè)結(jié)果中很容易就能找到唯一一個(gè)和當(dāng)前冷卻時(shí)間相同的數(shù)值。然后對(duì)這個(gè)地址下硬件訪問斷點(diǎn)
斷點(diǎn)斷下,ecx+0x10是技能的冷卻時(shí)間。在這個(gè)地方下斷點(diǎn),一直F9運(yùn)行,發(fā)現(xiàn)ecx的值是不變的。
接著再次釋放技能,ecx的值會(huì)在兩個(gè)數(shù)值間變化。
就是說這個(gè)位置是所有處于冷卻狀態(tài)下的技能才會(huì)訪問的代碼。那么最后我們會(huì)追到數(shù)據(jù)結(jié)構(gòu),里面存放的是所有處于冷卻狀態(tài)中的技能。
繼續(xù)往上追ecx的值
ecx來源于[edi+0x10],觀察edi的值,此時(shí)edi依然是兩個(gè)值變化的
冷卻時(shí)間=[edi+0x10]+0x10edi來源于[eax]。此時(shí)eax不再發(fā)生變化,盡管這個(gè)時(shí)候有兩個(gè)技能處于冷卻狀態(tài)。根據(jù)之前的經(jīng)驗(yàn),說明這段代碼中有循環(huán)改變了寄存器的值。
找到向上的跳轉(zhuǎn),確定循環(huán)頭部和尾部。
下面有第二個(gè)循環(huán),頭部和第一個(gè)循環(huán)頭部一樣。
第三個(gè)循環(huán),頭部也和第一個(gè)循環(huán)頭部一樣
第四個(gè)循環(huán),頭部和第一個(gè)循環(huán)頭部一致。
繼續(xù)追edi,無論是第幾個(gè)循環(huán),edi都來自[ebp-0x8],[ebp-0x8]作為局部變量,肯定中間有一個(gè)call會(huì)改變它的值
單步步過這個(gè)call,發(fā)現(xiàn)[ebp-8]被改變了,這個(gè)call傳入一個(gè)對(duì)象指針,然后返回一個(gè)新的對(duì)象。
跟之前分析過的二叉樹幾乎完全一樣,要么拿到根節(jié)點(diǎn)調(diào)用call取下一個(gè)對(duì)象,要么下訪問斷點(diǎn)找到遍歷的代碼。
還是在這個(gè)地方對(duì)數(shù)據(jù)下訪問斷點(diǎn),斷點(diǎn)斷下。這個(gè)地方的代碼和之前一模一樣,是一個(gè)標(biāo)準(zhǔn)的二叉樹遍歷。
冷卻時(shí)間=[eax+0x10]+0x10[eax]是二叉樹的左子樹,[eax+8]是右子樹。[eax+0x15]是結(jié)束標(biāo)志位,[eax+C]是技能ID。繼續(xù)往上可以把整個(gè)偏移表達(dá)式追出來,這里省略過程。
獲取技能名稱
找到了技能的冷卻時(shí)間二叉樹,接著來找技能名稱的數(shù)據(jù)結(jié)構(gòu)。由于幻想神域這個(gè)游戲是用的繁體字,所以這里需要用到一個(gè)轉(zhuǎn)換工具,將Big5編碼的繁體字轉(zhuǎn)換為GBK編碼的十六進(jìn)制。
隨意選取一個(gè)技能名稱,用工具轉(zhuǎn)換為字節(jié)集
然后在CE中搜索字節(jié)數(shù)組,字節(jié)尾部加上00
掃描出了五個(gè)結(jié)果,分別對(duì)五個(gè)值就行修改,即可篩選出唯一一個(gè)技能名稱。
接著在這個(gè)位置下硬件訪問斷點(diǎn)
打開技能欄讓斷點(diǎn)斷下,[esi+ecx*4-8]就是當(dāng)前的技能名稱。這里由于所有的字符串經(jīng)過這里都會(huì)斷下,并不僅限于技能名稱,所以就不太好追。
可以用到一個(gè)技巧
復(fù)制esi的值,在棧窗口點(diǎn)擊查找,一直按Ctrl+l找到堆棧中第一次出現(xiàn)的位置
這里esi是上面的返回地址中的第三個(gè)參數(shù),反匯編窗口跟隨第三個(gè)地址繼續(xù)追第三個(gè)參數(shù)
第三個(gè)參數(shù)是edx
edx來源于ebx+edx,但是ebx的值為0,所以不用管繼續(xù)往上追
edx來源于[eax+4]
eax來源于[ebp+8],也就是第一個(gè)參數(shù)。這里返回上一層不能直接下軟件斷點(diǎn),否則會(huì)得到錯(cuò)誤的調(diào)用關(guān)系,必須在之前的數(shù)據(jù)下訪問斷點(diǎn)。
第一個(gè)參數(shù)是ecx,這個(gè)地方是技能名稱的訪問代碼,其他字符串不會(huì)斷下。ecx來源于ecx+0x100,又來源于[ebp+0x10],上一層的第三個(gè)參數(shù),繼續(xù)下斷返回
第三個(gè)參數(shù)是esi,繼續(xù)往上找esi
esi來源于eax,eax是上一個(gè)函數(shù)的返回值。這個(gè)call的內(nèi)部邏輯比較復(fù)雜,里面還調(diào)用了之前分析過的數(shù)組下標(biāo)加密的代碼,就沒必要繼續(xù)往上追了
直接分析參數(shù),eax是技能ID,返回的eax是技能對(duì)象,我們可以通過調(diào)用這個(gè)call來獲取技能名稱。
實(shí)際效果如圖:
總結(jié)
分析完了技能冷卻二叉樹,相當(dāng)于是復(fù)習(xí)了一下之前學(xué)過的內(nèi)容,這種類似的數(shù)據(jù)結(jié)構(gòu),后面會(huì)碰到很多。
對(duì)于數(shù)據(jù)結(jié)構(gòu)的逆向,需要在追蹤寄存器的過程中每一步都觀察寄存器的變化,然后通過當(dāng)前的變化分析附近的代碼,從而分析出數(shù)據(jù)結(jié)構(gòu)。
最后,附上Github地址,里面有游戲下載鏈接和相關(guān)工具,需要請(qǐng)自取:
https://github.com/TonyChen56/GameReverseNote
總結(jié)
以上是生活随笔為你收集整理的012 分析技能冷却二叉树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 011 数据结构逆向—二叉树
- 下一篇: PC微信逆向:分析通用设置数组