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

(十五)科技全开——前方高能,BOOM

    其实这一小节,最晚应该在第四篇的十小节来讲述的,这样是按照一条线索来讲的,容易理解和把握笔者修改时的思路,以一点逐渐扩大。由于笔者的一些原因(一是牵涉到的数据结构比较多——3个,笔者当时没有完全理解;二是当时笔者发现一个关键位置——代码很复杂,并且红警全能王也进行了复杂的修改。因于此,笔者当时没深入就转而去搞其他的了),当笔者想写科技全开的时候,却发现讲不通,又不想只给出一个这么改就行的模糊回答,因为这是百科!结果就是,第十小节生硬地变成了打开小地图雷达——————

    有些东西终究是逃不掉的,Let’s face it.对第八节——添加任意建造项,是否还有印象?可以回过去再看看第三篇,传送门。其中,我提到是这样确定类型编号的:当你展开基地车的时候,会获得建造发电站的选项;建造完发电站,获得矿场和兵营的选项………如果读者亲自实验过,就会知道每次刷新建造项都会频繁调用那个函数添加建造选项。那么谁调用了这里,调用者将会判断决定添加什么选项。于是在函数头下断点,返回上一层,我们来到:

kj1

    分析这里能得到一些东西:循环次数——所有建筑物种类数目(A35CE8,即game.exe+635CE8),(建筑物)建造描述对象数组(A35CDC)。还有轻易就知道CALL<添加建造选项>前面的CALL就是得到某种建筑是不是应该被添加的的判断函数。

    并且004E3660被很多地方调用,然而这个函数有很多判断和很多出口,修改并不是很容易。一旦做了努力,修改成功,科技全开将是显而易见的。例如红警全能王就是修改了这里:

kj2

    这个函数被重新跳转到2931F96的一个自定义函数。注意:这个地址是临时申请的,每次都会变的。同样也是一个挺复杂的自定义函数,其中还调用了其他自定义函数。此处只是为了给出直接修改这个函数实现科技全开的思路并举例证明可行,并无意侵犯原作者权利。由于红警全能王版本及修改版繁多,历史久远(最初貌似是联网获取核心DLL的,后来被大神做出本地验证的单机版,最近我下载的是红警全能王谷子猫绿色珍藏版),我也搞不清谁是原作者,在未获得许可的情况下,还是不公开具体实现。有兴趣的可以自行下载分析,我也好偷懒大声笑

    由上面,已经给出科技全开的一种实现原理和思路了。本可以由此打发读者,弃坑的,但是我骗不了自己,还有自己同样在讲的优雅。好复杂的原函数,好复杂的自定义函数,能不能简单点……我很懒的,不想自己搞。于是找到了红色警戒2修改大师,附近的Case 7(建筑物)被简单的修改成如下(已由作者林毛口头授权公开):

    kj3

    其他的Case28,Case10,Case3也是类似的。+55C偏移是什么鬼?为什么要和-1比较?为什么要这么改?为了给读者有个解释,我终于下决心去看原函数了。最初我大体一看也是被这么长的函数吓坏了,还那么多判断,就果断绕道去看别人怎么实现的了……结果现在才发现开头不远就有:

kj4

    红警修改大师的作者看来是认真分析过的微笑,我站在他人的肩膀上~~之所以上面+55C偏移我确定是科技需求等级,是有原因的。记不清在哪里看到的,修改红警ini配置文件来启用隐藏兵种,修改的就是科技需求值-1,再通过对比其他兵种就基本确定了。破解、修改、入侵都一样,要思路开阔,方法灵活~

    最初,我以为这样就可以优雅的科技全开了。然而今天我想整理这篇文章时才发现我错了,直接调用添加建造选项的CALL能添加成功,我修改成这样为什么不能成功,红警修改大师为什么修改有效?原因,下节分析……这里先重新完善一个内存结构/游戏对象,提出与此相关的几个新对象。昨天不想写博文,为了拖延去看了看我当时由于找到另一个建造CD指针就没仔细分析的,结果解决了今天我遇到的问题眨眼——努力就有收获,不死方能最强王者(但是我对LOL心已经死了,反射弧太长)。

