CS420 课程笔记 P4 - 以16进制形态编辑游戏文件
文章目录
- Introduction
- Finding save files
- Strings
- Unicode
- Example!
- Value search
- Health search
- Conclusion
Introduction
这节课我们将学习编辑十六进制,主要用于编辑保存文件,但十六进制编辑涉及的技能可以很好地转移到:
- Save file editing
- Resources editing
- Raw memory editing
- Packet editing
这些都是我们将学习的有用技术,因此十六进制编辑也有三个主要步骤:
- Find info in save file that you want to hack
- Hex edit the file
- See if it worked
Finding save files
- 选项一 Just google it - 没有必要在这上面努力工作并花费时间精力
- 选项二 API monitoring - 询问操作系统去查看游戏使用了哪些文件,你可以拦截游戏保存文件的请求,这样就可以知道游戏使用了什么文件
- 游戏使用 OS Calls 去读写文件
- 系统更新文件在 Hard drive 硬盘上
- 使用 Process Monitor 可以查看游戏在请求系统做什么,同样的,很多反作弊系统也通过查看有没有恶意软件在进行一些危险请求来确认游戏是否被攻击
微软官网下载 Process Monitor 并解压出来后打开即可

你可以使用 Find 工具

或者使用作者更喜欢的 Include Process From Window,你只需要把这个拖动到某个窗口上,接下来程序就只会显示你筛选的那个窗口的信息了

因为游戏是从数据中进行流式传输的,所以他会不断访问,如下:

所以让我们忽略 ReadFile 这种 Operation,只关注保存文件时的事件,只需要右键 ReadFile 然后 Exclude 即可
当我们购买一个物品消耗了一波金币,会发现 CreateFile 事件,路径是某个文件夹下的 Global.sqa 我们只需要购买一些东西并使用该工具,即可隔离保存文件!
Strings
很棒!我们已经发现了保存文件所在的目录,但在我们开始编辑文件之前,我们需要了解字符串。
回到我们对文件的理解,文件和程序似乎不是一个东西,但两者之间有很多相似之处,到目前为止我们学习的一切东西都适用于文件和计算机程序,由字节信息组成,我们学习了整数如何存储,现在我们要了解一下字符串如何存储:
73 71 75 61 6C 6C 79 00 00 00 00 00 00 … 省略后续的 00
这串字符的意思是 squally,如果你查看字节,你会发现有一个十六进制字符代表 squally 中的每个字符,在这情况下,73代表s,71代表q 等等,还留下了一堆 00,这些零似乎没有意义,他们只是额外的空间,如果我们决定在编程时向单词中添加更多文本,这些 00 有一个特殊的名称,被称为空终止符,程序员必须决定一个单词可以有多少个字母,任何未使用的字母都只是零。
现代的编程语言比如 C++ C# Python 可能不会让你看到额外的零,只有一个零或者甚至根本没有。
你会注意到 73 代表 s,这是 ASCII 编码,你可以通过 google baidu 来找到对应的表!
Unicode
有些时候可能不使用英文来玩游戏,这时候想解决这个简单的问题不要困惑,所以有一个叫做 Unicode 的标准,可以显示我们想要在计算机上显示的所有语言,最流行的是 utf-8,因为它建立在 ASCII 标准上,utf-16 也十分流行:
- A - ASCII -> 0100 0001
- A - UTF-8 -> 0100 0001
- A - UTF-16 -> 0000 0000 0100 0001
- 日语a - UTF-8 -> 1110 0011 1000 0001 1000 0010
- 日语a - UTF-8 -> 0011 0000 0100 0010
如果我们用 utf-8 编码这个日语的符号,将会占用 3个bytes,使用 utf-16 将会占用 2个bytes。因此在 Hex 编辑器中,你可以选择显示文本和不同的编码
Example!
在之前的例子中我们找到了 Global.sqa 它就是我们发现的文件,我们先使用 Ctrl+c、Ctrl+v 进行备份,接下来我们使用 HxD 编辑器来查看该文件。
在这里切换每一行显示的字符数量

打开右侧的数据检视

