首页>游戏>mod模组>尤里的复仇长篇战役包
尤里的复仇长篇战役包
尤里的复仇长篇战役包

尤里的复仇长篇战役包

高速下载 普通下载
10
详情 同类热门 热门攻略
  • 尤里的复仇长篇战役包
  • 尤里的复仇长篇战役包
  • 尤里的复仇长篇战役包
详情

尤里的复仇长篇战役包增加了新的阵营尤里以及相关的战役和单位。以下是“尤里的复仇”盟军和苏军的部分战役关卡说明及攻略:开头可轻易占领右上部的三个盟军基地,但中部的盟军基地光棱塔众多,可采取迂回战术,从后面绕过去,那里几乎没有防守,摧毁电厂后占领基地,出光棱坦克摧毁爱因斯坦实验室。若未能占领也没关系,可造基洛夫飞艇硬冲,目标仅有两个。

玩法攻略

尤里的复仇新手指南

盟军

第一回:光阴似箭

地点:加利福尼亚州旧金山

故事内容:时间紧迫,尤里即将让恶魔岛上的心灵控制器发挥作用,而阻止他的唯一机会是利用爱因斯坦教授的时间机器回到过去,在他完成心灵控制器的全球网络连线前进行阻止。

任务内容:

占领提供时间机器电力的发电厂。

保卫时间机器。

摧毁在恶魔岛的心灵控制器。

攻略要点:

任务开始没有足够电力供应时间机器,需占领至少四个公共电厂,位于地图左下方,小心尤里士兵占领的沿路房屋,可使用幻影坦克在其打不到的位置慢慢攻击,或多造灰熊坦克硬冲。工程师占领电厂后谭雅会进入时间机器,此时苏军会大举进攻,注意维修巨炮以打掉无畏级战舰,同时防范基洛夫飞艇,多造几个盟军的“守卫大兵”(GUARDIAN G.I.)。谭雅从时间机器出来后,指挥她游泳渡海到达恶魔岛,炸掉心灵控制器即可完成任务。

第二回:好莱坞,梦一场

地点:洛杉矶,好莱坞

故事内容:尤里已心灵控制洛杉矶的人们,并将他们送进部队回收站换取资源,以供应庞大的心灵控制器工程,若能摧毁这些回收站,尤里将失去巨大资源来源。

任务内容:

摧毁城市里所有的部队回收站。

摧毁所有尤里的建筑。

攻略要点:

这一关的任务实际就是全歼敌人。电脑会提示占领(LAX)以获得伞兵通道,但它周围有四个盖特机炮,初期不要去打。开始时用美国大兵占领房子很重要,出四至五架光棱坦克和四至五架幻影坦克后,可去摧毁盖特机炮并占领 LAX,也可直接绕过攻打尤里的部队回收站。尤里基地有两个,分别在上左和上中,打掉总部、战车工厂和兵营他就会卖掉。注意不要用光棱坦克和尤里的矿车硬拼,且并非所有人质都被心灵控制,有些可能在战斗中提供帮助。

苏军

第一关:时间转移

地点:加利福尼亚州旧金山

任务内容:

摧毁盟军的海军和巨炮。

摧毁超时空传送器周围的四个机枪碉堡,然后占领超时空传送器。

占领四个电厂给时间机器提供电力。

控制苏军基地并摧毁“心灵主宰”(psychic dominator)。

攻略要点:

此关开始尤里新兵会不断上岸争夺发电厂,需派工程师修理地图上方仓库并派动员兵驻守来抵挡。回到恐龙时代后,立刻派运输船到地图左上角小岛,找到霸王龙加入我方。当回到新时间线时,霸王龙会成为强大助力。护送能召唤米格战斗机的苏联特种兵鲍里斯到达时间机器,剩下的可交给他处理。占领时间机器和足够电厂后,需面对一群恐龙。之后将鲍里斯用运兵船运到小岛,用他的激光制导仪对准主宰,即可摧毁。

第二关:似曾相识

地点:黑森林

任务内容:

摧毁保卫德国边界的前哨基地。

摧毁爱因斯坦的实验室和他的超时空传送器。

修改版资源与介绍

这是中国玩家自制的(就是此账号up主修改的,现在叫网瘾大侠)基于“命令与征服:红色警戒2尤里的复仇1.001繁体中文版”制作的修复/调整原版资源、规则属性的一套补丁;这些补丁是单独的资源文件,直接拷贝粘贴至尤里的复仇根目录下即可,可按需使用单独的文件资源;这些补丁是免费的、可移植的、自由修改的。

注意:这不是完整可直接运行的游戏,这仅是补丁文件,需要你先有原版红色警戒2尤里的复仇1.001才能使用;如果你的游戏集成过 cncnet 平台或其它,那这应该不大一样,就需要你自行研究使用这些资源了。

受限于B站文章板块的要求,此篇文章不再提供具体的更新介绍,可在下载的资源包中查看具体的更新介绍;如下图,因为B站中文章有修改次数限制,而且这个编辑器很难用、有很多错误和问题。

尤里的复仇科技全开

上一次我们讲到了无限核弹。

红色警戒实现无限核弹的艰辛之路

https://www.52pojie.cn/thread-935581-1-1.html

(出处: 吾爱破解论坛)

[mw_shl_code=cpp,true]pushad

mov ecx,0x14

call 006ceeb0

mov ebx,eax

mov eax,[ebx+98]

mov edx,[00a83d4c]

mov ecx,[edx+258]

push 0

push 0

mov ecx,[ecx+eax*4]

push 1

call 006CB560

mov eax,[ebx+98]

mov ecx,0087f7e8

push eax

push 1f

call 006a6300

popad

ret[/mw_shl_code]

在逆向总结那一节里,我们提到了NewConstructionOptions的那个call。进去之后可以发现一个大大的switch结构。

