红色警戒2修改器原理百科(五)

都第五篇了,好长,这是个坑,没多少人看为什么要写这个,我就当是为了部落……还有什么没写?选中单位3星,随处建造(优雅),科技全开,转移单位所属(优雅),立即胜利(这个这个不怎么好意思发,我自己没找到)。还有地图其他玩家数据,当然还有我还没试过也可以写的出售建筑CALL,自动修理,枚举地图上全部单位(然后可以配合出售建筑,卖掉全部不属于自己的)还要写几篇才能完结呢。。还还有心灵探测(从来不想实现,造个心灵探测器会死),奶牛总统等特殊兵种(红警全能王谷子猫绿色珍藏版中的自定义函数好长好复杂,红色警戒2修改大师貌似是Timer不断修改内存数据,想找个更优雅的方式),需求不太高的建造队列上限,建造个数上限,还有传说中我都没试过的联机的切换阵营,遭遇战参数修改。坑越挖越大

来吧,跟我继续填坑,这一篇就讲选中单位3星吧。

(十一)选中单位升3星——三步走

1.寻找单位的血量——第一步,把冰箱门打开

首先查找到一个单位的血量,然后根据谁修改了这个值,就能找到这个单位对象的起始地址。

做好准备工作,造一个盟军战车工厂A,一辆灰熊坦克。精确搜索4字节数值1000,让灰熊坦克去打一下,只打一下,然后搜索958——也就是灰熊坦克打盟军战车工厂的伤害是42。重复2~3次,就能得到3个左右的地址,依次尝试修改吧。然后查找谁修改了这个值,但千万别摧毁了此建筑。得到指令005D3E65 - mov [esi+6C],eax,但这不重要,ESI的值对下一步才重要,还有+6C就是单位HP的偏移。记下ESI的值,即战车工厂对象的起始地址,此处记作地址A=0C5D7648。

再建造一座盟军战车工厂B,重复以上步骤找到其起始地址B=0745FF70

2.寻找选中单位指针——第二步,把大象放进冰箱

现在你的CT表中应该有4个地址:

然后游戏选中盟军战车工厂A,新搜索精确数值地址A(0C5D7648),然后选中盟军战车工厂B,搜索精确数值地址B(0745FF70)。应该只剩一个结果了,记作指针A=0D7B44D0,将其添加到CT表,不是的话,重复上述步骤。

选择灰熊坦克,指针A的值会变成另一个,记作地址C=07781CD8,然后+6C=07781D44,07781D44这个地址就是灰熊坦克HP的地址。将其锁定,然后建造另一辆坦克去攻击它,如果一直打不死,说明正确指针A指向的就是当前选中单位。

然后搜索指针A的地址0D7B44D0,就能得到当前选中单位的基址[game.exe+640C64],然后找到选中单位的数量基址game.exe+640C70

3.完成修改3星——第三步,把冰箱门关上

单位等级偏移是+11C,修改成0x40000000就是3星。最简单的实现选中3星,用Timer完成:1.首先获取选中单位数目。2.从选中单位基址读取第一个选中单位的起始地址,基址+4就是第二个单位的起始地址,+8就是第三个选中单位……3.修改所有选中单位的等级。

这里有一个大概的游戏单位对象描述,这些东西都是通过分析和对比得出来的(CE有个功能叫分析数据/结构):

class GameUnit : public BaseA, public BaseB, public BaseC
{
    //从内存结构上来讲,起始地址的前4个DWORD,就是函数表指针
    //详请百度C++对象内存结构
    ...
    DWORD	dwTrigger;	//+34,关联触发器(用过地图编辑器就知道了),链表
    int		nGroup;		//+1AC,所在编队0~9
    int		nHP;		//+6C
    int		nX;		//+1A0,X坐标
    int		nY;		//+1A4
    DWORD	dwGrade;	//+11C,等级
    Player*	pOwner;		//+1B4,所属者
    ....
    //这个类的对象很大,因为继承了3个类,上面的这些可能是一个基类的内容
    //详请百度C++多继承内存布局
}

但是上面给出的实现选中3星有2个问题,一是没有判断是不是玩家的单位,偶然点了一下电脑的兵,也变成3星了……,解决方法:判断pOwner指针是不是指向玩家;二是建筑物也能变成3星……解决方案是,根据第一个DWORD,也就是第一个函数表指针,判断单位类型。我实在是没找到有什么变量指示了类型,只能用函数表指针了。

(十二)优雅的转移单位所属——升3星引发的血案