//对应游戏界面中的建筑选项
//游戏中有4个ConstrctionOptions数组,对应4个建造选项卡
//是struct,不是class。结构数组在内存上是连续的,而对象数组存储的是对象指针
//所以上一个数组元素地址加上元素大小得到下一个数组元素地址
struct ConstructionOption
{int                   nCount;         //+0,建造选项数目,仅在第一个建造选项中有意义int                   nID;            //+4,建造编号int                   nType;          //+8,建造类型,07标识建筑(基础建筑、防御建筑)int                   nUnkonwn;       //+C,未知标识数,基础建筑和防御建筑此值不同ConstructionProgress* pConProgress;   //+10,指针指向建造进度对象//...其他未知数据//size=0x30,这也是为什么第一篇中各CD基址相差0x30的原因 //很明确的告诉你,该结构没有指针指向ConstructionDescriptor//对应的图像、名称等等在ConstructionDescriptor中,因此我起的名字还是相当合理的//那游戏怎么将Option和Descriptor联系起来的?请继续阅读下一篇
}//对应建造的过程
class ConstructionProgress
{//...int nCD;           //+24,当前单位建造CDint nTotalTime;    //+28,全局建造时间,联网对战中可能根据此同步建造int nNum;          //+4C,此次建造的剩余队列数量,单独修改此值会崩溃//     猜想与总建造队列数值不一致引起int nNeededMoney;  //+5C,还需求多少金钱此单位建造完成//...
}//对应游戏中的单位定义
class ConstructionDescriptor : public BaseA, ...
{//以下成员继承于基类BaseA,游戏内建筑对象、作战单位都继承了BaseA//包括我发现的游戏内触发器对象,标签对象等//BaseA或许叫做CommonObj更合适,游戏内大部分对象均继承此类//上面的ConstructionProgress不继承BaseAint     nGobalID;                //+10,全局对象IDChar    szName[16];              //+3D,单位定义名称,修改过ini文件的应该熟悉//...int     nCost;                   //+550,造价int     nSold;                   //+554,出售价(复制中心回收)int     nRequiredTechnology;     //+55C,需求科技等级//...
}

    我现在在想这一篇的长度是不是够了呢?停下吧,去修改之前的错误,我发现第一篇描述有错误(那些CD基址不是对应建筑或者兵种的,是相对所在格子的),也归功于今天的遇到的问题带来的一些重新思考。其实笔者,一直在修修改改之前的文章……哭泣的脸从来没写过这么大型的百科,之前也没写过博文。

==========

。。。错误改完了,在最后补充一下第一篇承诺的详细解释:

    以第一格CD为例。第一格CD地址:[game.exe+433A80]+24,当时在第一篇被错误的称作盟军电厂CD地址。第一篇中为了不一上来引入复杂的数据结构,简单的让读者认为,game.exe+433A80存放的指针指向一个SomethingAboutConstuction结构。现在相关类/结构已经在上述完整的描述了,是时候纠正了。

    game.exe+433A80存放的指针指向的是ConstructionProgress对象,game.exe+433A80这个地址是ConstructionOption结构的成员变量pConProgress,减去偏移0x10=game.exe+433A70,即第一格的ConstructionOption对象的起始地址。上面提到nCount仅在第一个建造选项中有意义,即数组ConstructionOptions[0].nCount记录了游戏中该建造选项卡下有几个建造选项,ConstructionOptions[1,2,3,…].nCount=0。

To be continued…

署名许可转载请注明来源,http://www.cnblogs.com/viewll/p/4775482.html

转载于:https://www.cnblogs.com/viewll/p/4775482.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wpf click事件在触摸屏上点击第一次没反应_你的PLC和你的触摸屏为什么总是通讯不上?...

