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

来吧,跟我继续填坑,这一篇就讲选中单位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, public BaseD
{//从内存结构上来讲,起始地址的前4个DWORD,就是虚函数表指针...DWORD    dwTrigger;      //+34,关联标记(用过地图编辑器就知道了),链表int      nGroup;         //+1AC,所在编队0~9int       nHP;            //+6Cint       nX;             //+1A0,X坐标int       nY;             //+1A4DWORD    dwGrade;        //+11C,等级Player*    pOwner;         //+1B4,所属者....//sizeof=0x608,因为继承了4个类,上面的这些可能都是基类的内容//详请百度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]  //ECX=单位地址
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

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

红色警戒2修改器原理百科(五)相关推荐

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

    (二十一)转换阵营--很炫酷却很简单 这个功能,貌似当初很火很轰动,感觉很强大--联网对战中控制对手单位,卖掉对手建筑!右边的建造选项也是对手的,你可以替对手建造单位.可是这个原理很简单,游戏中一个很 ...

  2. Qt实现的红色警戒3修改器

    前言 这部修改器制作有一段时间了,但是一直没出教程.今天利用周末空闲写篇教程,给后来者指路的同时也加深自己对游戏修改器的理解,大佬就随便看看吧 浏览了一下网络,形形色色的单机游戏修改器教程,但是基本只 ...

  3. 【术】游戏内存修改器原理及游戏敏感数值加密建议

    介绍市面上主流游戏内存修改器的原理,对症下药,让游戏从数据加密层面上更好的抵御这类内存修改器. 主流游戏内存修改器有三大内存搜索功能: 1. 基础数值搜索 2. 模糊搜索 3. 反加密搜索 基础数值搜 ...

  4. 《红色警戒2·尤里复仇》-第五章 无限超武

    目录 第五章 无限超武 名人虾言: 荒塘爽一爽: 逆向分析 ①搜索增加的数值 ②找出是什么改写了这个地址 ③下断点 ④搜索 小总结: 找判断条件 第五章 无限超武 名人虾言: "一袋米要抗几 ...

  5. 利用cheat engine以及VC编写游戏修改器

    cheat engine的介绍已经完毕了,下面就是怎么使用它的问题,这里写一个稍微有意思一点的,也有实际用途的话题,就是来编写自己的游戏修改器. 这篇文章参考了http://www.pediy.com ...

  6. 打造自己的游戏修改器和内存补丁

    相信很多人打游戏的时候都用修改器,这里我介绍怎样用VB编写修改器. 1.其实修改器原理很简单,一般来说,在游戏运行的时候我们对游戏内存空间中必要的数据进行修改就可以了.举个例子来说,一款拳皇模拟器里游 ...

  7. 单机游戏修改器——从计算机基础学科出发

     游戏修改器--从计算机基础学科出发 qq:610551883@qq.com 主要针对单机游戏.从操作系统层面对如何做进行了说明. 认识内存  图1所示的为某一代内存条的硬件示意图,任何与CPU打交道 ...

  8. 游戏修改器的基本工作原理

    所谓游戏修改器,主要是通过修改游戏程序的内存数据或存盘文件来修改游戏中的相关数据,使之达到"无敌"等效果. 游戏修改器主要分为两类:单一游戏的修改器和通用游戏修改器.顾名思义,前者 ...

  9. 游戏修改器、外挂原理

    修改内存. 通过一款第三方软件金山游侠2002便可以找到那些存储数据的地址,在我们玩游戏的过程中,通过单一变量法来分析某种属性的地址在哪里,比如说玩游戏的过程中生命全满然后保持其他不变将生命值减少然后 ...

  10. (8)3DMAX之车削修改器、曲面修改器、放样建模(放样建模原理、放样变形器、拟合放样)

    一.车削修改器 1.图形按照轴心线旋转 生成原理:通过我们绘制出来的二维图形,按照我们所指定的轴心线进行旋转所生成得到的三维模型结构 2.更改"轴"的位置:两种方法 方法1:进入& ...

最新文章

  1. 导航条——收缩式导航菜单
  2. SpringBoot:常用属性汇总
  3. mysql安装的根目录_MySql安装及基础配置(一)
  4. Zabbix监控zookeeper
  5. dockerfile COPY ADD 命令
  6. Dart是一个怎样的语言?
  7. builtins.ModuleNotFoundError: No module named ‘’scrapy.contrib‘’
  8. IIS应用程序池相关问题及连接池已满的解决方法
  9. 基于.NET下的人工智能|利用ICSharpCore搭建基于.NET Core的机器学习和深度学习的本地开发环境...
  10. idea资源包下创建资源包_资源包技巧和最佳实践
  11. mysql的批量更新的语法,MySql 批量更新语法
  12. 中关村开发者社区代表向全球发出这样一份倡议!
  13. html添加java代码_在HTML中插入JSP代码
  14. 三、基础的Serializer序列化器
  15. RPLIDAR A1激光雷达学习笔记
  16. 5:实战2:微信自动加好友 JavaAppium
  17. 小米5 MIUI 10系统完全Root教程 (Root思想通用所有机型)
  18. matlab三点确定抛物线,[转]matlab编写的进退法,黄金分割法,抛物线法(二次插值法),wolfe不精确一维搜索...
  19. Linux挂载群晖NFS共享文件夹
  20. Java中怎么切换窗口

热门文章

  1. 在移动硬盘中安装WIN10
  2. 把编程当小葵花妈妈课堂
  3. c语言在电路设计作用,ds1307怎么使用(ds1307引脚图及功能_c语言程序及典型应用电路)...
  4. 实用防火与防爆技术培训---第十一讲 可燃固体燃爆特性
  5. Hdl_localization全套安装运行问题总结
  6. Hyper-v 实现桌面虚拟化
  7. 2.自动加载(phalapi框架总结)
  8. postgres中的中文分词zhparser
  9. 我的日程安排表(理解代码)学习记录Java
  10. RESTful及其特点