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