Python修改exe之类的游戏文件中的数值

不要迷恋我,虽然我利用Python来耍植物大战僵尸,威力加强版 前言 == 大家好,我叫善念。上篇文章我许了一个愿,就是想让大家多多关注我,然后我的粉丝就蹭蹭的涨了好几百,谢谢大家的厚爱。可是我发现粉丝是涨了,三连变少了,谢谢大家这次给我三连,我一定再接再厉。有问题留在评论区,我会一一回复,谢谢大家! 这次要做的是修改一款单机游戏的数据,学过C语言的朋友肯定经常会看到有些老师讲这个案例,就是《植物大战僵尸》这个课题,不过此文我将带大家利用Python来实现(2019原创课题,附视频教程)。 游戏的安装 ===== 关于安装的这一块…我以前是在网站上下载的,现在再去找估 阅读详情

场景

  1. 某些游戏数值(攻击力、射程、速度…)被写在exe之类的文件里
    要先查找游戏数值,然后修改
  2. 修改存档

查找

比较2个文件差异

只改1个游戏数值,存档2次,比较2个文件

F1 = '存档1'
F2 = '存档2'

def compare(d1=F1, d2=F2):
    with open(d1, 'rb') as f1:
        b1 = f1.read()
    with open(d2, 'rb') as f2:
        b2 = f2.read()
    for i in range(min(len(b1), len(b2))):
        if b1[i] != b2[i]:
            print(i, b1[i], b2[i])

查找大数字

某些数值无法在游戏里修改,可直接找,大数重复较少,建议先找大数

F = '游戏文件路径'

def find_your_sister_en(a: bytes, extension=20, f_name=F):
    """查找字符串"""
    length = len(a)
    with open(f_name, 'rb') as f:
        b = f.read()
    for i in range(len(b) - length + 1):
        if b[i: i + length] == a:
            print(i, b[i - extension: i + length + extension])

def find_your_sister_cn(a: str, extension=0, f_name=F, e='gbk'):
    """查找中文(注意extension>0时容易报错)"""
    a = a.encode(e)
    length = len(a)
    with open(f_name, 'rb') as f:
        b = f.read()
    for i in range(len(b) - length + 1):
        if b[i: i + length] == a:
            print(i, b[i - extension * 2: i + length + extension * 2].decode('gbk'))

def find_your_sister01(a: int):
    """查找0~255的数"""
    with open(F, 'rb') as f:
        b = f.read()  # <class 'bytes'>
    for i in range(len(b)):
        if b[i] == a:
            if b[i + 1] == b[i + 2] == b[i + 3] == 0:
                print(i)

def find_your_sister02(a: int):
    """查找0~65535的数"""
    ab = a.to_bytes(2, byteorder='little')
    print(a, '转字节数组', ab)
    with open(F, 'rb') as f:
        b = f.read()
    for i in range(len(b) - 1):
        if b[i: i + 2] == ab:
            if b[i + 2] == b[i + 3] == 0:
                print(i)

def find_context(offset: int, section=4):
    """根据offset查找上下文"""
    with open(F, 'rb') as f:
        b = f.read()  # <class 'bytes'>
    for i in range(offset - section, offset + section):
        print(i, b[i])

def find_number(ls: list):
    """查找连续数字"""
    with open(F, 'rb') as f:
        b = f.read()  # <class 'bytes'>
    length = len(ls)
    for i in range(len(b) - length + 1):
        if [b[i + j] for j in range(length)] == ls:
            print(i, ls, [b[i + j + length] for j in range(length)], i + length)

def find_section(offset: int, section=100, m=500):
    """查找指定offset区间内0~500的数"""
    with open(F, 'rb') as f:
        b = f.read()  # <class 'bytes'>
    for i in range(offset - section, offset + section):
        if b[i + 2] == b[i + 3] == 0:
            if b[i] + b[i + 1] * 256 < m:
                print(i, b[i], b[i + 1], b[i] + b[i + 1] * 256)