编辑器会自动尝试将这些字节转换成 ASCII 字符,那么我们要在里面查找金币数量,只需要按 Ctrl + F 并输入 GOLD,找到1个匹配项以后我们就可以充分相信,这后面的数据存储的就是 GOLD,我们可以猜测,接下来的 4个bytes 存储的就是金币,因为大多数金币使用 int32 存储
举例在植物大战僵尸中,数据存储在 user1.dat 中,金币在圈起来的位置,修改后保存即可更改玩家的金币数量,在这里只是使用备份作为参考,修改后实际上并没有作用,需要进行内存修改!

注意,在计算机内部存在小端序和大端序两种数据排布方式:
- 小端序 Little Endian E7 03 00 00 = 999
- 大端序 Big Endian 00 00 03 E7 = 999
人类阅读和书写数字的顺序是大端序,但在计算机中往往是通过小端序来排布设置的,所以我们直接阅读 HxD 中的 bytes 数据是无意义的,但在数据检视中查看,HxD 会帮你排布好数据真实的顺序~
Value search
我们接下来讨论数值搜索,这次还是修改金币,但这一次通过不同的方式来做。我们很幸运可以通过 GOLD 这个字来获得金币,因为数据是按照字典方式来存储的,但如果游戏使用了不同的编程方式这就无效了
更可靠的办法是,我们通过金币的数值来搜索数据,记住我们的金币数值比如 679,然后按 Ctrl + F 在 HxD 中搜索整数,这就可以找到金币所在的位置了!

Health search
上面的情况是最幸运的,有时候我们不止有一个匹配项,这次试试把生命值从 8 修改到 16 吧,当你在文件中搜索 8 有时你会发现数百个匹配项,我们不可能一个一个修改保存尝试。
- 把你 8 生命值的存档保存,然后备份命名 8health.spa
- 去游戏里恢复或降低生命值,总之让生命值产生变化
- 打开分析工具,把光标放在同一开始的地方,按 F6 开始对比!