三菱PLC全系列资料免费送啦&#xff01;想要撩我(点击上方红字&#xff0c;免费领资料)很多师傅有以下这些问题&#xff0c;其实除去厂家自行定义的通讯方式外&#xff0c;我们在做项目的时候最常用的通讯方式&#xff0c;通讯不上无非就是这几个原因是否选择正确通讯协议(modb…

ubuntu 开放端口_Masscan端口扫描工具使用小手册

1Masscan介绍1.1 Masscan简介1) nmap是端口扫描仪的合法王位&#xff0c;而今天仍然是最通用的选择。但对于纯粹的速度也有一些已经超越了它&#xff0c;包括scanrand&#xff0c;unicornscan&#xff0c;zmap&#xff0c;和现在的masscan(https://github.com/robertdavidgraha…

hdu4277 暴力

hdu4277 暴力 USACO ORZ Time Limit : 5000/1500ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 4 Accepted Submission(s) : 2 Problem DescriptionLike everyone, cows enjoy variety. Their current fancy is new shapes for pastu…

多线程设置操作时间间隔_听说,有位Java程序员学完这59道多线程面试题之后,直接面上阿里...

前言多线程是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程&#xff0c;进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。软件多线程&…

svm多分类代码_监督学习——分类算法I

本文是监督学习分类算法的第一部分&#xff0c;简单介绍对样本进行分类的算法&#xff0c;包括判别分析(DA)支持向量机(SVM)随机梯度下降分类(SGD)K近邻分类(KNN)朴素贝叶斯分类(NaiveBayes)判别分析(Discriminant Analysis) 判别分析是基于条件概率的分类方法&#xff0c;可以…

oracle awr报告提取,Oracle AWR报告提取方法

默认情况下&#xff0c;oracle是启用数据库统计收集这项功能(AWR)通过show parameter statistics_level来判断是否启用值为TYPICAL或者ALL表示启用AWR值为BASIC&#xff0c;表示禁用AWR1.当前连接实例的AWR报告提取&#xff1a;?/rdbms/admin/awrrpt以sysdba身份登录。SQL>…

关键词组合工具_SEO学习:如何挖掘行业关键词?关键词挖掘策略和工具推荐

关键词是驱动流量增长的基础&#xff01;挖掘关键词是SEO工作的重中之重。如何快速挖掘到行业相关的所有关键词&#xff1f;我们一起了解下。本文大纲如下&#xff1a;拓展和筛选网站主词挖掘搜索引擎推荐关键词业务相关词的挖掘同行关键词的挖掘关键词组合拓展1、拓展和筛选网…

活体检测python_活体检测很复杂?仅使用opencv就能实现!(附源码)!

摘要&#xff1a; 活体检测在各行各业应用比较广泛&#xff0c;如何实现一个活体检测系统呢&#xff1f;早期实现很困难&#xff0c;现在仅使用opencv即可实现&#xff0c;快来尝试一下吧。什么是活体检测&#xff0c;为什么需要它&#xff1f;随着时代的发展&#xff0c;人脸识…

oracle安装命令大全,oracle安装教程及常用命令

虽然网上已经有很多安装教程了,但还是写一个记录一下自己的安装过程以及遇到问题的解决办法1 安装包下载:去oracle的官网 选择DownLoads->database->oracle database:选择接受选择Windows 64的下载,选择file1,和file2,注意两个文件都要下载,下载时要求登录,有oracle账户的…

规格选择_日常使用的拉杆箱脚轮选择哪种规格最合适?

大家可能在采购拉杆箱脚轮的时候&#xff0c;都会有一个问题&#xff0c;拉杆箱脚轮规格选择哪种比较好呢&#xff1f;万向轮好还是单向轮&#xff1f;是万向轮还是单向轮比较耐磨&#xff1f;脚轮厂家诺贝小编接收到大家的疑问&#xff0c;接下来将告诉大家拉杆箱脚轮选择的规…

ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)