if __name__ == '__main__':
    find_your_sister_en(b'fighter', 33)
    # find_your_sister_cn('美洲狮', 5)
    # find_your_sister01(200)
    # find_your_sister02(1000)
    # find_context(439609)
    # find_number([38, 0, 0, 184])
    # find_section(439609)

修改

F1 = '游戏原件.exe'
F2 = '魔改文件.exe'

def cp():
    with open(F1, 'rb') as f:
        b = f.read()
    with open(F2, 'wb') as f:
        f.write(b)

def replace_en(offset: int, new_data: str, old_data: str = None):
    """修改字符串"""
    if old_data is None:
        length = len(new_data)
    else:
        length = len(old_data)
        print(length, len(new_data))
    with open(F2, 'rb') as f:
        b = f.read()
    with open(F2, 'wb') as f:
        f.write(b[:offset])
        for i in new_data:
            f.write(ord(i).to_bytes(1, byteorder='little'))
        f.write(b[offset + length:])
    print(offset, '偏移量的位置', b[offset], '修改为', new_data)

def replace1(offset: int, new_data: int):
    """修改1个byte"""
    with open(F2, 'rb') as f:
        b = f.read()
    with open(F2, 'wb') as f:
        f.write(b[:offset])
        f.write(new_data.to_bytes(1, byteorder='little'))
        f.write(b[offset + 1:])
    print(offset, '偏移量的位置', b[offset], '修改为', new_data)

def replace2(offset: int, new_data: int):
    """修改2个bytes"""
    nb = new_data.to_bytes(2, byteorder='little')  # 例如:256 --> b'\x00\x01'
    with open(F2, 'rb') as f:
        b = f.read()
    with open(F2, 'wb') as f:
        f.write(b[:offset])
        f.write(nb)
        f.write(b[offset + 2:])
    print(offset, '和', offset + 1, '偏移量的位置', b[offset: offset + 2], '修改为', nb)

def replace_cn(offset: int, length: int, new_data: str):
    """修改文案"""
    new_data = new_data.encode('gbk')
    print(new_data, len(new_data))
    with open(F2, 'rb') as f:
        b = f.read()
    extension = length - len(new_data)
    with open(F2, 'wb') as f:
        f.write(b[:offset])
        f.write(new_data)
        for _ in range(extension):
            f.write(ord(' ').to_bytes(1, byteorder='little'))
        f.write(b[offset + length:])

if __name__ == '__main__':
    cp()
    replace_en(659824, 'abcd.edf')
    replace1(439609, 5)  # 阿基里斯 180
    replace2(44811, 300)  # 美洲狮210
    replace_cn(676444, 160, '天空母舰')

补充

字节

字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位,储存的数值范围为0~255

WinHex是一款十六进制编辑器,编辑界面如下

def translate(*args):
    """计算相邻数字的值(其中int(a, 16)可将字符串转10进制数字)"""
    print(sum(int(a, 16) * (256 ** e) for e, a in enumerate(args)))

# 假设在WinHex中看到 E8 03 00 00,那么该值可能是1000
translate('E8', '03')

to_bytes

函数说明