[mw_shl_code=asm,true]006CC103 |> \6A FF push -0x1 ; Case 0 of switch 006CC0F3

006CC105 |. 83CA FF or edx,-0x1

006CC108 |. B9 D4248400 mov ecx,gamemd.008424D4 ; EVA_NuclearMissileReady

006CC10D |. EB 6A jmp short gamemd.006CC179

006CC10F |> 6A FF push -0x1 ; Case 1 of switch 006CC0F3

006CC111 |. 83CA FF or edx,-0x1

006CC114 |. B9 BC248400 mov ecx,gamemd.008424BC ; EVA_IronCurtainReady

006CC119 |. EB 5E jmp short gamemd.006CC179

006CC11B |> 6A FF push -0x1 ; Case A of switch 006CC0F3

006CC11D |. 83CA FF or edx,-0x1

006CC120 |. B9 A4248400 mov ecx,gamemd.008424A4 ; EVA_ForceShieldReady

006CC125 |. EB 52 jmp short gamemd.006CC179

006CC127 |> 6A FF push -0x1 ; Case 2 of switch 006CC0F3

006CC129 |. 83CA FF or edx,-0x1

006CC12C |. B9 8C248400 mov ecx,gamemd.0084248C ; EVA_LightningStormReady

006CC131 |. EB 46 jmp short gamemd.006CC179

006CC133 |> 6A FF push -0x1 ; Case 7 of switch 006CC0F3

006CC135 |. 83CA FF or edx,-0x1

006CC138 |. B9 70248400 mov ecx,gamemd.00842470 ; EVA_PsychicDominatorReady

006CC13D |. EB 3A jmp short gamemd.006CC179

006CC13F |> 6A FF push -0x1 ; Case 3 of switch 006CC0F3

006CC141 |. 83CA FF or edx,-0x1

006CC144 |. B9 58248400 mov ecx,gamemd.00842458 ; EVA_ChronosphereReady

006CC149 |. EB 2E jmp short gamemd.006CC179

006CC14B |> 6A FF push -0x1 ; Cases 5,6 of switch 006CC0F3

006CC14D |. 83CA FF or edx,-0x1

006CC150 |. B9 40248400 mov ecx,gamemd.00842440 ; EVA_ReinforcementsReady

006CC155 |. EB 22 jmp short gamemd.006CC179

006CC157 |> 6A FF push -0x1 ; Case 8 of switch 006CC0F3

006CC159 |. 83CA FF or edx,-0x1

006CC15C |. B9 2C248400 mov ecx,gamemd.0084242C ; EVA_SpyPlaneReady

006CC161 |. EB 16 jmp short gamemd.006CC179

006CC163 |> 6A FF push -0x1 ; Case 9 of switch 006CC0F3

006CC165 |. 83CA FF or edx,-0x1

006CC168 |. B9 14248400 mov ecx,gamemd.00842414 ; EVA_GeneticMutatorReady

006CC16D |. EB 0A jmp short gamemd.006CC179

006CC16F |> 6A FF push -0x1 ; Case B of switch 006CC0F3

006CC171 |. 83CA FF or edx,-0x1

006CC174 |. B9 FC238400 mov ecx,gamemd.008423FC ; EVA_PsychicRevealReady

006CC179 |> E8 82650800 call gamemd.00752700

006CC17E |> 8B0D 84EDA800 mov ecx,dword ptr ds:[0xA8ED84] ; Default case of switch 006CC0F3

[/mw_shl_code]

根据各种case,我们可以获得超级武器的编号:

0 Nuclear Missle(核弹)

1 Iron Curtan(铁幕,也就是台湾人翻译的无敌)

A force shield(立场护盾,你造了高科之后的那个蓝蓝的东西,跟铁幕差不多,但是只能套建筑)

2 Lightning storm(闪电风暴,盟军的无污染超武,符合科学发展观)

7 PsychicDominator(心灵控制,尤里的无污染超武)

…………

剩下我就不说了,大家都识字。。自己去上面的代码里翻。。

有了这些编号,我们是不是可以调用这些超武呢?

[mw_shl_code=asm,true]pushad

mov ecx,0x14

call 006ceeb0

mov ebx,eax

mov eax,[ebx+98]

mov edx,[00a83d4c]

mov ecx,[edx+258]

push 0

push 0

mov ecx,[ecx+eax*4]

push 1

call 006CB560

mov eax,[ebx+98]

mov ecx,0087f7e8

push eax

push 1f

call 006a6300

popad

ret[/mw_shl_code]

这些参数的哪些表示超级武器呢?

根据上一节的提示,第一个call是获取eax的。而eax就是超级武器编号,那么我们直接修改eax行不行呢?

我们发现,修改eax的只有mov eax,[ebx+98]。那我们把ebx+98变成1,得到:

[mw_shl_code=asm,true]pushad

mov ecx,0x14

call 006ceeb0

mov ebx,eax

mov eax,[ebx+98]

mov edx,[00a83d4c]

mov ecx,[edx+258]

push 0

push 0

mov ecx,[ecx+eax*4]

push 1

call 006CB560

mov eax,1

mov ecx,0087f7e8

push eax

push 1f

call 006a6300

popad

ret[/mw_shl_code]

立刻注入,发现:

此时发现:

又是那个不能用的超级武器。。

那说明没有调整cd

而出现了核弹0:00说明调整的是核弹的cd。。

那肯定是调整cd那个call参数错了。。

上面那个参数忘记改了。。

重写代码,得到:

[mw_shl_code=asm,true]pushad

mov ecx,0x14

call 006ceeb0

mov ebx,eax

mov eax,1

mov edx,[00a83d4c]

mov ecx,[edx+258]

push 0

push 0

mov ecx,[ecx+eax*4]

push 1

call 006CB560

mov eax,1

mov ecx,0087f7e8

push eax

push 1f

call 006a6300

popad

ret[/mw_shl_code]

再次注入:

