开发者社区> apachecn_飞龙> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

郁金香商业辅助教程 2016 笔记 11~15

简介: 11 背包分析 上一节中我们发现,背包对象储存物品对象的指针,并且如果某一栏没有物品,那么那个位置就是NULL。我们可以以此快速寻找某个位置的地址。
+关注继续查看

11 背包分析

上一节中我们发现,背包对象储存物品对象的指针,并且如果某一栏没有物品,那么那个位置就是NULL。我们可以以此快速寻找某个位置的地址。

比如说,我们先把第二个位置留空,在 CE 中搜索 0。搜索过程中,有些地址的数值会变化,所以多点几下“再次扫描”:

把第四个物品移到第二个,搜索比 0 大的数值:

再把物品移动回去,搜索 0:

反复几次之后,就只剩一个结果了:

我们可以验证一下。这个数值加 4 就是第三个物品的位置,再 4 就是第四个物品的位置。我们将物品 2-4 添加到底下:

我们再次把第四个移到第二个,数值也会相应变化。

所以我们找对了地址。

下一步寻找背包基址,在任意一个地址上右键,“找出是什么访问了这个地址”。

中间有几个指令,是背包基址+物品栏偏移+物品序号*4的形式,所以就是它们了。我们选取第一个00656358,背包基址应该是 EDX 的值1b4d6238

这条指令上面的31a8b3c就是存放背包指针的地址。

然后我们挑选第三个物品2f8eb250,分析它的属性。切换为 ASCLL 视图:

可以整理出一张表:

偏移 属性
0x5c 物品名称
0xf1 物品描述
0x244 数量

12 背包数据的封装

首先在BaseGame.h中定义背包基址的地址:

然后在StructGame.h中定义背包列表结构和物品结构:

然后在StructGame.cpp中实现GetData。先定义偏移常量:

这是GetData的实现:

然后到CMainDialogWnd.cpp的按钮回调中,添加输出代码:

我们可以看到输出信息:

13 使用任意物品

这是第十节中的物品使用 CALL:

我们用 OD 附加游戏,在这个 CALL 上下断点:

我们发现,第一个参数是 0,第二个参数是 1,这些没有变化。唯一变化的是第三个参数,经过试验,它是物品的下标(从 0 开始)。

ECX 是前面的 EDI,在之前的分析中,它是背包基址,但它是动态分配的,和之前相比也变化了。我们用 CE 看看哪个位置存放了这个地址:

第一个结果就是我们第十一节中的那个地址。

编程的逻辑是这样的,我们遍历物品列表,找到金疮药的下标。然后再调用这个 CALL。

14 编程使用物品

首先定义物品使用 CALL 的地址:

在物品列表结构中定义方法UseGoodForIndex,它接受下标,使用指定下标处的物品:

我们还需要定义一个方法,使用指定名称的物品,在此之前我们还需要一个方法GetGoodIndexForName,按照名称寻找物品,并返回下标:

然后就可以定义方法UseGoodForName

我们在回调中调用这个方法,然后判断结果:

可以看到物品使用成功:

15 实现自己的TRACE

这一节中我们要实现自己的TRACE。这个函数有两个特点:

  • 接受格式字符串和格式化参数,格式化参数是可变的。
  • 调用 APIOutputDebugStringA,这个函数不是变参的。

思路是,我们可以用sprintf将输出字符串格式化好,存到一个地方。然后用它调用OutputDebugStringA

但是变参函数不能调用变参函数,我们需要使用它的非变参版本vsprintf,它接受缓存区地址,格式字符串和格式化参数的起始地址。这就像 Java 中,编译器把可变参数放进数组中,然后再传给函数。

我们还需要用到三个宏:

  • va_list实际上就是char*,没啥特别的。
  • va_start(p, arg)首先将arg的地址加上arg的大小赋给p。实际上将p指向arg的下一个位置。
  • va_end(p)清空p

除此之外还需要给输出字符串添加前缀,以便在工具中过滤它,这可以通过strcat_s实现。

这是我们所实现的函数:

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
react项目实战学习笔记-学习56-图片上传成功
react项目实战学习笔记-学习56-图片上传成功
5 0
大规模天线无线信道建模 概述 | 带你读《大规模天线波束赋形技术原理与设计 》之十九
本章主要对大规模天线无线信道建模进行分析和介绍。大规模天 线波束赋形技术对于未来低频段和高频段无线移动通信系统都 是不可或缺的关键技术,用于高层楼宇覆盖、室外宏覆盖、热点覆盖 和无线回传等场景,起到提升频谱效率、扩展覆盖等作用。对这些场 景进行抽象概括,得到了信道建模的场景,分别为 UMa(Urban Macro)、 UMi(Urban Micro)、RMa(Rural Macro)和 Indoor Office 场景。本 章重点探讨了引入垂直维度后的三维信道建模,包括大尺度建模和小 尺度建模,并在最后给出了信道建模的完整流程。
2911 0
为ECS Ubuntu 18.04实例配置辅助私网IP地址
本文介绍,如何给Ubuntu 18.04系统配置辅助私网ip。
3691 0
ionic3项目实战教程 - 第11讲 ionic3个人中心界面设计
ionic3项目实战教程 - 第11讲 ionic3个人中心界面设计 这一讲主要包含一下几个部分: 1.个人中心ts具体代码展示; 2.个人中心html具体代码展示; 3.
1264 0
《Springboot极简教程》SpringBoot热部署应用Developer tools
http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html
722 0
C#零基础入门04:打老鼠初级之枚举、重构、事件处理器
一:为界面加入“开始”、“暂停”、“停止” 经过上节课程我们的交互的过程,我们的程序增加了用户友好度,同时也可以记录更为详尽的成绩了。但是我们仍然发现有很多地方需要值得改进(或许你还发现了BUG?不着急。
746 0
+关注
apachecn_飞龙
Github:@wizardforcel 简书:@ApacheCN_飞龙 微博:@龙雀 CSDN:@wizardforcel ApacheCN 官网:apachecn.org 机器学习交流群:629470233
719
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载