紅色警戒2逆向系列:使用ScyllaHide反反調(diào)試
所以這一期我研究了好久,最后想出了一個(gè)可能是辦法的辦法,記錄一下,也請(qǐng)大佬指教,因?yàn)榫W(wǎng)上關(guān)于這個(gè)的內(nèi)容實(shí)在是有點(diǎn)少
所以我本來是這么想的,通過找到檢測(cè)調(diào)試器的代碼,然后把這些代碼給Hook了。但是這樣顯然就會(huì)遇到一個(gè)問題。那就是首先需要靜態(tài)分析找到反調(diào)試的代碼。這樣的工作量巨大,而且有一些動(dòng)態(tài)調(diào)用涉及到大量的指針操作,要找到指針的指向又需要用調(diào)試器,但是反調(diào)試機(jī)制又不讓我們調(diào)試,所以是一個(gè)非常棘手的問題。
方案二就是使用虛擬機(jī),但是我不喜歡這個(gè)方案,因?yàn)槲业碾娔X比較差(一個(gè)后端開發(fā)人員的電腦居然很差)。所以我也沒有這么做
所以我想選擇一些反反調(diào)試器。所以我就選擇了ScyllaHide來反反調(diào)試。從GitHub上下載了ScyllaHide的插件,然后又把它裝到了x32GDB上,然后點(diǎn)擊plugin ->?ScyllaHide -> AttachProcess中,然后把PID填寫進(jìn)去,大概就是這樣:

選擇attach,這個(gè)時(shí)候再進(jìn)入游戲,發(fā)現(xiàn)并沒有卡死,成功繞開了反調(diào)試機(jī)制。
由此我還想出來一個(gè)賴皮的招數(shù),就是在快被對(duì)手打死的時(shí)候,使用GDB調(diào)試一下,然后就會(huì)觸發(fā)反調(diào)試,我和對(duì)手就會(huì)卡死,然后等個(gè)1個(gè)小時(shí)對(duì)手退了,再退出GDB,恢復(fù)游戲(開玩笑的,好孩子不要學(xué))
之前用的一直是Ghidra,所以可以給大家看C語言代碼。雖然這個(gè)C語言代碼質(zhì)量不高,但是大家都喜聞樂見。不過換到x32GDB的時(shí)候就要看匯編語言代碼了,請(qǐng)大家做好心理準(zhǔn)備(大概)
接下來我們就要分析debugLogger函數(shù)了,有一個(gè)問題就是戰(zhàn)網(wǎng)版本的紅警刪除了所有的調(diào)試信息。我在上一篇還吐槽了西木工作室的開發(fā)人員懶,沒想到他們?cè)谟壤锏膹?fù)仇版本把調(diào)試信息刪除了。不過原版和尤復(fù)幾乎完全一樣,所以我們可以通過學(xué)習(xí)原版的結(jié)構(gòu)來推算尤里的復(fù)仇版本。
通過點(diǎn)進(jìn)DebugLogger函數(shù)然后尋找調(diào)用該函數(shù)的函數(shù)(也就是點(diǎn)function?call trees,然后看ingoing call),我們可以發(fā)現(xiàn)一些有意思的代碼,比方說讀取各種ini文件的,像
之類的,也許Ares的作者當(dāng)年也看到了這些,所以開發(fā)出了Ares。
DebugLogger還提示了很多關(guān)于網(wǎng)絡(luò)的信息,這些信息我們?cè)谥蟮奈恼吕飼?huì)仔細(xì)分析,這對(duì)我們開發(fā)更多人的模式可能有幫助
下集預(yù)告:我也不知道下集要寫啥,可能是通過spy++和x32GDB查看點(diǎn)擊某個(gè)位置造成的邏輯變化,從而定位一些重要的函數(shù),方便我們之后Hook