Conclusion
对于某些游戏,这两种办法可能都不生效
- 有可能游戏重启以后,玩家和怪物的对象整体地址会变化,可能会交换或者其他
- 第一种办法可行性更小,很多时候游戏不会编码字典
同时为了反作弊,可能会有其他办法阻止你修改
- Anti-cheat Integrity checks (checksums)
- Encrypted filles
相关文章:
CS420 课程笔记 P4 - 以16进制形态编辑游戏文件
文章目录 IntroductionFinding save filesStringsUnicodeExample!Value searchHealth searchConclusion Introduction 这节课我们将学习编辑十六进制,主要用于编辑保存文件,但十六进制编辑涉及的技能可以很好地转移到: Save file editingRe…...
计算机毕设之Python的高校成绩分析(含文档+源码+部署)
本系统阐述的是一个高校成绩分析系统的设计与实现,对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构。…...
【Sentinel】核心API-Entry与Context
文章目录 一、Entry1、Entry的声明2、使用API自定义资源3、基于SentinelResource注解标记资源 二、Context1、Context介绍2、Context的初始化3、AbstractSentinelInterceptor4、ContextUtil 一、Entry 1、Entry的声明 默认情况下,Sentinel会将controller中的方法作…...
HashMap源码阅读解惑
HashMap的hash函数(1.8) 首先1.7的是四次扰动,1.8做了优化。 简单的说就是对key做hashCode操作,然后将得到的32为散列值向右位移16位,再与hashCode做异或计算。实质上是把一个数的低16位与他的高16位做异或运算。 st…...
如何解决前端传递数据给后端时精度丢失问题
解决精度丢失 有时候我们在进行修改操作时,发现修改既不报错也不生效。我们进行排查后发现服务器端将数据返回给前端时没有出错,但是前端js将数据进行处理时却出错了,因为id是Long类型的,而js在处理后端返回给前端的Long类型数据…...
使用Maven创建父子工程
📚目录 创建父工程创建子模块创建子模块示例创建认证模块(auth) 结束 创建父工程 选择空项目: 设置:项目名称,组件名称,版本号等 创建完成后的工程 因为我们需要设置这个工程为父工程所以不需要src下的所有文件 在pom…...
Vue+elementUI 导出word打印
import JSZipUtils from "jszip-utils"; import JSZip from "pizzip"; import Docxtemplater from "docxtemplater"; npm安装以上依赖 首先维护个word模板 导出方法 //导出wordskipOutWord(row) {var printData rowconst data JSON.parse(JS…...
数学建模-点评笔记 9月3日
1.摘要:关键方法和结论(精炼的语言)要说明,方法的合理性和意义也可以说明。 评委先通过摘要筛选(第一轮) 2.时间序列找异常值除了3西格玛还有针对时间序列更合适寻找的方法 3.模型的优缺点要写的详细一点…...
使用Spring来管理对象关系映射(ORM)
简介 对象关系映射(Object-Relational Mapping,简称ORM)是一种技术,用于在面向对象程序和关系型数据库之间进行数据的映射。Spring框架提供了强大的支持来简化和优化ORM开发过程。本文将介绍如何使用Spring来管理对象关系映射。 …...
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
作者简介 前言 博主之前写过一个完整的MQ系列,包含RabbitMQ、RocketMQ、Kafka,从安装使用到底层机制、原理。专栏地址: https://blog.csdn.net/joker_zjn/category_12142400.html?spm1001.2014.3001.5482 本文是该系列的清单综述…...
算法:删除有序数组中的重复项---双指针[3]
1、题目: 对给定的有序数组 nums 删除重复元素,在删除重复元素之后,每个元素只出现一次,并返回新的长度,上述操作必须通过原地修改数组的方法,使用 O(1) 的空间复杂度完成。 2、分析特点: 题目…...
AR产业变革中的“关键先生”和“关键力量”
今年6月的WWDC大会上,苹果发布了头显产品Vision Pro,苹果CEO库克形容它: 开启了空间计算时代。 AR产业曾红极一时,但因为一些技术硬伤又减弱了声量,整个产业在起伏中前行。必须承认,这次苹果发布Vision P…...
通过 Blob 对二进制流文件下载实现文件保存下载
原理:前端将二进制文件做转换实现下载: 请求后端接口->接收后端返回的二进制流(通过二进制流(Blob)下载,把后端返回的二进制文件放在 Blob 里面)->再通过file-saver插件保存 页面上使用: <span click"downloadFil…...
微信小程序使用lime-echart踩坑记录
一、使用echarts包 微信小程序项目使用的是uni-app,插件是lime-echart,版本一开始安装的是lime-echart-0.7.9;在项目分包之后,为了避免主包过大,就将这个插件也一并搬到了分包中,在微信开发者工具中表现出…...
Unity 编辑器资源导入处理函数 OnPostprocessTexture :深入解析与实用案例
Unity 编辑器资源导入处理函数 OnPostprocessTexture 用法 点击封面跳转下载页面 简介 在Unity中,我们可以使用编辑器资源导入处理函数(OnPostprocessTexture)来自定义处理纹理资源的导入过程。这个函数是继承自AssetPostprocessor类的&…...
stable diffusion实践操作-宽高设置以及高清修复
系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、SD宽高怎么设置?1.1 宽高历史 二、高清修复1. 文生图中的高清修复1.按钮Hires.fix2.不同放大算法对比1.第一类2.第二类3.第三类4.第四类5.第五类6.第六类7.第七类8.第八类9.第九类10.第十类11…...
利用微调的deberta-v3-large来预测情感分类
前言: 昨天我们讲述了怎么利用emotion数据集进行deberta-v3-large大模型的微调,那今天我们就来输入一些数据来测试一下,看看模型的准确率,为了方便起见,我直接用测试集的前十条数据 代码: from transfor…...
opencv旋转图像
0 、使用旋转矩阵旋转 import cv2img cv2.imread(img.jpg, 1) (h, w) img.shape[:2] # 获取图像的宽和高# 定义旋转中心坐标 center (w / 2, h / 2)# 定义旋转角度 angle 90# 定义缩放比例 scale 1# 获得旋转矩阵 M cv2.getRotationMatrix2D(center, angle, scale)# 进行…...
容器资料: Docker和Singularity
容器资料 Docker和Singularity Docker比较适合测试: 环境适配,每种环境对应一个容器。Docker需要host宿主机上运行Docker服务(root权限),隔离性很高,但会牺牲性能,对GPU环境支持不好(需要安装NVIDIAN公司的插件才能把GPU暴露给container) Sigularity可…...
如何确认linux的包管理器是yum还是apt,确认之后安装其他程序的时候就需要注意安装命令
打开终端 输入apt,下图中提示未找到命令,则基本上包管理工具就是用yum的 输入yum,我们看到有打印信息,则说明包管理工具是yum的,离线安装命令使用rpm...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
