红色警戒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,一经查实,立即删除!

相关文章

python两个线程交替打印_三线程按顺序交替打印ABC的四种方法

建立三个线程A、B、C&#xff0c;A线程打印10次字母A&#xff0c;B线程打印10次字母B,C线程打印10次字母C&#xff0c;但是要求三个线程同时运行&#xff0c;并且实现交替打印&#xff0c;即按照ABCABCABC的顺序打印。二、Synchronized同步法1、基本思路使用同步块和wait、noti…

支付宝支付php代码示例,Laravel使用支付宝进行支付的示例代码

/*支付*/public function pay(){header("content-type:text/html;charsetutf8");//echo 1;die;// ******************************************************配置 start*******************************************************************************************…

关于开发中的常用手段(个人建议)

由于最近在一家外包公司 做项目 &#xff08;团队开发 3个人&#xff09; 有个朋友一起 我们研究出一套 相对来说 速度和效率都比较高的开发方法。 1. 搭建界面 对于一个程序来说 无疑刚上来就要看原型 看UI 看切图 所以界面是首要做的 那么我来说下做界面的常用方法仅个人看法…

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

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

php索引数组相等,php二维数组中子数组的某一键相等,其余键值求和

需要处理的数组Array([0] > Array([uid] > 1[price] > 85.00[earnings] > 40.00)[1] > Array([uid] > 8[price] > 56.00[earnings] > 31.00)[2] > Array([uid] > 15[price] > 56.00[earnings] > 31.00)[3] > Array([uid] > 15[price…

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

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

MFC类的结构

1. CObject类&#xff0c;MFC库中绝大部分类的基类&#xff0c;封装了MFC中的最基本机制。 运行时类信息机制/动态创建机制/序列化机制等。。。 2. CCmdtarget - 消息映射机制最基类 3. CWinThread/CWinApp- 应用程序类&#xff0c;负责整个程序的执行流程。 4. CDocment及子类…

php base64安全吗,php base64

场景&#xff1a;PHP 用base64兑现加密解密PHP 用base64实现加密解密php中用base64实现加密解密: base64_encode() 和 base64_decode() 进行加密和解密.语法: string base64_encode ( string data )使用 base64 对 data 进行编码。设计此种编码是为了使二进制数据可以通过…

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;进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。软件多线程&…

在php中源代码怎么查看,查看PHP Closure的源代码

您可以从PHP获得的是有限的,使用反射您只需获取函数的参数签名以及源代码文件的开始和结束行.我曾经写过一篇博客文章&#xff1a;http://www.metashock.de/2013/05/dump-source-code-of-closure-in-php/ ……它引导我使用反射以下代码&#xff1a;function closure_dump(Closu…

nginx禁止访问目录中可执行文件

某些网站系统需要用户上传图片等文件到某些目录下,难免程序有些漏洞,导致用户上传了php、cgi等等可执行的文件&#xff0c;导致网站陷入非常为难的境地. 此时我们可以通过nginx来禁止用户访问这些目录下的可执行文件。 nginx配置 1234location ~* /(images|cache|media|logs|tm…

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、拓展和筛选网…

oracle em中查看jiob,HTML5 中的 b/strong、i/em 详解

这篇文章主要聊一聊 HTML5 中的 和 &#xff0c;以及 和 。从页面显示效果来看&#xff0c;被 和 包围的文字将会被加粗&#xff0c;而被 和 包围的文字将以斜体的形式呈现。那大家可能就会疑惑了&#xff0c;既然效果一样&#xff0c;那为什么还要重复定义标签呢&#x…

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

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

bootstrap清除拟态框内添加新HTML再打开时会有缓存现象

$(function(){$("#editor").on("hidden.bs.modal",function(){//清除缓存方法$(this).find("#textareaTo").empty();}); }); 转载于:https://www.cnblogs.com/zhixi/p/4789259.html

php 结尾,PHP“意外结束”

我实际上检查了我的代码一百次,但我找不到错误&#xff1a;我得到的错误&#xff1a;解析错误&#xff1a;语法错误,意外$end在/home/tennox/public_html/php/kalender.php第46行我试图做一个计算复活节星期日的函数,在另一个脚本中没有其他所有它只是起作用,但在这个没有.另一…

基于python的个人博客系统的设计开题报告_个人博客设计实现开题报告

现在的毕业设计的开题报告是很难写吗&#xff0c;以个人博客设计为课题的开题报告怎么写&#xff1f;看下文是yjbys小编搜集整理的关于开题报告的相关资料&#xff0c;希望对大家有所帮助!1本课题所涉及的问题在国内(外)的研究现状综述&#xff1a;信息化的世界&#xff0c;对于…