游戏

我们就以《猎人的生存日记》(Orion Sandbox)这款游戏来分析。

下载链接

FlashStart打开Orion Sandbox 1.swf

我们需要反复进入游戏,可以先打开一次游戏,以此进行:文件 \(\rightarrow\)游戏路径\Orion Sandbox 1.swf

工具

  • 可以看16进制的软件(我用的是HxD

数字

因为这是个本地游戏,所以在本地要有个储存的位置。

这个位置一般在C:\Users\UserName\AppData\Roaming\Macromedia\Flash Player#SharedObjects\一串英文#localWithNet\游戏文件夹名

在这里面有\(3\)个文件:

  • player.sol 玩家数据
  • world.sol 地图数据(世界数据)
  • settings.sol 一些设置

我们主要看 player.sol 这个文件。

修改血量

从 player.sol 里找到health这串字符。为什么修改血量要找这字符,因为\(health\)是血量的意思。

68 65 61 6C 74 68 04 64
h e a l t h

如果你的血量是\(100\)的话就可以找到以上数据。

前\(5\)个是health的ASCII码。

04是什么知不道,只能猜,它是字符串的结束,或是整型数字的开始。

64很明显,就是血量。(\(64_{(16)}=100_{(10)}\))

我们将64改成63,然后保存一下。

我建议更改的时候备份一下。

重进游戏:血量变成\(99\)。修改成功。

修改经验值

还是从 player.sol 里找,找experience这串字符。experience n. 经验 vt. 体验。

65 78 70 65 72 69 65 6E 63 65 04 00
e x p e r i e n c e UK

UK 表示未知。(unknow)

00 表示经验是\(0\)。

经验达到\(127\)时,数据中表示7F

exp = 127
65 78 70 65 72 69 65 6E 63 65 04 7F
e x p e r i e n c e UK 127

但经验达到\(128\)时,数据中表示81 00

exp = 128:
65 78 70 65 72 69 65 6E 63 65 04 81 00
e x p e r i e n c e UK 128

81改为82后经验变为\(256\)。

所以\(2\)位数字的范围为\([0, 16383]\),\([00\space00, FF\space7F]\)。

\[(FFh-80h)\times80h+7Fh=3FFFh=16383_{(10)}
\]

\(3\)位数字:\(16384\)表示81 80 00

所以,公式就是:

\[a_0+\sum^{l-1}_{i=1}{2^{7i}(a_i-80h)}
\]

\(l\)是\(a\)的长度。

\(a_0\)是最低位。

C++ 代码:

template<class intT>
intT flashint_to(unsigned char* fints) {
intT res = 0;
size_t l = 0;
intT expr = 1;
while(fints[l++] >= 0x80);
for(size_t i = l - 2;; i--)
{
res += (fints[i] - 0x80) * (expr *= 128);
if(i == 0)
break;
}
res += fints[l - 1];
return res;
} // test
void test() {
::std::cout << flashint_to<int>("\x81\x01"); // 输出 129
}

根据上面的规律,我们也可以逆回去:

\[x\to a_i=\cases{
x\mod 128 & ,i=1 \\
\lfloor x \div2^{7i} \rfloor+80h &,i>1
}
\]

C++ 代码:

template<class intT>
size_t to_flashint(intT x, unsigned char* fints) {
size_t l = 0;
while(x)
{
fints[l++] = x % 128 + 0x80;
x /= 128;
}
for(int i = 0; i < l / 2; i++)
{
fints[i] ^= fints[l - i - 1];
fints[l - i - 1] ^= fints[i];
fints[i] ^= fints[l - i - 1];
}
fints[l - 1] -= 0x80;
return l;
} // test
void test() {
unsigned char buf[10];
int x = 129;
int l = to_flashint(x, buf);
for(int i = 0; i < l; i++)
printf("%x ", buf[i]);
// 输出 81 01
}

有了这两个函数就好办了

flash 游戏分析 - 1的更多相关文章

  1. 第1章 游戏之乐——NIM(2)“拈”游戏分析

    NIM(2)“拈”游戏分析 1. 问题 有N块石头和两个玩家A和B,玩家A先将石头分成若干堆,然后按照BABA……的顺序不断轮流取石头,能将剩下的石头一次取光的玩家获胜.每次取石头时,每个玩家只能从若 ...

  2. Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述

    Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述 Overview 本章的主要的内容是贪吃蛇小游戏的分析和实现,关于实现的具体代码可以在,文章底部的github的链接中找到. 整个游戏通 ...

  3. Java太阳系小游戏分析和源代码

    Java太阳系小游戏分析和源代码 -20150809 近期看了面向对象的一些知识.然后跟着老师的解说做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下近期学的知识: 用到知识点:类的继承.方法的重载 ...

  4. 2048游戏分析、讨论与扩展 - Part I - 游戏分析与讨论

    2048这个游戏从刚出開始就风靡整个世界. 本技术博客的目的是想对2048涉及到相关的全部问题进行仔细的分析与讨论,得到一些大家能够接受而且理解的结果. 在这基础上,扩展2048的游戏性,使其变得更好 ...

  5. flash逆向练习:以逆向的方式通关flash游戏《谈判专家》

    一.缘起 无聊想玩搜个游戏玩,看到一个帖子引起了我的好奇: 但是作者分享的游戏链接已经挂掉了,于是就搜索了一下: 选了7k7k上的一个在线玩,链接:http://www.7k7k.com/swf/15 ...

  6. 植物大战僵尸中文第二版和年度版 游戏分析及delphi源码

    00413184 |. E8 77E30100   |CALL PlantsVs.00431500                  ; 地上的物品00413189 |. 8D7424 10     ...

  7. Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)

    1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命 ...

  8. 24.Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)

    1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命 ...

  9. flash游戏服务器安全策略

     在网页游戏开发中,绝大多数即时通信游戏采用flash+socket 模式来作为消息数据传递.在开发过程中大多数开发者在开发过程中本地没有问题,但是一旦部署到了网络,就存在连接上socket服务器.究 ...

  10. u-boot分析(九)----nand flash初始化|nand flash读写分析

    u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们 ...

