Bootstrap

Ra2辅助制作(1)

序言

红警2是个非常经典的游戏,承载过我小学时候的一段岁月,而我对他的探究是从初中才开始的,那时只会改改显而易见的游戏数据,比如金钱和电力。也是限于当时没有学C/C++、Assembly,没有指针的概念和反汇编的能力。时隔多年,到了上个寒假才开始深入探究,而学务繁忙,断断续续实现了几个功能就开学了,现完成了上个假期留下的红警2游戏辅助探究&制作。

0x0 修改金币

【思路】:

CE扫描初始化的金币,然后花一些金币,再扫描此时的金币。重复几次最后得到一个地址,然后查看是谁访问了这个地址,得到的代码中有个偏移为0x30c,后面跟着的是基址的值,搜索这个值就得到了基址。

【地址】:金币=[[0A83D4C]+30C]

【注意】:0A83D4C 是个很重要的角色基址,与后面实现控制对方有关。

0x1 修改电力

【思路】:主要是修改负载。和修改金币类似的思路,略

【地址】:

将
00508D16  |.  03D0          |add edx,eax
改为
00508D16  |.  03D0          |add edx,0

【注意】:可能要判断来源是否为我方,否则就是全局修改了!

0x2 瞬间建造

【思路】:将游戏速度调为最慢,然后生产一个单位。每走动一格,CE扫描增加的值;暂停生产,CE扫描未变动的值,如此反复扫描。注意这个过程必须在生产中进行,不要等到生产完毕还没找到,否则地址又被重置了。得到一个比较靠谱的地址

在这里插入图片描述

查看是谁访问了这个地址,回到游戏,继续未完成的生产。得到若干个可以的代码:

在这里插入图片描述

主要看红色方框的地方,然后OD附加游戏进程,跟随到地址004C9B49

在这里插入图片描述

动态分析得知,将add edx,ecx改为add edx,0x36即可,不够优雅的是改了全局的,电脑也可以瞬间建造,无所谓了,电脑综合速度本来就比人快。

【地址】:

将
004C9B7E      03D1          add edx,ecx
修改为:
004C9B7E      03D1          add edx,36

【注意】:极有可能是全局修改,但是无所谓,电脑的速度总是比人快!

0x3 随处建造

【思路】:

在不可以建造的地方,游戏会播放语音,搜索对应的字符串,跟随跳转:

在这里插入图片描述

动态分析这两个跳转就知道跳过去就是不能建,所以nop掉就能随处建造了。

【地址】:

nop以下两处:
004ABAAC     /0F84 C4010000 je 尤里单机.004ABC76
004ABABA     /0F84 B6010000 je 尤里单机.004ABC76

0x4 超级武器无CD

【思路】:

当超级武器CD结束时,会播放一段声音告知玩家是哪一个超级武器准备完毕。现在就拿闪电风暴来入手吧。搜索对应的字符串“LightningStormReady”,将找到的所有地方都下断。回到游戏,等待断下。

在这里插入图片描述

顺着跳转往上找的过程中得知这是一个switch结构

在这里插入图片描述

根据eax的值来跳转的,再往上找到

在这里插入图片描述

发现这处跳转在超级武器CD没有到0时是不会发生跳转的,果断改为jmp后实现了超武无CD,但是不够完美就是游戏中显示超级武器的CD还是没有变化到0,无所谓啦~

【地址】:

将
006CBD67     /7D 0A         jge short gamemd.006CBD73  
改为
006CBD67     /7D 0A         jmp short gamemd.006CBD73  

0x5 地图全开

【思路】:

1.已知在捡箱子的时候会随机得到一地图全开,可以从这里下手。

2.搜索字符串 “Crate at”,找到包含“reveal”的字符串,定位到:

在这里插入图片描述

①处的call是空函数,通过动态试验得知②处的call即是清除地图上的黑雾的函数。不难分析这个call的参数,其中esi存放的是基址里的值。仅是这个call还不能打开小地图,这样的地图全开不完美。

