红色警戒2修改器原理百科(五)
??? 都第五篇了,好長,這是個坑,沒多少人看為什么要寫這個,我就當是為了部落……還有什么沒寫?選中單位3星,隨處建造(優(yōu)雅),科技全開,轉(zhuǎn)移單位所屬(優(yōu)雅),立即勝利(這個這個不怎么好意思發(fā),我自己沒找到)。還有地圖其他玩家數(shù)據(jù),當然還有我目前還沒試過的出售建筑CALL,自動修理,枚舉地圖上全部單位(然后可以配合出售建筑,賣掉全部不屬于自己的)還要寫多少篇才能完結(jié)呢。。還還有心靈探測(從來不想實現(xiàn),去造個心靈探測器會死),奶牛總統(tǒng)等特殊兵種(紅警全能王谷子貓綠色珍藏版中的自定義函數(shù)好長好復雜,紅色警戒2修改大師貌似是Timer不斷修改內(nèi)存數(shù)據(jù),想找個更優(yōu)雅的方式),需求不太高的建造隊列上限(V1.006官方版是30,共和國之輝99),建造個數(shù)上限(抱歉,筆者沒發(fā)現(xiàn)有個數(shù)上限),還有傳說中我都沒用過的可聯(lián)網(wǎng)用的切換陣營,遭遇戰(zhàn)參數(shù)修改。坑越挖越大
??? 來吧,跟我繼續(xù)填坑,這一篇就講選中單位3星吧。
(十一)選中單位升3星——三步走
1.尋找單位的血量——第一步,把冰箱門打開
??? 首先查找到一個單位的血量,然后根據(jù)誰修改了這個值,就能找到這個單位對象的起始地址。
??? 做好準備工作,造一個盟軍戰(zhàn)車工廠A,一輛灰熊坦克。精確搜索4字節(jié)數(shù)值1000,讓灰熊坦克去打一下,只打一下,然后搜索958——也就是灰熊坦克打盟軍戰(zhàn)車工廠的傷害是42。重復2~3次,就能得到3個左右的地址,依次嘗試修改吧。然后查找誰修改了這個值,但千萬別摧毀了此建筑。得到指令005D3E65 - mov [esi+6C],eax,但這不重要,ESI的值對下一步才重要,還有+6C就是單位HP的偏移。記下ESI的值,即戰(zhàn)車工廠對象的起始地址,此處記作地址A=0C5D7648。
??? 再建造一座盟軍戰(zhàn)車工廠B,重復以上步驟找到其起始地址B=0745FF70。
2.尋找選中單位指針——第二步,把大象放進冰箱
??? 現(xiàn)在你的CT表中應該有4個地址:
??? 然后游戲選中盟軍戰(zhàn)車工廠A,新搜索精確數(shù)值地址A(0C5D7648),然后選中盟軍戰(zhàn)車工廠B,搜索精確數(shù)值地址B(0745FF70)。應該只剩一個結(jié)果了,記作指針A=0D7B44D0,將其添加到CT表,不是的話,重復上述步驟。
??? 選擇灰熊坦克,指針A的值會變成另一個,記作地址C=07781CD8,然后+6C=07781D44,07781D44這個地址就是灰熊坦克HP的地址。將其鎖定,然后建造另一輛坦克去攻擊它,如果一直打不死,說明指針A正確,指向的就是當前選中單位。
??? 然后搜索指針A的地址0D7B44D0,就能得到當前選中單位的基址[game.exe+640C64],然后找到選中單位的數(shù)量基址game.exe+640C70。
3.完成修改3星——第三步,把冰箱門關(guān)上
??? 單位等級偏移是+11C,修改成0x40000000就是3星。最簡單的實現(xiàn)選中3星,用Timer完成:1.首先獲取選中單位數(shù)目。2.從選中單位基址讀取第一個選中單位的起始地址,基址+4就是第二個單位的起始地址,+8就是第三個選中單位……3.修改所有選中單位的等級。
??? 這里有一個大概的游戲單位對象描述,這些東西都是通過分析和對比得出來的(CE有個功能叫分析數(shù)據(jù)/結(jié)構(gòu)):
class GameUnit : public BaseA, public BaseB, public BaseC, public BaseD {//從內(nèi)存結(jié)構(gòu)上來講,起始地址的前4個DWORD,就是虛函數(shù)表指針...DWORD dwTrigger; //+34,關(guān)聯(lián)標記(用過地圖編輯器就知道了),鏈表int nGroup; //+1AC,所在編隊0~9int nHP; //+6Cint nX; //+1A0,X坐標int nY; //+1A4DWORD dwGrade; //+11C,等級Player* pOwner; //+1B4,所屬者....//sizeof=0x608,因為繼承了4個類,上面的這些可能都是基類的內(nèi)容//詳請百度C++多繼承內(nèi)存布局 }??? 但是上面給出的實現(xiàn)選中3星有2個問題,一是沒有判斷是不是玩家的單位,偶然點了一下電腦的兵,也變成3星了……,解決方法:判斷pOwner指針是不是指向玩家;二是建筑物也能變成3星……解決方案是,根據(jù)第一個DWORD,也就是第一個函數(shù)表指針,判斷單位類型。我實在是沒找到有什么變量指示了類型,只能用函數(shù)表指針了。(后注:最后一篇——第十篇,給出了一個極有可能是獲取類型的成員函數(shù))
(十二)優(yōu)雅的轉(zhuǎn)移單位所屬——升3星引發(fā)的血案
??? 上面看到有一個pOwner指向單位的所屬者,如果把電腦的單位,修改成指向玩家的呢。經(jīng)過測試,修改后確實可以控制或出售。但是帶來一些問題:
1.如果你強行修改了電腦的基地,并賣掉了,接下來摧毀了所有電腦的剩余單位,發(fā)現(xiàn)并不能取得勝利。這是因為,游戲的數(shù)據(jù)記錄亂了——電腦在某些情況下認為他還有一個基地,但是卻又不能用這個基地造東西;想賣掉投降,確又發(fā)現(xiàn)沒有建筑可賣。靈異事件發(fā)生,不知道如何處理,只好尷尬的不能讓你贏了。
2.如果你把電腦的兵營占有,會發(fā)現(xiàn)不能造對方的兵種。這就說明還有一些操作沒有完成,比如增加建造選項。
3.如果你把一個沒人占用的油田更改給自己,卻發(fā)現(xiàn)油田根本不工作。這就說明還有一系列操作用來激活油井。
??? 最容易想到的解決方法就是,同時修改相關(guān)聯(lián)的數(shù)據(jù),然后調(diào)用相關(guān)函數(shù)完成操作,難度系數(shù)4星半。分析出完整的數(shù)據(jù)結(jié)構(gòu)那是相當不容易,還要寫復雜的腳本完成善后的操作。但是,換個角度想想,游戲中應該有相應的完整的函數(shù)。因為玩任務模式的時候,經(jīng)常會觸發(fā)事件,然后別人的建筑變成我方建筑了。
??? 最初查找誰修改了所屬,然后是用工程師去占領(lǐng)建筑,找到一個更改所屬的CALL,相關(guān)位置:
??? 然而使用上面的CALL還是存在油井不工作的問題(筆者后注:其實上面的CALL返回第二層,依然能找到類似下面的代碼從而解決問題,只是當時過分迷戀地圖編輯器了,不過也有額外收獲)。
??? 于是我去創(chuàng)建了一個自定義地圖,當我建造一個修理廠的時候,把地圖上的核彈發(fā)射井轉(zhuǎn)移給我。查找誰修改了所屬者,第一層返回,還是CALL上面的同一個函數(shù)地址:
繼續(xù)返回第二層,來到這里:
??? 分析這附近的代碼(截圖范圍不夠大),收獲有:地圖上所有單位數(shù)目(敵方、我方及中立的建筑、步兵和坦克等)(game.exe+640C30),地圖上所有單位數(shù)組(game.exe+640C24),游戲單位的+34偏移是觸發(fā)關(guān)聯(lián)標記,一個鏈表。由此可以遍歷地圖上所有單位。
??? 最后寫出轉(zhuǎn)移所屬的腳本:
//轉(zhuǎn)移單位所屬,可勝利 pushad push 0 //提示語音 mov eax,[00A35DB4] //當前玩家數(shù)據(jù)基址 push eax //轉(zhuǎn)移給誰 mov eax,[00A40C64] //當前選中第一個單位基址 mov ecx,[eax] //ECX=單位地址 mov ebx,[ecx] call [ebx+378] //更改所屬函數(shù) popad ret??? 還可以得出一個問題,CALL [EBX+378],EBX指向游戲單位的第一個函數(shù)表,0x378偏移說明是第222個函數(shù)……好大一個類,還能維護么,好替它擔心。
To be continued…
轉(zhuǎn)載請注明來源,http://www.cnblogs.com/viewll/p/4770378.html
轉(zhuǎn)載于:https://www.cnblogs.com/viewll/p/4770378.html
總結(jié)
以上是生活随笔為你收集整理的红色警戒2修改器原理百科(五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Modbus通信协议格式以及功能码
- 下一篇: 大一上:计算机导论复习(每章分值、常考题