{:301_993:}

不过我们发现一个尴尬的事情,用完之后那个铁幕选项不会消失。。

管它呢,反正我也不追求完美2333

同理,可以得到其他超级武器

因此,我们得到超级武器的注入代码为:

[mw_shl_code=asm,true]pushad

mov ecx,0x14

call 006ceeb0

mov ebx,eax

mov eax,2//此处为超级武器编号

mov edx,[00a83d4c]

mov ecx,[edx+258]

push 0

push 0

mov ecx,[ecx+eax*4]

push 1

call 006CB560

mov eax,2//此处为超级武器编号

mov ecx,0087f7e8

push eax

push 1f

call 006a6300

popad

ret[/mw_shl_code]

到了这里,还有几个人记得住我们的题目?

对,没错,科技全开。。

顾名思义,添加所有能够添加的建造选项。

那肯定是最后一个call的事情了。

mov ecx,0087f7e8

push eax

push 1f

call 006a6300

popad

ret

我们知道eax是超级武器编号,那么1f是否为类型呢?

我们跟进最后一个增加建造选项的call,发现又是一个大大的switch。

在这里下断点,然后窗口化运行程序,动态调试,当建造选项增加的时候会断下来。

依次造步兵、建筑、坦克,得到:

再看刚刚的代码,1f表示的就是超级武器。

因此,假如我们想要科技全开,首先要做到建筑全开。

然后有个猜想,建筑就不用调cd了吧,都是54下。。

建筑cd相关帖子:

论红色警戒2尤里的复仇如何实现秒建

https://www.52pojie.cn/thread-846492-1-1.html

(出处: 吾爱破解论坛)

那我们直接调用最后一个call

先改个7

[mw_shl_code=asm,true]

pushad

mov ecx,0087f7e8

mov edx,[00a83d4c]

mov eax,0

push eax

push 7

call 006a6300

popad

retn[/mw_shl_code]

提醒一句,前面基地址啊还有字符串的参数该传还要传。。

eax我们先改成0,看看注入后会出现什么。(因为下标一般都从0开始)

然并卵。。

猜想原因:0这个建筑就是盟军电场,因为游戏是美国人做的,美国的建筑 的下标肯定靠前2333

那改成A

[mw_shl_code=asm,true]pushad

mov ecx,0087f7e8

mov edx,[00a83d4c]

mov eax,A

push eax

push 7

call 006a6300

popad

retn[/mw_shl_code]

精彩!

然后我们把自己的国家换成苏军,依次得到:

0=发电厂

1=盟军矿石精炼厂

2=盟军建造厂

3=盟军兵营

4=沙袋

5=盟军维修厂

6=盟军作[url=]5[/url]战实验室

7=盟军战车工厂

9=磁能反应炉

A=苏联作战实验室

这要试试到什么年份。。

我怎么知道所有建筑的编号。。

接下来是翻车时间:

——肯定不能这么试试,那我们看看有没有能找到建筑编号的地方,最好就像刚刚那种switch一样

跳转跟过来,得到:

跟进本switch每一个call,得到

最后问了一个红警ini大佬,得到了答案:

因此,可以得到一个简单粗暴的办法:用一个循环来搞定。

2019-5-19:纠正一个错误,上图的je应该写成jnz

这里给出红警大佬所给的全部代码

0=GAPOWR;盟军发电厂

1=GAREFN ;盟军矿厂

2=GAPILE ;盟军兵营

3=GAWEAP ;盟军兵工厂

4=GAAIRC ;盟军空军指挥部

5=AMRADR ;美国空军指挥部--AmericanParaDropSpecial

6=GADEPT ;盟军维修厂

7=GAYARD ;盟军船厂

8=GATECH ;盟军实验室

9=GAROBO; 控制中心 ---

10=GAOREP; 矿石精鍊器

11=GAWALL; 盟军围墙

12=GAPILL; 机枪碉堡---Vulcan2

13=NASAM ;爱国者飞弹 --RedEye2

14=GAGAP ;裂缝产生器

15=ATESLA ;光棱塔----PrismShot / PrismSupport

16=GASPYSAT; 间谍卫星

17=GACNST ;盟军建造场

18=GTGCAN ;法国巨炮  GrandCannonWeapon

19=GACSPH ;超时空传送仪 --- ChronoSphereSpecial

20=GAWEAT ;天气控制器 --- LightningStormSpecial

21=GASAND ;沙袋

22=GAGATE_A; 闸门

23=;===苏军======;

24=NAPOWR; 磁能反应炉

25=NAREFN ;苏军矿厂

26=NAHAND; 苏军兵营

27=NAWEAP; 苏军兵工厂

28=NARADR ;苏军雷达 --- SpyPlaneSpecial

29=NADEPT ;苏军维修厂

30=NAYARD ;苏军造船厂

31=NATECH ;苏军实验室

32=NANRCT ;核子反应堆 --- NukePayload

33=NAINDP ;工业工厂

34=NAWALL ;苏军围墙

35=NABNKR ;战斗碉堡

36=NALASR ;哨戒炮--Vulcan

37=NAFLAK ;防空炮--FlakWeapon

38=TESLA ;磁暴线圈 -- CoilBolt / OPCoilBolt

39=NACNST ;苏军建造厂

40=NAIRON ;铁幕 --- IronCurtainSpecial

41=NAMISL ;核弹发射井 -- NukeSpecial

42=NAPSYB ;心灵信标

43=;===尤里======;

44=YAPOWR ;生化反应炉

45=YAREFN ;奴隶矿厂

46=YABRCK ;尤里兵营

47=YAWEAP ;尤里兵工厂

48=NAPSIS ;心灵感应器 --- PsychicRevealSpecial

49=YAYARD ;尤里船厂

50=YAGRND ;部队回收厂

51=YATECH ;尤里实验室

52=GAFWLL ;尤里围墙

53=NATBNK ;坦克碉堡

