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初始化进行分析. 今天我们 ...
随机推荐
- 快速上手Linux核心命令(九):文件备份与压缩
目录 tar 打包备份 gzip 压缩或解压文件 zip 打包和压缩文件 unzip 解压zip文件 scp 远程文件复制 rsync 文件同步工具 这期呢主要说一说Linux中文件备份与压缩命令,一 ...
- python轻量级性能工具-Locust
Locust基于python的协程机制,打破了线程进程的限制,可以能够在一台测试机上跑高并发 性能测试基础 1.快慢:衡量系统的处理效率:响应时间 2.多少:衡量系统的处理能力:单位时间内能处理多少个 ...
- 基于.Net开发的数据库导入导出的开源项目
在项目开发过程中,我们经常碰到从数据库导入导出的需求,虽然这样的功能不是很复杂,但是往往我们都会碰到一些问题. 比如导入的Excel格式问题.Excetl中图片导入问题,导出的需求为了方便客户查看,会 ...
- JavaScript中的四种枚举方式
字符串和数字具有无数个值,而其他类型如布尔值则是有限的集合. 一周的日子(星期一,星期二,...,星期日),一年的季节(冬季,春季,夏季,秋季)和基本方向(北,东,南,西)都是具有有限值集合的例子. ...
- JavaFx 关键字高亮文本实现
原文地址:JavaFx 关键字高亮文本实现 - Stars-One的杂货小窝 整蓝奏云批量下载器里的搜索功能想到的一个关键字高亮功能,借助textflow组件来实现,记录一下 本文基于TornadoF ...
- 2021-12-27:给定一个字符串str,和一个正数k, str子序列的字符种数必须是k种,返回有多少子序列满足这个条件。 已知str中都是小写字母, 原始是取mod, 本节在尝试上,最难的, 搞出
2021-12-27:给定一个字符串str,和一个正数k, str子序列的字符种数必须是k种,返回有多少子序列满足这个条件. 已知str中都是小写字母, 原始是取mod, 本节在尝试上,最难的, 搞出 ...
- vue工程内下载路由
一.路由Router Vue Router 是Vue.js官方的路由管理器.它和Vue.js的核心深度集成,加速构建单页面应用.包含功能有: 1 嵌套的路由/视图表 2 模块化的.基于组件的路由配置 ...
- c#优雅高效的读取字节数组——不安全代码(1)
在开发上位机的经历中,会有很多需要和下位机交互通信的场景,大多数都会定义一个和硬件的通信协议,最终在上位机代码中的形式其实就是符合通信协议的字节数组. 目录 场景 如何解析字节数组到类或结构体中 建立 ...
- 快速上手kettle(二)小试牛刀
目录 一 .前言 二 .两个小目标 三. kettle核心概念介绍 3.1 转换 3.1.1 步骤(Step) 3.1.2 跳(Hop) 3.1.3 元素据 3.1.4 数据类型 3.1.5 并发执行 ...
- 适用于Linux命令的10个R函数
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 这篇文章将介绍 10 个不同的 Linux 命令及其 R 实现方法. 如果您有兴趣学习更多 R ...