Return an array of bytes representing an integer.

  length
    Length of bytes object to use.  An OverflowError is raised if the
    integer is not representable with the given number of bytes.
  byteorder
    The byte order used to represent the integer.  If byteorder is 'big',
    the most significant byte is at the beginning of the byte array.  If
    byteorder is 'little', the most significant byte is at the end of the
    byte array.  To request the native byte order of the host system, use
    `sys.byteorder' as the byte order value.
  signed
    Determines whether two's complement is used to represent the integer.
    If signed is False and a negative integer is given, an OverflowError
    is raised.

函数示例(256–>100–>0100–>01,00–>00,01)

>>> a = 256

>>> hex(a)
'0x100'

>>> a.to_bytes(2, byteorder='little')
b'\x00\x01'
python生成的exe应用程序的编译与反编译 如果使用python写了程序,有时候希望将程序打包成一个应用程序,如exe,这时候可以使用pyinstaller,来打包应用程序。 可以使用pip安装: pip install pyinstaller 如果是使用pycharm平台,可以使用上面的pip安装,也可以直接插件安装: 安装好pyinstaller插件后,使用: pyinstaller yourprogram.py 来打包你的程序。 输入指令,就开始自动打包,最后可以在输出文件夹里看到生成的main.exe文件: 上面就是打包的过程。 阅读详情

相关推荐

使用VScode配置python,并打包成.exe文件

用够了pdb.set_trace()来调试python程序了。可以考虑用VS Code来集成python的开发环境,实现像c一样的可视化调试,可以增加watch,双击打断点,看变量实时的数值,很方便,也很酷。 这个博客写的简单明了,我就化身他人文章搬运工吧,我会稍作修改。 一、配置vscode Python环境 1. 点击左下角的图标,在弹出的菜单中选择extensions,在左上方搜索框内...

一江明澈的水的专栏 1万+

python程序编译与打包

Python程序转exe可执行文件

VictorFz的博客 287

Python遍历CSV文件修改表头

套用【Python编程快速上手—让繁琐工作自动化】一书中捋清思路的方法,从思路到代码行为、从抽象(想法)到具体(方法)、递进列出代码需要实现的内容。 总的来说,该程序必须做到以下几点: 找出当前工作目录中的所有 CSV 文件 读取每个文件的全部内容 修改第一行,将内容写入一个新的 CSV 文件 在代码层面上,这意味着该程序需要做到以下几点: 循环遍历从 os.listdir()得到...

toto+的博客 6721

python环境变量配置_python修改exe

1、找你的python2.x解释器安装的位置。将python.exe复制一份,改名成python2.exe,原来python.exe一般不需要删除。把文件路径保存下来:c:/apps/python/python22、找到python3.x解释器安装的位置。将python.exe复制一份,改名为python3.exe 原来的python.exe也不要删除。把此文件路径保存下来:假设是c:/apps/python/python39二、添加环境变量1、在电脑搜索框:搜索环境变量2、点击进入。

m0_60575487的博客 602

Windows下python 打包成exe

python3.6 打包成exe 工具pyinstaller 首先说一下遇到的坑 for field, value in iter_fields(node): RecursionError: maximum recursion depth exceeded 解决上面的问题之后,又出现封装好的exe闪退 AttributeError: module ‘win32ctypes.pywin32.win...

weixin_39545502的博客 476

PDPS16.0单机版与SPLMLicenseServer授权避坑指南:从安装到冲突解决

本文详细解析了PDPS16.0单机版的安装与授权流程,重点阐述了如何正确配置SPLMLicenseServer本地许可证服务器以实现软件激活。针对安装过程中常见的许可证冲突问题,提供了清晰的排查思路和解决方案,并介绍了通过设置环境变量等替代授权方法,帮助用户高效避坑,确保Tecnomatix Process Simulate顺利运行。

weixin_29231221的博客 559

python打包成exe_将Python程序打包为exe

当Python项目编码完成之后,有时候我们需要让其在没有Python环境的电脑上运行,此时我们就需要将Python项目进行打包了。本篇文章主要是基于Python的第三方库pyinstaller进行的。使用pyinstaller打包Python项目,相对于C和C#项目的打包要简单很多。项目地址pyinstaller gitpyinstaller安装pip install pyinstaller环境要...

weixin_39890652的博客 245

VPS环境搭建及配置

VPS(Virtual Private Server)是一种虚拟化技术,可以将一台物理服务器分成多个虚拟服务器,每个虚拟服务器都有独立的操作系统和资源,相互之间互不影响。VPS可以提供类似于独立服务器的功能,但价格更便宜,适合中小企业和个人用户使用。VPS可以用于网站托管、应用程序部署、游戏服务器、数据备份等各种场景。

YJ_12340的博客 1万+

ce,ce修改器,ce制作可执行的exe程序

ce,ce修改器,ce修改器如果制作exe,看一看就可以学会的

weixin_44263232的博客 5684

E5071C 网络分析仪使用指南

E5071C 网络分析仪是 Keysight(原 Agilent)推出的一款高性能矢量网络分析仪,广泛应用于射频(RF)和微波(MW)电路设计、天线测试、滤波器优化等领域。它以高精度、宽频率范围(9 kHz–20 GHz)、出色的动态范围和灵活的测量功能著称。本文将详细介绍 E5071C 的基本操作方法,帮助用户快速上手并高效使用该设备。

2501_90901792的博客 4181

从拧螺丝到精密装配:三菱伺服电机扭矩控制在工业自动化中的实战解析

本文深入解析三菱伺服电机扭矩控制在工业自动化中的实战应用,重点介绍MR-J4系列伺服系统的高精度扭矩响应技术。从螺丝紧固到精密装配,详细讲解扭矩控制模式的选择、硬件配置、参数设置及典型故障排查方案,帮助工程师提升生产效率和产品质量。

weixin_29186249的博客 470

Python教程:制作贪吃蛇游戏存以exe文件运行

定义颜色# 蛇的初始位置和大小snake_speed = 15 # 初始速度,数值越小速度越快direction = 'RIGHT' # 初始方向# 食物的初始位置蛇的初始位置是通过二维坐标定义的,用户可以根据需求自行修改,但不可超过初始窗口的边界;蛇的移动速度默认是15,如果觉得速度太慢可以改为更大的数值;食物的初始位置可以任意指定。在后续的循环过程中,如果蛇吃掉了当前的食物,系统会自动随机生成新的食物。

WANGWUSAN66的博客 1074

Android13 CarPowerManagementService启动流程分析

在CarPowerManagementService中init调用PowerHalService的setListener设置事件侦听器以接收车辆的电源事件。

liuning1985622的博客 956

vs的python怎么生成exe文件_使用VScode配置python,并打包成.exe文件

用够了pdb.set_trace()来调试python程序了。可以考虑用VS Code来集成python的开发环境,实现像c一样的可视化调试,可以增加watch,双击打断点,看变量实时的数值,很方便,也很酷。这个博客写的简单明了,我就化身他人文章搬运工吧,我会稍作修改。一、配置vscode Python环境1. 点击左下角的图标,在弹出的菜单中选择extensions,在左上方搜索框内输入“Pyt...

weixin_39951181的博客 4483

工作中SVN的使用,保姆级教程!

SVN是一款集中式版本控制系统,采用客户端-服务器模式管理代码版本。与Git相比,SVN在目录权限控制、大型二进制文件处理等方面具有优势,适合特定场景使用。本文介绍了SVN的安装方法、基本操作(检出、提交、更新、回滚等)以及分支管理(创建、合并、切换)。同时讲解了文件冲突的解决方法,并演示了如何在IDEA中集成SVN工具。SVN虽然逐渐被Git取代,但在某些特定场景下仍是可靠选择,工具选择应基于团队和项目需求。

胜人者有力,自胜者强! 1848

[华为]华为无线控制器AC6508简单配置实例

用户需求:3个地址段,分别是领导、员工、访客,访问控制策略是只允许访客上网,不允许访客访问内网。 vlan173为设备的管理地址和AP获取的地址,领导、员工、访客的vlan分别是vlan131/vlan132/vlan133 首先是许可的下载,使用华为的账号登陆http://app.huawei.com/isdp ,然后按照说明输入许可,下载许可,将许可导入到设备。 web界面访问后,直接按照配置向导配置就可以了。 1.基本配置里主要配置license、设备名称、设备时间 2.端口配置:连接上

日子_很简单 2万+

python怎么制作游戏修改器_如何使用CE来修改游戏并制作一个修改器

1首先下载CE,地址在参考资料里面。http://pan.baidu.com/s/1hqkrPcC打开后启动Cheat Engine.exe和练习软件Tutorial.exe打开之前最好关闭杀毒软件,杀毒软件可能会误报。windows vista和win 7用户请按右键选择“以管理员身份运行”2打开CE后可能会出现“想研究一下练习教程吗?”点“否”在愚人节(4月1日)那天CE会出现一个小笑话,请不...

weixin_39754142的博客 2015

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

如何用python提取txt文件中的特定信息并写入Excel

我的问题: 我有一个这样的数据集,大概几百上千行,两行数据之间隔一个空行。 N:505904X:0.969wsecY:0.694wsec N:506038X:4.246wsecY:0.884wsec N:450997X:8.472wsecY:0.615wsec ... 现在我希望能提取每一行X:和Y:后面的数字,然后保存下来做进一步的数据处理和分析 就拿第一行来说,我只需要-2.668 和...

zhelijun的博客 5万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

python easyOCR打包成exe

将easyocr的文字识别打包成exe文件

hengfengyiyingdong的专栏 8663

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

对现代单机游戏制作简单的修改器界面(进阶)

soulstone_offsets = [0xE0, 0x0, 0x18E8, 0x60, 0x0, 0x38, 0x26C] # 灵魂偏移链。soulstone_offsets = [0xE0, 0x0, 0x18E8, 0x60, 0x0, 0x38, 0x26C] # 灵魂偏移链。money_offsets = [0xE0, 0x0, 0x18E8, 0x60, 0x0, 0x38, 0x268] # 金钱偏移链。address = address + 2 ** 32 # 转换为无符号整数。

satorisleep的博客 3035

使用ai编程生成斐波那契数列exe文件

本文介绍了使用AI生成可执行exe文件的全过程,以斐波那契数列计算器为例。首先在PyCharm创建虚拟环境,通过AI生成计算斐波那契数列的Python代码;然后改进为带界面的GUI程序,并添加学号等个人信息;最后详细说明了使用PyInstaller打包为exe文件的方法,包括依赖安装和打包步骤。文章提供了完整的代码示例、操作截图和资源下载链接,实现了从代码生成到独立可执行文件的全流程。该案例展示了AI辅助编程和软件打包的完整实践,适合Python初学者学习程序开发和打包发布。

weixin_42241864的博客 1021

windows平台游戏外挂实现原理

windows游戏外挂泛滥的根本原因就是太容易,只需要明白windows的原理。我们都知道windows下的可执行文件的扩展名为exe(executable file)。exe文件是一个二进制文件,是由0、1构成的数据流(stream),把这个数据流想象成一条有固定长度的纸带,纸带上有等分的格子,每个格子上有一个符号,要么是0,要么是1,然后按照一定的要求来读取上面的内容,比如每8个格子代表一个信息如:01000101。

二爷的博客 1760

Python,批量修改Excel的数据

批量修改Excel中的数据。 学会使用xlrd和openpyxl。最后用一个批量修改Excel的数值作为案例实现。

qq_37009634的博客 6606

Python openpyxl 打开excel,修改某个参数值,读取到随着这个参数值改变后的单元格的数值

记录一下这个历史性的时刻!纠结了好久的问题终于解决了。 首先要感谢一下这个帖子:https://bbs.youkuaiyun.com/topics/392568534 这个博主针对问题:openpyxl用data_only=True后,读取公式的值后save后,发现文件中公式都没了,请问有解决办法吗?提出,用win32打开再保存: def just_open(filename): xlApp ...

diguaguowang的博客 4971
上一篇: 召唤物继承英雄属性【War3地图编辑器】
下一篇: 技能伤害继承英雄属性【War3地图编辑器】
小基基o_O
博客等级 码龄9年 4413粉丝 467原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值