54=YAGGUN ;盖特机炮

55=YAPSYT ;心灵控制塔----MultipleMindControlTower

56=NACLON ;复制中心

57=YAGNTC ;基因突变器 --- GeneticConverterSpecial

58=YAPPET ;心灵控制器 --- PsychicDominatorSpecial

59=YACNST ;尤里建造场

60=YAROCK ;不明建筑物

61=YACOMD ;尤里指挥中心

62=;===平======;

63=GASAND;沙墙

64=CAAIRP;科技机场---ParaDropSpecial

65=CAOILD;=科技钻油厂

66=CAPARS01;=艾菲尔铁塔

67=CAEAST02;=尤里雕像----PrismShot

68=CATRAN03;=尤里要塞

69=CAEAST01;=复活岛石像

[步兵类代码]

0=E1;美国大兵

1=E2;苏联动员兵

2=SHK;磁爆步兵

3=ENGINEER;盟军工程师

4=JUMPJET;火箭飞行兵

5=GHOST;海豹部队

6=YURI;尤里

7=IVAN;疯狂伊万

8=DESO;生化步兵

9=DOG;苏联军犬

10=CIV1;平民1

11=CIV2;平民2

12=CIV3;平民3

13=CTECH;技师

14=WEEDGUY;防IE挂载(没用)

15=CLEG;超时空兵团

16=SPY;间谍

17=CCOMAND;超时空突击队

18=PTROOP;伞兵

19=CIVAN;超时空伊万

20=YURIPR;尤里改

21=SNIPE;狙击手

22=COW;奶牛

23=ALL ;鳄鱼

24=TANY;谭雅

25=FLAKT;防空步兵

26=TERROR;恐怖分子

27=SENGINEER;苏联工程师

28=ADOG;盟军军犬

29=VLADIMIR;VLADIMIR

30=PENTGEN;PENTGEN

31=PRES;总统

32=SSRV;终级保镖

33=CIVA;德克萨斯平民A

34=CIVB;德克萨斯平民B

35=CIVC;德克萨斯平民C

36=CIVBBP;棒员运动员

37=CIVBFM;海滩肥男

38=CIVBF;海滩女

39=CIVBTM;海滩瘦男

40=CIVSFM;雪中肥男

41=CIVSF;雪中肥女

42=CIVSTM;雪中瘦男

43=POLARB;北极熊

44=JOSH;猴子

45=YENGINEER;尤里工程师

46=GGI;重装大兵

47=INIT;尤里新兵

48=BORIS;鲍裏斯

49=BRUTE;狂兽人

50=VIRUS;病毒狙击手

51=CLNT;快枪手

52=ARND;终结者

53=STLN;蓝波

54=CAML;骆驼

55=EINS;爱因斯坦

56=MUMY;木乃伊

57=RMNV;洛马诺夫总理

58=LUNR;登月火箭兵

59=DNOA;暴龙

60=DNOB;暴龙

61=SLAV;奴隶矿工

62=WWLF;(木乃伊)

63=YDOG;尤里军犬

64=YADOG;尤里军犬

65=CIVFM;海滩肥女

[战车类代码]

0=AMCV;盟军移动基地车

1=HARV;尤里奴隶采矿车

2=APOC;天启坦克

3=HTNK;犀牛坦克

4=SAPC;装甲运输船

5=CAR;汽车

6=BUS;校车

7=WINI;wini

8=PICK;小货车

9=MTNK;灰熊坦克

10=HORV;武装采矿车

11=TRUCKA;货车A

12=TRUCKB;货车B

13=CARRIER;航空母舰

14=V3;V3火箭车

15=ZEP;基洛夫空艇

16=DRON;恐怖机器人

17=HTK;防空履带车

18=DEST;驱逐舰

19=SUB;飓风级战舰

20=AEGIS;宙斯盾战舰

21=LCRF;盟军运输船

22=DRED;无畏级战舰

23=SHAD;夜鹰直升机

24=SQD;乌贼

25=DLPH;海豚

26=SMCV;苏联移动机基车

27=TNKD;坦克杀手

28=HOWI;榴弹炮

29=TTNK;磁爆坦克

30=LTNK;轻坦克

31=CMON;超时空采矿车(不回)

32=CMIN;超时空采矿车

33=SREF;光棱坦克

34=XCOMET;位置标定器

35=HYD;海蝎

36=MGTK;幻影坦克

37=FV;多功能步兵车

38=VLAD;维拉迪摩指挥舰

39=DTRUCK;自爆卡车

40=PROPA;宣传车

41=CONA;挖掘机

42=COP;cop

43=EUROC;欧洲汽车

44=LIMO;豪华轿车

45=STANG;小轿车

46=SUVB;小汽车A

47=SUVW;小汽车B

48=TAXI;出租车

49=PTRUCK;货车C

50=CRUISE;巡游船

51=TUG;拖船

52=CDEST;海岸巡逻船

53=YHVR;尤里气垫船

54=PCV;尤里机动基地车

55=SMIN;尤里奴隶矿厂

56=SMON;超时空采矿车

57=YCAB;黄色计程车

58=YTNK;盖特炮坦克

59=BFRT;战斗要塞

60=TELE;磁电坦克

61=CAOS;神经突袭车

62=DDBX;巴士

63=BCAB;黑色计程车

64=BSUB;雷鸣潜艇

65=SCHP;武装直升机

66=JEEP;卡车

67=MIND;精神控制车

68=DISK;镭射幽浮

69=UTNK;激光坦克

70=ROBO;遥控坦克

71=SCHD;武装直升机

72=DOLY;摄影车

73=CBLC;电车

74=FTRK;救火车

75=AMBU;救护车

76=CIVP;民航机

77=V3V3;V3火箭车

78=TURCKB;货车B

[飞机类代码]

0=APACHE;阿帕奇

1=ORCA;入侵者战机