当我们建造雷达或者空军指挥部的时候,小地图会打开。假设,未打开前是0,打开后是1。现在用CE搜索字节,建了又售出,搜0再搜1。交替了5次,还有几十个地址。此时,把空军指挥部的售出,建一个雷达,再搜1。最后得到两个地址

在这里插入图片描述

首先试了第一个地址,查看是谁访问了它,接着后续用OD来操作,追了好久没有得到关键地址。后来换了第二个地址,也就是0B77864 这个地址

在这里插入图片描述

然后用OD跟进,来到此处:

在这里插入图片描述

看到这处,很高兴的就用代码注入器试了,结果奔溃!!!看来得进入到call 00656BE0 里去看看

在这里插入图片描述

通过动态分析,得到一个完美的地图全开代码。

【代码】:

nop掉以下指令
00656BE9     /75 5D         jnz short gamemd.00656C48
注入以下代码:
pushad
mov dword ptr ds:[0xBAD3E8],1
mov esi,0087F7E8
mov dword ptr ds:[esi+0x14AC],0x3
mov ecx,00a83d4c
mov edx,dword ptr ds:[ecx+0x21C]
mov ecx,0087F7E8
push edx
call 00577d90
popad
ret

0x6 获得一次超级武器使用权

【思路】:

1.同地图全开一样的分析思路,在此之前要先实现捡箱子都捡到核弹(ICBM)。捡箱子触发器函数中会随机产生一个数字,然后根据这个数字,进入到switch结构里,随机走一个分支。所以要先把switch结构的跳转都改跳到获得核弹这个分支。获得核弹的分支如下:

在这里插入图片描述

switch头部:

在这里插入图片描述

第一个call跟进去就是一个返回,没什么用;第二个call是获取eax的值,而这个eax的值后面会用到,很关键。现在我们去捡一个箱子触发这个函数,然后往下分析

在这里插入图片描述

2.跟进 call 006CB560 ,步入到倒数第一个 call的时候,我们发现许多诸如此类的字眼

在这里插入图片描述

结合前面探究的超级武器无CD,改的就是这里边的代码,只不过是另一个call,与这个call结构相似,所以两个都是超级武器CD函数。

3.单步到返回,接着往下继续,来到关键的call

在这里插入图片描述

动态调试可知,这个call就是根据传进来的数据作为武器的类型,添加到相应的页面中。可知0x1f 表示的是武器,添加到武器页面;0x7 表示建筑,添加到建筑页面;0xf 表示步兵,添加到步兵页面;0x28 表示车辆,添加到车辆页面。而传进来的另一个参数则是对应的建筑标识,或是武器标识,或是步兵标识,或是车辆标识。这里已经是为后面实现科技全开做了铺垫。那么回溯到外部调用是这样的,在关键的地方都做了注释:

在这里插入图片描述

可以知道 eax里就是对应的标识,0x1f 表示的是类型。那么获得一次超级武器使用权的代码就可以归纳出来了。

【代码】:

pushad
mov ecx,0x14
call 006CEEB0
mov ebx,eax
mov eax,超级武器编号
mov edx,dword ptr ds:[00a83d4c]
mov ecx,dword ptr ss:[edx+0x258]
push 0x0
push 0x0
mov ecx,dword ptr ds:[ecx+eax*4]
push 0x1
call 006CB560
mov eax,超级武器编号
mov ecx,0087F7E8
push eax
push 0x1F
call 006A6300
popad
ret

【注意】:超级武器编号详见附录

0x7 选中单位无敌

【思路】:

常规搜索一个选中目标的血值基址,然后加上一定的偏移。发现存在一级偏移则是根据选中的人数*4,二级偏移为 +6C

【地址】:

使用timer写
选中对象的血量=[[[0A8ECBC]+EAX*4]+6C]
EAX=选中单位的数量=[A8ECC8]
写入65536,T=20s