1   ERROR: transport error 202: bind failed 2 ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510) 3 JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [../../../src/share/back/debugInit.c:690] 4 …

php session存到redis,php Session存储到Redis的方法

php Session存储到Redis的方法当然要写先安装php的扩展&#xff0c;可参考这篇文章&#xff1a;Redis及PHP扩展安装修改php.ini的设置复制代码 代码如下:session.save_handler redissession.save_path “tcp://127.0.0.1:6379″修改后重启php-fpm或nginx&#xff0c;phpinfo(…

ajax ssm 页面跳转_SSM框架的面试常见问题

阅读文本大概需要9分钟。一、Spring面试题1、Spring 在ssm中起什么作用&#xff1f;Spring&#xff1a;轻量级框架作用&#xff1a;Bean工厂&#xff0c;用来管理Bean的生命周期和框架集成。两大核心&#xff1a;IOC/DI(控制反转/依赖注入) &#xff1a;把dao依赖注入到service…

运维工程师绩效考核表_IT运维存在问题及改进

欢迎大家一起学习交流https://t.zsxq.com/imimAYF​t.zsxq.com1.1 IT运维机制不完善&#xff0c;流程操作层面缺乏统一 没有建立起稳定、规范的IT运维机制。现有的IT运维流程的操作层面缺乏统一。如事件单提交之后&#xff0c;事件预判和优先级的设定缺少统一、规范的指导文档&…

在linux中 要删除abc目录,操作系统原理与应用(linux)A卷

福州外语外贸职业技术学院2010-2011学年第一学期(期末)试卷09 级网络系统管理专业操作系统原理与应用(linux)科目(A )卷课程代码考试形式闭卷考试时量 120 分钟姓名__ _______ _级班学号____ __1.操作系统是一种( )A.系统软件B.系统硬件C.应用软件D.支援软件2.MS—DOS的存贮管理…

数据产品经理修炼手册pdf_【尼读书】数据产品经理修炼手册(附思维导图)

前言&#xff1a;进入一个行业&#xff0c;除了要多在工作中实践和思考之外&#xff0c;还需要多读书。这样能够站在一个更高的角度去看问题&#xff0c;往往会对问题有更全面的掌握和新的认知。在【尼读书】这个栏目中&#xff0c;尼同学通过自己读书后的理解和整理与大家分享…

WebStorm 预览时把浏览器地址localhost 改成IP

最近在使用WebStorm时&#xff0c;预览网页时地址总是显示的 http://localhost:63342/... &#xff0c;如果要调试其它设备感觉很不方法&#xff0c;此时肯定首先想到的亲爱的度娘&#xff0c;但是貌似没有真正很解决问题的&#xff08;可能是我搜索方法不对&#xff09;。最后…

linux内存管理的主要概念是虚拟内存,你知道linux内存管理基础及方法?

描述一、基本概念(1)物理内存和虚拟内存物理内存&#xff1a;系统硬件提供的真实物理内存虚拟内存&#xff1a;利用磁盘空间虚拟出的一块逻辑内存&#xff0c;用作虚拟内存的磁盘空间被称为swap&#xff0c;swap类似于windows的虚拟内存。1、linux的内存管理采取的分页存取机制…

R plot图片背景设置为透明_R语言入门第十二讲:基础绘图(二)------plot与par函数(1)...

上一次给大家简单展示了plot函数的用法&#xff0c;以及par函数的使用。今天我们继续应用这两个函数&#xff0c;看看它的其他功能。下面这个图是数据的一部分[1]。我一直认为&#xff0c;作图简单&#xff0c;但关键是要知道数据在数据库中的格式&#xff0c;才能更好的应用到…

visual studio 2015 搭建python开发环境,python入门到精通[三]

在上一篇博客Windows搭建python开发环境&#xff0c;python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo&#xff0c;这里略带一句&#xff0c;其实就"学习python"而言&#xff0c;比较建议使用pycharm&#xff0c;pychar…