2=HORNET;大黄蜂

3=V3ROCKET;V3火箭

4=ASW;舰载反潜机

5=DMISL;无畏级导弹

6=PDPLANE;运输机

7=BEAG;黑鹰战机

8=BPLN;米格战机(鲍里斯的飞机)

9=SPYP;侦察机

10=CMISL;雷鸣导弹

他怎么搞的我就不知道了。。我只在ini里翻出来了建筑编号。。

再提醒一句,这个是10进制,代码注入的时候是16进制

如果你担心不够保险,怕eax=f的时候没跳出去,然后就无线循环了,还可以把je改成ja。。

同理,对于小兵、坦克车的科技全开也是如此。。

我没去翻小兵,坦克车的ini,不知道从0循环到几。。大家自己写就行了

这个代码的好处就是,不会像地图全开那样注入两次程序就堆栈爆炸gg了。。所以可以随便找个地方写下来。

然后要注意的是,千万千万不能写在NewConstructionOptions里面,否则会无限递归。

效果图:

奇葩的事情出现了:小兵和坦克出现了一堆我不认识的什么乱七八糟的东西。。

写文章不容易求加分点赞..

等等,你以为这样就结束了吗?

你以为这种暴力循环就能完美解决科技全开问题了吗?

不!真正的实现方式在下面:

调用添加建造函数的实现方式只是一种。那调用添加建造函数的函数是谁呢?

我们下断点,建造任意能提升科技等级的建筑,断点断下,回到上一层,得到:

我们发现无论是28号车船,还是10号小兵,还是7号建筑,都有着相似的结构——判断建筑是否可用,添加建造选项,删除建造选项

(5-20添加:28号,10号,7号指的是16进制)

那我们是否可以修改判断建筑是否可用的返回值来实现科技全开呢?

我们下断点,动态跟踪,然后ctrl+f9到段尾,发现是retn c,而eax返回值是0.也就相当于c语言里面的return 0。那是不是无法建造就返回0呢?

我们把他修改成0,试试

[mw_shl_code=asm,true]004F7870 B8 00000000 mov eax,0x0 ; 判断建造选项是否可用call

004F7875 C2 0C00 retn 0xC

004F7878 |. 55 push ebp

004F7879 |. 8BE9 mov ebp,ecx

004F787B |. 56 push esi

[/mw_shl_code]

那添加建造选项肯定就是-1或者1咯哈哈哈

当x=-1时(啊呸,什么x,是eax)

当x=+1时

发现建筑可用,但是造车场之后车造不出来了。。

同理,x=2时防御建筑可用,但是兵造不出来了。

难道不同的返回值对应不同的建造类别??

用ida f5看一下,发现好像确实是有不同返回值

[mw_shl_code=asm,true] return 0;

if ( v61 <= 0 )

return 1;

LABEL_189:

v63 = (*(int (__thiscall **)(_DWORD))(*(_DWORD *)a2 + 64))(a2);

if ( sub_49FAE0(v63) < *(_DWORD *)(a2 + 952) )

return 1;

if ( !a4 )

return -1;

v42 = 0;

if ( vA83E40 <= 0 )

return -1;

v64 = vA83E34;

break;

}

while ( *(void **)(*(_DWORD *)(v64 + 4 * v42) + 108) != v4 )

{

LABEL_197:

++v42;

if ( v42 >= vA83E40 )

return -1;

}

if ( !((int (*)(void))sub_4CA160)()

|| (v65 = sub_4CA160(*(_DWORD *)(vA83E34 + 4 * v42)), (*(int (__thiscall **)(int))(*(_DWORD *)v65 + 132))(v65) != a2) )

{

v64 = vA83E34;

goto LABEL_197;

}

LABEL_199:

if ( *(_DWORD *)(vA83E34 + 4 * v42) )

return 1;

return -1;

}[/mw_shl_code]

那这么搞的话修改起来又有2种思路,一种是造不同的类型,然后看看他是从哪个return出去的,在return 之前把返回值eax修改了。。

我没采用这个方法,因为他的retn和下面的case都连在一起了,修改起来很麻烦,还要写跳转。。

如上图,retn下面就是下一个case。直接改会把下面内容覆盖掉,所以要写跳转。那光返回0的情况就2重,这要写多少个跳转。。太麻烦了

第二种办法是在call外面直接mov eax,对应值。。

还是比较麻烦,一是因为

这也太多了吧。。。

二是因为涉及到一个堆栈平衡的问题,还要把堆栈pop出去,寄存器参数改回去

不过我选的第二种。。

你以为又结束了?

没错,我也觉得结束了。我修改了10个调用这个函数的地址,基本可以科技全开了

但是修改到第十几个的时候,发现了游戏消息循环的下一层call也调用了这个(这个位置我之前做过标记,所以一眼就能看出来)这是一个令人振奋的消息,因为修改这里很可能就相当于修改了全部

这是一个很大的jnz,直接跳过了很多内容,这些内容通过分析,发现居然是循环删除不可建造的!!

[mw_shl_code=asm,true]006AA790 |> \8B0D 4C3DA800 |mov ecx,dword ptr ds:[0xA83D4C]

006AA796 |. 8B06 |mov eax,dword ptr ds:[esi]

006AA798 |. 3B81 64020000 |cmp eax,dword ptr ds:[ecx+0x264]

006AA79E |. 73 16 |jnb short gamemd.006AA7B6

006AA7A0 |. 8B89 58020000 |mov ecx,dword ptr ds:[ecx+0x258]

006AA7A6 |. 8B1481 |mov edx,dword ptr ds:[ecx+eax*4]

006AA7A9 |. 33C0 |xor eax,eax ; kernel32.BaseThreadInitThunk

006AA7AB |. 8A42 6D |mov al,byte ptr ds:[edx+0x6D]

006AA7AE |. 3BC7 |cmp eax,edi