上面看到有一个pOwner指向单位的所属者,如果把电脑的单位,修改成指向玩家的呢。经过测试,修改后确实可以控制或出售。但是带来一些问题:

1.如果你强行修改了电脑的基地,并卖掉了,接下来摧毁了所有电脑的剩余单位,发现并不能取得胜利。这是因为,游戏的数据记录乱了——电脑在某些情况下认为他还有一个基地,但是却又不能用这个基地造东西;想卖掉投降,确又发现没有建筑可卖。灵异事件发生,不知道如何处理,只好尴尬的不能让你赢了。

2.如果你把电脑的兵营占有,会发现不能造对方的兵种。这就说明还有一些操作没有完成,比如增加建造选项。

3.如果你把一个没人占用的油田更改给自己,却发现油田根本不工作。这就说明还有一系列操作用来激活油井。

最容易想到的解决方法就是,同时修改相关联的数据,然后调用相关函数完成操作,难度系数4星半。分析出完整的数据结构那是相当不容易,还要写复杂的脚本完成善后的操作。但是,换个角度想想,游戏中应该有相应的完整的函数。因为玩任务模式的时候,经常会触发事件,然后别人的建筑变成我方建筑了。

最初查找谁修改了所属,然后是用工程师去占领建筑,找到一个更改所属的CALL,相关位置:

然而使用上面的CALL还是存在油井不工作的问题(笔者后注:其实上面的CALL返回第二层,依然能找到类似下面的代码从而解决问题,只是当时过分迷恋地图编辑器了,不过也有额外收获)。

于是我去创建了一个自定义地图,当我建造一个修理厂的时候,把地图上的核弹发射井转移给我。第一层返回,还是CALL上面的同一个函数地址:

继续返回第二层,来到这里:

分析这里的代码,收获有:地图上所有单位数目(敌方、我方及中立的建筑、步兵和坦克等)(game.exe+640C30)地图上所有单位的指针数组(game.exe+640C24),游戏单位的+34偏移是触发关联标记,触发器对象是一个链表。由此可以遍历地图上所有单位。

最后写出转移所属的脚本:

//转移单位所属,可胜利
pushad
push 0    //提示语音
mov eax,[00A35DB4]  //当前玩家数据基址
push eax  //转移给谁
mov eax,[00A40C64]  //当前选中第一个单位基址
mov ecx,[eax]  //单位基址
mov ebx,[ecx]
call [ebx+378] //更改所属函数
popad
ret

还可以得出一个问题,CALL [EBX+378],EBX指向游戏单位的第一个函数表,0x378偏移说明是第222个函数……好大一个类,还能维护么,好替它担心。

To be continued…

转载请注明来源,http://www.cnblogs.com/viewll/p/4770378.html

时间: 2024-09-29 21:57:10

红色警戒2修改器原理百科(五)的相关文章

红色警戒2修改器原理百科(一)

红色警戒2,一个经典的游戏.我上初中时经常周末回到家就开始玩任务模式,然后半天过不去一关,就开外挂--开外挂虐冷酷的不开超级武器电脑. 先说一下版本,V1.006.共和国之辉只是基址不一样,其他版本可参考思路.当时比较好用一个外挂是胜利之歌的内存修改器,还有就是红警全能王,各种全能,全能的我不怎么喜欢用(功能默认全开,没得选). (一)最简单的开始--修改金钱 当初刚刚接触Cheat Engine,只会改个金钱.快速建造.地图全开.科技全开什么的完全不知道怎么办.现在貌似突然领悟了什么,回头看看

红色警戒2修改器原理百科

红色警戒2,一个经典的游戏.我上初中时经常周末回到家就开始玩任务模式,然后半天过不去一关,就开外挂……开外挂虐冷酷的不开超级武器的电脑. 先说一下版本,原版V1.006.其他版本只是基址不一样,可参考思路,如共和国之辉.当时比较好用一个外挂是胜利之歌的红色警戒2内存修改器,还有就是红警全能王——各种全能,全能的我不怎么喜欢用(功能默认全开,没得选). (一)最简单的开始——修改金钱 当初刚刚接触Cheat Engine,只会改个金钱.快速建造.地图全开.科技全开什么的完全不知道怎么办.现在貌似突

红色警戒2修改器原理百科(十)

(二十一)转换阵营--很炫酷却很简单 这个功能,貌似当初很火很轰动,感觉很强大--联网对战中控制对手单位,卖掉对手建筑!右边的建造选项也是对手的,你可以替对手建造单位.可是这个原理很简单,游戏中一个很重要的指针CurrentPlayer(即game.exe+635DB4这个基址)指向本地玩家的数据,你所有的操作依据最终都来源于此.如果你把这个指针指向对手的数据,游戏就认为你原本就是对手--这是游戏设计的缺陷. 但是只在联网对战中有效.单机时也有一定作用,能看到电脑的科技是全开的--当然除了超级武

