flash 游戏分析 - 1
游戏
我们就以《猎人的生存日记》(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]\)。
\]
\(3\)位数字:\(16384\)表示81 80 00。
所以,公式就是:
\]
\(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\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章 游戏之乐——NIM(2)“拈”游戏分析
NIM(2)“拈”游戏分析 1. 问题 有N块石头和两个玩家A和B,玩家A先将石头分成若干堆,然后按照BABA……的顺序不断轮流取石头,能将剩下的石头一次取光的玩家获胜.每次取石头时,每个玩家只能从若 ...
- Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述
Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述 Overview 本章的主要的内容是贪吃蛇小游戏的分析和实现,关于实现的具体代码可以在,文章底部的github的链接中找到. 整个游戏通 ...
- Java太阳系小游戏分析和源代码
Java太阳系小游戏分析和源代码 -20150809 近期看了面向对象的一些知识.然后跟着老师的解说做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下近期学的知识: 用到知识点:类的继承.方法的重载 ...
- 2048游戏分析、讨论与扩展 - Part I - 游戏分析与讨论
2048这个游戏从刚出開始就风靡整个世界. 本技术博客的目的是想对2048涉及到相关的全部问题进行仔细的分析与讨论,得到一些大家能够接受而且理解的结果. 在这基础上,扩展2048的游戏性,使其变得更好 ...
- flash逆向练习:以逆向的方式通关flash游戏《谈判专家》
一.缘起 无聊想玩搜个游戏玩,看到一个帖子引起了我的好奇: 但是作者分享的游戏链接已经挂掉了,于是就搜索了一下: 选了7k7k上的一个在线玩,链接:http://www.7k7k.com/swf/15 ...
- 植物大战僵尸中文第二版和年度版 游戏分析及delphi源码
00413184 |. E8 77E30100 |CALL PlantsVs.00431500 ; 地上的物品00413189 |. 8D7424 10 ...
- Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)
1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命 ...
- 24.Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)
1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命 ...
- flash游戏服务器安全策略
在网页游戏开发中,绝大多数即时通信游戏采用flash+socket 模式来作为消息数据传递.在开发过程中大多数开发者在开发过程中本地没有问题,但是一旦部署到了网络,就存在连接上socket服务器.究 ...
- u-boot分析(九)----nand flash初始化|nand flash读写分析
u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们 ...
随机推荐
- 机器学习02-(损失函数loss、梯度下降、线性回归、评估训练、模型加载、岭回归、多项式回归)
机器学习-02 回归模型 线性回归 评估训练结果误差(metrics) 模型的保存和加载 岭回归 多项式回归 代码总结 线性回归 绘制图像,观察w0.w1.loss的变化过程 以等高线的方式绘制梯度下 ...
- 一文彻底搞懂ZAB算法,看这篇就够了!!!
最近需要设计一个分布式系统,需要一个中间件来存储共享的信息,来保证多个系统之间的数据一致性,调研了两个主流框架Zookeeper和ETCD,发现都能满足我们的系统需求.其中ETCD是K8s中采用的分布 ...
- PBN衔接ILS时中间进近航段的保护区绘制方法
收到网友提问,PBN程序和ILS程序在衔接时,中间进近航段的保护区该怎么去绘制. 这个问题怎么看呢?首先起始进近航段与中间进近航段存在两种连接方式,一种是直线进近.另一种是转弯进近,两者的保护区是显著 ...
- 2023-04-16:给定一个长度为N的数组,值一定在0~N-1范围,且每个值不重复 比如,arr = [4, 2, 0, 3, 1] 0 1 2 3 4 把0想象成洞
2023-04-16:给定一个长度为N的数组,值一定在0~N-1范围,且每个值不重复 比如,arr = [4, 2, 0, 3, 1] 0 1 2 3 4 把0想象成洞,任何非0数字都可以来到这个洞里 ...
- 2021-03-10:一个数组上共有 N 个点,序号为0的点是起点位置,序号为N-1 的点是终点位置。现在需要依次的从 0 号点走到 N-1 号点。但是除了 0 号点和 N-1 号点,他可以在其余的 N-2 个位置中选出一个点,并直接将这个点忽略掉,问从起点到终点至少走多少距离?
2021-03-10:一个数组上共有 N 个点,序号为0的点是起点位置,序号为N-1 的点是终点位置.现在需要依次的从 0 号点走到 N-1 号点.但是除了 0 号点和 N-1 号点,他可以在其余的 ...
- 2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的。返回其长度。
2021-03-30:给定一个整数组成的无序数组arr,值可能正.可能负.可能0.给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的.返回其长度. 福大大 答 ...
- 2022-02-24:k8s安装rabbitmq,yaml如何写?
2022-02-24:k8s安装rabbitmq,yaml如何写? 答案2022-02-24: yaml如下: apiVersion: apps/v1 kind: Deployment metadat ...
- 2022-02-22:机器人大冒险。 力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种
2022-02-22:机器人大冒险. 力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0).小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动.指令有两种 ...
- < Python全景系列-8 > Python超薄感知,超强保护:异常处理的绝佳实践
欢迎来到我们的系列博客<Python全景系列>!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法.无论你是编程新手,还是有一 ...
- Flutter三棵树系列之BuildOwner
引言 Flutter开发中三棵树的重要性不言而喻,了解其原理有助于我们开发出性能更优的App,此文主要从源码角度介绍Element树的管理类BuildOwner. 是什么? BuildOwner是el ...