006AA7B0 |. 0F85 B2020000 |jnz gamemd.006AAA68

006AA7B6 |> 8B4424 2C |mov eax,dword ptr ss:[esp+0x2C]

006AA7BA |. 3938 |cmp dword ptr ds:[eax],edi

006AA7BC |. 0F84 BA000000 |je gamemd.006AA87C

006AA7C2 |. 8B4C24 18 |mov ecx,dword ptr ss:[esp+0x18]

006AA7C6 |. 33D2 |xor edx,edx ; gamemd.

006AA7C8 |. 8A93 CE0C0000 |mov dl,byte ptr ds:[ebx+0xCCE]

006AA7CE |. 8B01 |mov eax,dword ptr ds:[ecx]

006AA7D0 |. 8B0E |mov ecx,dword ptr ds:[esi]

006AA7D2 |. 52 |push edx ; gamemd.

006AA7D3 |. 51 |push ecx

006AA7D4 |. 50 |push eax ; kernel32.BaseThreadInitThunk

006AA7D5 |. A1 4C3DA800 |mov eax,dword ptr ds:[0xA83D4C]

006AA7DA |. 6A 10 |push 0x10

006AA7DC |. 8B48 30 |mov ecx,dword ptr ds:[eax+0x30]

006AA7DF |. 51 |push ecx

006AA7E0 |. 8D8C24 880000>|lea ecx,dword ptr ss:[esp+0x88]

006AA7E7 |. E8 84C1E1FF |call gamemd.004C6970

006AA7EC |. 813D C802A800>|cmp dword ptr ds:[0xA802C8],0x80

006AA7F6 |. 7D 53 |jge short gamemd.006AA84B

006AA7F8 |. 8B0D D002A800 |mov ecx,dword ptr ds:[0xA802D0]

006AA7FE |. 8BF0 |mov esi,eax ; kernel32.BaseThreadInitThunk

006AA800 |. 8D14C9 |lea edx,dword ptr ds:[ecx+ecx*8]

006AA803 |. 8D0C91 |lea ecx,dword ptr ds:[ecx+edx*4]