红色警戒2修改器原理百科(八)

(十五)科技全开2--问题终结 上一篇留下的问题,进行修改后为什么没有效果.试图让游戏添加所有可能的建造项,但是游戏中试图刷新建造项(建造新单位)后却没出现我们期望的.这是一个很简单,却难住我一段时间的问题.最初我以为是指令写错了,对比好几遍终于确信没有错误.这么解释这个问题,游戏会在合适的时候(通常是建造了新单位后)会刷新你的建造选项,刷新包括添加和删除.很不幸的是,游戏刷新建造项的流程是:添加当前可建造的->删除当前不可建造的,这是我发现的"证据",先发出来: 所以,当我们试

红色警戒2修改器原理百科(三)

继续上次,上次给出的开全图,是不能看透盟军的裂缝产生器的,有的修改器的开全图是可以看透的.它的原理是修改了判断迷雾的一个关键跳转.此处不多说,本人觉得不够优雅——能少改动代码则少改动代码.当然他也有自己的优势——看透裂缝产生器.可能在最后补充中,再加上吧. 当然,如果你事先查找了一些关键字符串,可以直接快速的定位到关键位置,不需要像我利用升级箱子来找. (七)额外核弹——可能是全球首发 笔者在百度了那个升级箱子都能带来什么之后,发现那个箱子有可能会得到一次额外的核弹发射机会,我就在想能不能找到这

红色警戒2修改器原理百科(二)

上一篇中介绍了,金钱的修改,瞬间建造以及快速建造.不多说,本篇开始 (四)无限电力--共用代码处理 电力和负载的精确数值,可以选中一个发电厂来看 直接给出电力的地址:[game.exe+635DB4]+52D0 负载地址:[game.exe+635DB4]+52D4 红警2中,电厂提供的电力根据其健康程度是不同的,生命值越少提供的电力越少.所以当电厂被攻击时会更新电力值.当新放置建筑,或建筑被摧毁,卖掉建筑物,都会更新电力和负载.实现无线电力,可以把电力改大,也可以将负载减小.我选择第二种,将负

红色警戒2修改器原理百科(九)

完结了一个相对比较复杂的修改,其实说起来也简单,如果不去理解数据结构只追求修改效果的话.笔者的一个原则就是要搞明白:怎么找到的,怎么改,为什么.一个线索无法伸展了,换个点,就来下面这个吧. (十七)任意建造--大多数人离优雅只差一步 这次我们想试试新方法,这个方法在一些游戏中有奇效,简单快捷方便,一秒钟满足你!有时很有效的的大杀器--字符串搜索.从我们最初修改地图全开时,我们就发现游戏程序中包含一些字符串,那么不能建造有没有对应的字符串呢,有的话是什么字符串呢?字符串最常见的是现实在游戏界面中,

红色警戒2修改器原理百科(六)

先说一件事情,昨天我在继续OD调试游戏的时候,运行错了版本,然后OD的备注.标签和断点通通没有了.喜大普奔上天关上了一扇门,然后我开了一扇窗户——抛弃之前的枷锁,重新出发,目前来看可能是找到了判断地图触发器的整个过程,待进一步测试:还找到了立即胜利的源头. 让我们书接上回. (十三)枚举地图玩家——隐藏在背后的黑暗势力 如果细心的你在进行上一步的疯狂的掠夺的时候,发现了没人占有的建筑物的pOwner不是NULL,你就可能发现一片新大陆.是谁拥有了这个建筑物,却还能显示没有归属. 前一篇最后一个图

基于C++ Qt实现的红色警戒3修改器(Github开源)

前言 这部修改器制作有一段时间了,但是一直没出教程.今天利用周末空闲写篇教程,给后来者指路的同时也加深自己对游戏修改器的理解,大佬就随便看看吧 浏览了一下网络,形形色色的单机游戏修改器教程,但是基本只实现了一到两个功能,GUI图形界面也没有.网站上能下载到的实现很多功能的修改器却又不开源,对新手不够友好 为什么选择红警3而不是其他游戏呢? 其一,它是单机游戏,制作网络游戏修改器(外挂)是违法的,根据<计算机信息网络国际联网安全保护管理办法>第六条规定:“任何单位和个人不得从事下列危害计算机信息