尤里的复仇长篇战役包增加了新的阵营尤里以及相关的战役和单位。以下是“尤里的复仇”盟军和苏军的部分战役关卡说明及攻略:开头可轻易占领右上部的三个盟军基地,但中部的盟军基地光棱塔众多,可采取迂回战术,从后面绕过去,那里几乎没有防守,摧毁电厂后占领基地,出光棱坦克摧毁爱因斯坦实验室。若未能占领也没关系,可造基洛夫飞艇硬冲,目标仅有两个。
尤里的复仇新手指南
盟军
第一回:光阴似箭
地点:加利福尼亚州旧金山
故事内容:时间紧迫,尤里即将让恶魔岛上的心灵控制器发挥作用,而阻止他的唯一机会是利用爱因斯坦教授的时间机器回到过去,在他完成心灵控制器的全球网络连线前进行阻止。
任务内容:
占领提供时间机器电力的发电厂。
保卫时间机器。
摧毁在恶魔岛的心灵控制器。
攻略要点:
任务开始没有足够电力供应时间机器,需占领至少四个公共电厂,位于地图左下方,小心尤里士兵占领的沿路房屋,可使用幻影坦克在其打不到的位置慢慢攻击,或多造灰熊坦克硬冲。工程师占领电厂后谭雅会进入时间机器,此时苏军会大举进攻,注意维修巨炮以打掉无畏级战舰,同时防范基洛夫飞艇,多造几个盟军的“守卫大兵”(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.