006AA806 |. 8DBC49 D402A8>|lea edi,dword ptr ds:[ecx+ecx*2+0xA802D>

006AA80D |. B9 1B000000 |mov ecx,0x1B

006AA812 |. F3:A5 |rep movs dword ptr es:[edi],dword ptr d>

006AA814 |. 66:A5 |movs word ptr es:[edi],word ptr ds:[esi>

006AA816 |. A4 |movs byte ptr es:[edi],byte ptr ds:[esi>

006AA817 |. FF15 30157E00 |call dword ptr ds:[<&WINMM.timeGetTime>>; winmm.timeGetTime

006AA81D |. 8B0D D002A800 |mov ecx,dword ptr ds:[0xA802D0]

006AA823 |. 8B7424 10 |mov esi,dword ptr ss:[esp+0x10]

006AA827 |. 89048D 543AA8>|mov dword ptr ds:[ecx*4+0xA83A54],eax ; kernel32.BaseThreadInitThunk

006AA82E |. 8B15 D002A800 |mov edx,dword ptr ds:[0xA802D0]

006AA834 |. A1 C802A800 |mov eax,dword ptr ds:[0xA802C8]

006AA839 |. 42 |inc edx ; gamemd.

006AA83A |. 83E2 7F |and edx,0x7F

006AA83D |. 40 |inc eax ; kernel32.BaseThreadInitThunk

006AA83E |. 8915 D002A800 |mov dword ptr ds:[0xA802D0],edx ; gamemd.

006AA844 |. A3 C802A800 |mov dword ptr ds:[0xA802C8],eax ; kernel32.BaseThreadInitThunk

006AA849 |. 33FF |xor edi,edi

006AA84B |> 8B4424 18 |mov eax,dword ptr ss:[esp+0x18]

006AA84F |. 8B00 |mov eax,dword ptr ds:[eax]

006AA851 |. 83F8 07 |cmp eax,0x7

006AA854 |. 74 05 |je short gamemd.006AA85B

006AA856 |. 83F8 06 |cmp eax,0x6

006AA859 |. 75 21 |jnz short gamemd.006AA87C

006AA85B |> 57 |push edi

006AA85C |. B9 E8F78700 |mov ecx,gamemd.0087F7E8

006AA861 |. 893D 8C098800 |mov dword ptr ds:[0x88098C],edi

006AA867 |. 893D 90098800 |mov dword ptr ds:[0x880990],edi

006AA86D |. C705 94098800>|mov dword ptr ds:[0x880994],-0x1

006AA877 |. E8 74E3DFFF |call gamemd.004A8BF0

006AA87C |> 3BDF |cmp ebx,edi

006AA87E |. 0F84 AD000000 |je gamemd.006AA931

006AA884 |. 8A8B CE0C0000 |mov cl,byte ptr ds:[ebx+0xCCE]

006AA88A |. 8B13 |mov edx,dword ptr ds:[ebx]

006AA88C |. 57 |push edi

006AA88D |. 51 |push ecx

006AA88E |. 8BCB |mov ecx,ebx

006AA890 |. FF52 2C |call dword ptr ds:[edx+0x2C]

006AA893 |. 8B0D 4C3DA800 |mov ecx,dword ptr ds:[0xA83D4C]

006AA899 |. 50 |push eax ; kernel32.BaseThreadInitThunk

006AA89A |. E8 715CE5FF |call gamemd.00500510

006AA89F |. 85C0 |test eax,eax ; kernel32.BaseThreadInitThunk

006AA8A1 |. 0F84 8A000000 |je gamemd.006AA931

006AA8A7 |. 8B0E |mov ecx,dword ptr ds:[esi]

006AA8A9 |. 8B5424 18 |mov edx,dword ptr ss:[esp+0x18]

006AA8AD |. 33C0 |xor eax,eax ; kernel32.BaseThreadInitThunk

006AA8AF |. 8A83 CE0C0000 |mov al,byte ptr ds:[ebx+0xCCE]

006AA8B5 |. 50 |push eax ; kernel32.BaseThreadInitThunk

006AA8B6 |. 8B02 |mov eax,dword ptr ds:[edx]

006AA8B8 |. 51 |push ecx

006AA8B9 |. 8B0D 4C3DA800 |mov ecx,dword ptr ds:[0xA83D4C]

006AA8BF |. 50 |push eax ; kernel32.BaseThreadInitThunk

006AA8C0 |. 6A 2E |push 0x2E

006AA8C2 |. 8B51 30 |mov edx,dword ptr ds:[ecx+0x30]

006AA8C5 |. 8D8C24 F40000>|lea ecx,dword ptr ss:[esp+0xF4]

006AA8CC |. 52 |push edx ; gamemd.

006AA8CD |. E8 9EC0E1FF |call gamemd.004C6970

006AA8D2 |. 813D C802A800>|cmp dword ptr ds:[0xA802C8],0x80

006AA8DC |. 7D 53 |jge short gamemd.006AA931

006AA8DE |. 8B0D D002A800 |mov ecx,dword ptr ds:[0xA802D0]

006AA8E4 |. 8BF0 |mov esi,eax ; kernel32.BaseThreadInitThunk

006AA8E6 |. 8D14C9 |lea edx,dword ptr ds:[ecx+ecx*8]

006AA8E9 |. 8D0C91 |lea ecx,dword ptr ds:[ecx+edx*4]

006AA8EC |. 8DBC49 D402A8>|lea edi,dword ptr ds:[ecx+ecx*2+0xA802D>

006AA8F3 |. B9 1B000000 |mov ecx,0x1B

006AA8F8 |. F3:A5 |rep movs dword ptr es:[edi],dword ptr d>

006AA8FA |. 66:A5 |movs word ptr es:[edi],word ptr ds:[esi>

006AA8FC |. A4 |movs byte ptr es:[edi],byte ptr ds:[esi>

006AA8FD |. FF15 30157E00 |call dword ptr ds:[<&WINMM.timeGetTime>>; winmm.timeGetTime

006AA903 |. 8B0D D002A800 |mov ecx,dword ptr ds:[0xA802D0]

006AA909 |. 8B7424 10 |mov esi,dword ptr ss:[esp+0x10]

006AA90D |. 89048D 543AA8>|mov dword ptr ds:[ecx*4+0xA83A54],eax ; kernel32.BaseThreadInitThunk

006AA914 |. 8B15 D002A800 |mov edx,dword ptr ds:[0xA802D0]

006AA91A |. A1 C802A800 |mov eax,dword ptr ds:[0xA802C8]

006AA91F |. 42 |inc edx ; gamemd.

006AA920 |. 83E2 7F |and edx,0x7F

006AA923 |. 40 |inc eax ; kernel32.BaseThreadInitThunk

006AA924 |. 8915 D002A800 |mov dword ptr ds:[0xA802D0],edx ; gamemd.

006AA92A |. A3 C802A800 |mov dword ptr ds:[0xA802C8],eax ; kernel32.BaseThreadInitThunk

006AA92F |. 33FF |xor edi,edi

006AA931 |> 8B4C24 30 |mov ecx,dword ptr ss:[esp+0x30]

006AA935 |. 3BCF |cmp ecx,edi

006AA937 |. 7E 64 |jle short gamemd.006AA99D

006AA939 |. 8B4424 1C |mov eax,dword ptr ss:[esp+0x1C]

006AA93D |. 8BD1 |mov edx,ecx

006AA93F |> 8B08 |/mov ecx,dword ptr ds:[eax]

006AA941 |. 8B1E ||mov ebx,dword ptr ds:[esi]

006AA943 |. 3BCB ||cmp ecx,ebx

006AA945 |. 75 50 ||jnz short gamemd.006AA997

006AA947 |. 8B48 04 ||mov ecx,dword ptr ds:[eax+0x4]

006AA94A |. 8B5E 04 ||mov ebx,dword ptr ds:[esi+0x4]

006AA94D |. 3BCB ||cmp ecx,ebx

006AA94F |. 75 46 ||jnz short gamemd.006AA997

006AA951 |. 8B0D 84EDA800 ||mov ecx,dword ptr ds:[0xA8ED84]

006AA957 |. 897C24 34 ||mov dword ptr ss:[esp+0x34],edi

006AA95B |. 897C24 38 ||mov dword ptr ss:[esp+0x38],edi

006AA95F |. 897C24 3C ||mov dword ptr ss:[esp+0x3C],edi

006AA963 |. 897C24 40 ||mov dword ptr ss:[esp+0x40],edi

006AA967 |. 897C24 48 ||mov dword ptr ss:[esp+0x48],edi

006AA96B |. 894C24 50 ||mov dword ptr ss:[esp+0x50],ecx

006AA96F |. 897C24 58 ||mov dword ptr ss:[esp+0x58],edi

006AA973 |. 897C24 5C ||mov dword ptr ss:[esp+0x5C],edi

006AA977 |. B9 0D000000 ||mov ecx,0xD

006AA97C |. 8D7424 34 ||lea esi,dword ptr ss:[esp+0x34]

006AA980 |. 8BF8 ||mov edi,eax ; kernel32.BaseThreadInitThunk

006AA982 |. C64424 4C 00 ||mov byte ptr ss:[esp+0x4C],0x0

006AA987 |. C74424 60 010>||mov dword ptr ss:[esp+0x60],0x1

006AA98F |. F3:A5 ||rep movs dword ptr es:[edi],dword ptr >

006AA991 |. 8B7424 10 ||mov esi,dword ptr ss:[esp+0x10]

006AA995 |. 33FF ||xor edi,edi

006AA997 |> 83C0 34 ||add eax,0x34

006AA99A |. 4A ||dec edx ; gamemd.

006AA99B |.^ 75 A2 |\jnz short gamemd.006AA93F

006AA99D |> 8B45 54 |mov eax,[arg.20]

006AA9A0 |. 83F8 01 |cmp eax,0x1

006AA9A3 |. 7E 29 |jle short gamemd.006AA9CE

006AA9A5 |. 8B4C24 28 |mov ecx,dword ptr ss:[esp+0x28]

006AA9A9 |. 8D50 FF |lea edx,dword ptr ds:[eax-0x1]

006AA9AC |. 3BCA |cmp ecx,edx ; gamemd.

006AA9AE |. 7D 1E |jge short gamemd.006AA9CE

006AA9B0 |. 8D0C40 |lea ecx,dword ptr ds:[eax+eax*2]

006AA9B3 |. 8D1488 |lea edx,dword ptr ds:[eax+ecx*4]

006AA9B6 |. 8B4424 24 |mov eax,dword ptr ss:[esp+0x24]

006AA9BA |. C1E2 02 |shl edx,0x2

006AA9BD |. 2BD0 |sub edx,eax ; kernel32.BaseThreadInitThunk

006AA9BF |. 8B4424 20 |mov eax,dword ptr ss:[esp+0x20]

006AA9C3 |. 52 |push edx ; gamemd.

006AA9C4 |. 50 |push eax ; kernel32.BaseThreadInitThunk

006AA9C5 |. 56 |push esi

006AA9C6 |. E8 C5F61100 |call gamemd.007CA090

006AA9CB |. 83C4 0C |add esp,0xC

006AA9CE |> 8B45 54 |mov eax,[arg.20]

006AA9D1 |. C64424 16 01 |mov byte ptr ss:[esp+0x16],0x1

006AA9D6 |. 48 |dec eax ; kernel32.BaseThreadInitThunk

006AA9D7 |. C64424 17 01 |mov byte ptr ss:[esp+0x17],0x1

006AA9DC |. 8D0C40 |lea ecx,dword ptr ds:[eax+eax*2]

006AA9DF |. 8D1488 |lea edx,dword ptr ds:[eax+ecx*4]

006AA9E2 |. 8D4C95 00 |lea ecx,dword ptr ss:[ebp+edx*4]

006AA9E6 |. 8D5440 06 |lea edx,dword ptr ds:[eax+eax*2+0x6]

006AA9EA |. 8979 64 |mov dword ptr ds:[ecx+0x64],edi

006AA9ED |. 8979 58 |mov dword ptr ds:[ecx+0x58],edi

006AA9F0 |. 8D4490 02 |lea eax,dword ptr ds:[eax+edx*4+0x2]

006AA9F4 |. 8979 5C |mov dword ptr ds:[ecx+0x5C],edi

006AA9F7 |. 8979 60 |mov dword ptr ds:[ecx+0x60],edi

006AA9FA |. 8D59 74 |lea ebx,dword ptr ds:[ecx+0x74]

006AA9FD |. 897C85 00 |mov dword ptr ss:[ebp+eax*4],edi

006AAA01 |. 8979 6C |mov dword ptr ds:[ecx+0x6C],edi

006AAA04 |. A1 84EDA800 |mov eax,dword ptr ds:[0xA8ED84]

006AAA09 |. 33D2 |xor edx,edx ; gamemd.

006AAA0B |. 8903 |mov dword ptr ds:[ebx],eax ; kernel32.BaseThreadInitThunk

006AAA0D |. 8B4424 6C |mov eax,dword ptr ss:[esp+0x6C]

006AAA11 |. 89B9 80000000 |mov dword ptr ds:[ecx+0x80],edi

006AAA17 |. 8943 04 |mov dword ptr ds:[ebx+0x4],eax ; kernel32.BaseThreadInitThunk

006AAA1A |. 8953 08 |mov dword ptr ds:[ebx+0x8],edx ; gamemd.

006AAA1D |. 8B5C24 28 |mov ebx,dword ptr ss:[esp+0x28]

006AAA21 |. 8B5424 24 |mov edx,dword ptr ss:[esp+0x24]

006AAA25 |. 89B9 88000000 |mov dword ptr ds:[ecx+0x88],edi

006AAA2B |. 8B45 54 |mov eax,[arg.20]

006AAA2E |. B9 34000000 |mov ecx,0x34

006AAA33 |. 48 |dec eax ; kernel32.BaseThreadInitThunk

006AAA34 |. 4B |dec ebx

006AAA35 |. 2BD1 |sub edx,ecx

006AAA37 |. 8945 54 |mov [arg.20],eax ; kernel32.BaseThreadInitThunk

006AAA3A |. 8B4424 2C |mov eax,dword ptr ss:[esp+0x2C]

006AAA3E |. 895C24 28 |mov dword ptr ss:[esp+0x28],ebx

006AAA42 |. 8B5C24 18 |mov ebx,dword ptr ss:[esp+0x18]

006AAA46 |. 895424 24 |mov dword ptr ss:[esp+0x24],edx ; gamemd.

006AAA4A |. 8B5424 20 |mov edx,dword ptr ss:[esp+0x20]

006AAA4E |. 2BC1 |sub eax,ecx

006AAA50 |. 2BD9 |sub ebx,ecx

006AAA52 |. 2BD1 |sub edx,ecx

006AAA54 |. C645 3C 01 |mov byte ptr ss:[ebp+0x3C],0x1

006AAA58 |. 894424 2C |mov dword ptr ss:[esp+0x2C],eax ; kernel32.BaseThreadInitThunk

006AAA5C |. 895C24 18 |mov dword ptr ss:[esp+0x18],ebx

006AAA60 |. 895424 20 |mov dword ptr ss:[esp+0x20],edx ; gamemd.

展开全部
同类热门
红色警戒2尤里的复仇