0x8 载具无限容量

【思路】:

先用CE搜索0,依次进入一个人,用CE搜索加一个,最后得到一个地址。CE查看是谁访问了这个地址。

在这里插入图片描述

而方框中的地址就是当前选中的目标的地址

【注意】:修改后会导致人出不来,只能恢复修改才可以让人出来。

【地址】:

当前选中目标的容量=[[[0A8ECBC]]+0x114]

【注意】:

锁定为0就可以实现无限容量,并且载具的威力也可以叠加,但是就不能把人放出来了。得处理一下,方式很多看个人吧。

0x9 选中单位升三星

【思路】:

按照编程经验——等级和血量都是在同个类中,所以基址不变,变得是偏移。用CE的数据分析工具枚举一个0x500范围内的数据,然后对比一下,升级前和升级后,每个偏移的数据变动情况。最后发现在偏移为0x150指向的就是等级的地址。三星对应的数值的十六进制为0x40000000

【地址】:

选中对象的等级=[[[0A8ECBC]+EAX*4]+0x150]
EAX=选中单位的数量=[0A8ECC8]

0xa 清除选定的建筑里的人

【思路】:和载具无上限的思路一致

【地址】:

选中建筑的已经进驻人数=[[[0A8ECBC]]+0x694]
改为0即可在不破坏建筑的情况下清除里边的人,然后可以进驻新的人!

0xb 自动修理

【思路】:

当我们修理一个建筑的时候,游戏会播放 “repairing“ 声音,于是可以从OD中搜索到关键字符串”EVA_repairing“,定位到关键函数,然后动态分析:

在这里插入图片描述

不难分析这两个call的功能。其中第一个call可以用我们自己得到的基址计算一下,传给esi调用第二个call就行了。

【代码】:

pushad
mov esi,建筑地址
mov eax,dword ptr ds:[esi]
push -0x1
mov ecx,esi 
call dword ptr ds:[eax+0x19C] 
popad
ret

【注意】:

建筑地址只能读取到当前选择的建筑,所以事先要先缓存选择过的地址。

当前选中建筑的地址=[[0A8ECBC]]

控制选中的单位

【思路】:

尤里能够控制敌人,防御塔能够分辨上是敌是友,说明每个单位的类中有这么一个属性是用来起分辨作用的。在前面的探究中已经得到了选中单位的基址0A8ECBC和我方的基址0A83D4C,只要找到它的偏移就ok了。

使用CE的数据分析工具,枚举0x500范围内的数据,然后搜索哪个位置的数据与 [0A83D4C] 一致

在这里插入图片描述

在这里插入图片描述

有两处,此时需要验证一下:选中敌方的一个单位,把这个位置的值修改为**[0A83D4C],发现0x21c** 有效。

【地址】:

将选中单位的归属改为[0A83D4C]即可实现控制
选中单位的归属=[[[0A8ECBC]+EAX*4]+0x21C]

【注意】:最好别控制对方的主基地,否则不能赢得胜利!

科技全开

【思路】:

在获得一次超级武器的使用权一节中做了铺垫,所以这里很快就能归纳出代码。

【代码】:

;添加建造选项
pushad
push 标识
push 类型
mov ecx,0087F7E8        
call 006A6300 
popad
ret
将
004F9276     /0F84 86000000 je gamemd.004F9302
改为jmp

【补充】:需要使用循环来写,标识参见附录中的建筑代码,类型参见附录。

附录

【超级武器编号】:

0=核弹
1=铁幕
2=闪电风暴
3=超时空传送
4=超时空动员
7=心灵控制
9=基因突变器
10=力场护盾
11=心灵控制探测

【类型】:

0x7=建筑
0xf=步兵
0x28=车辆
0x1f=武器

【建筑选项编号】:

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;雷鸣导弹

参考文献

[1]https://www.cnblogs.com/viewll/

[2]https://space.bilibili.com/251535501

;