随机推荐

  1. C# 闭包类对弱引用的坑

    闭包.弱引用的简单概念,大佬们描述的很多,有不了解的可以看看: 理解C#中的闭包 - 黑洞视界 - 博客园 (cnblogs.com) C#弱引用(WeakReference) - 简书 (jians ...

  2. 加速 AI 训练,如何在云上实现灵活的弹性吞吐

    AI 已经成为各行各业软件研发的基础,带来了前所未有的效率和创新.今天,我们将分享苏锐在AWS量化投研行业活动的演讲实录,为大家介绍JuiceFS 在 AI 量化投研领域的应用经验,也希望为其他正在云 ...

  3. 张量(Tensor)、标量(scalar)、向量(vector)、矩阵(matrix)

    张量(Tensor):Tensor = multi-dimensional array of numbers 张量是一个多维数组,它是标量,向量,矩阵的高维扩展 ,是一个数据容器,张量是矩阵向任意维度 ...

  4. .NET Core 离线生成 Tron 波场私钥和地址笔记

    NuGet 引入依赖库 PM> Install-Package Tron.Wallet.Net 随机生成私钥和对应的地址 using Tron.Wallet.Net; namespace Con ...

  5. 大米cms爆破后台及支付逻辑漏洞

    又找到个网站挖洞,我来康康. 大米手机是个什么鬼手机??看一下吧 这个支付页面好熟悉,可能存在支付逻辑漏洞,咱们用burp改个包看看. 先支付一个看看 把包里那个=1改成0试试~ 证实确实存在支付逻辑 ...

  6. 文心一言 VS chatgpt (5)-- 算法导论2.2 3~4题

    三.再次考虑线性查找问题(参见练习 2.1-3).假定要查找的元素等可能地为数组中的任意元素,平均需要检查输入序列的多少元素?最坏情况又如何呢?用0记号给出线性查找的平均情况和最坏情况运行时间.证明你 ...

  7. 2021-03-06:go中,公共变量是协程安全吗?赋值操作是原子的吗?为什么?

    2021-03-06:go中,公共变量是协程安全吗?赋值操作是原子的吗?为什么? 福哥答案2021-03-06: 这是面试中被问到的.实力有限,真正的答案还不知道.我的想法是a=1是原子操作,a=b不 ...

  8. Netty自定义协议要素

    魔数:用来判断是否是无效数据包 协议版本号:可以支持协议的升级 序列化算法:消息正文使用哪种序列化方式,可以扩展.例如:protobuf,json,hessian等 指令类型:跟业务相关,例如:登录, ...

  9. 【python基础】基本数据类型-字符串类型

    1.初识字符串 字符串就是一系列字符.在python中,用引号括起来文本内容的都是字符串. 其语法格式为:'文本内容'或者"文本内容" 我们发现其中的引号可以是单引号,也可以是双引 ...

  10. SpringBoot整合OSS文件上传

    一.注册阿里云账号并开通OSS服务 1.登录阿里云账号 2.创建一个bucket 3.创建子用户 对自用户分配权限,打开操作OSS的全部权限(也可根据业务需求进行更改) 4.配置上传跨域规则 任何来源 ...