经典游戏资源阅读器简化了对游戏资源文件的分析

cgrr的Python项目详细描述


经典游戏资源阅读器

cgrr保存其他模块用于分析游戏的实用函数 资源文件。

包装内容

目前,cgrr.py提供了三种功能:

  1. 验证,一个简单的函数,用于验证路径中是否存在某些文件
  2. 文件,与verify一起使用的一个名为duple的文件
  3. 文件读取器,用于将文件读入词典的类

验证

向此函数传递一个文件列表(名为duple的文件的实例)和 路径,它将验证这些文件是否存在于该路径中。它的目的是 用于验证某个程序是否位于给定路径中,例如 检查程序的主要可执行文件是否在预期位置。

identifying_files=[File("ARCHERY.EXE",31616,"d8fae202edcc48d51a72026cbfbe7fa8"),]path="path/to/archery"verify(identifying_files,path)

上面对verify的调用将返回true 路径/to/archery/archery.exe存在,是31616字节,并且具有md5哈希 d8fae202edcc48d51a72026cbfbe7fa8。如果识别文件包含多个 文件namedtuples,列表中描述的所有文件都必须存在。

文件

文件只是表示文件的namedtuple。namedtuple的字段 分别是路径大小md5

创建新的文件

example=File("path/to/example.tle",12345,"0123456789abcdef0123456789abcdef")

路径应该相对于一些基本路径(例如,到 由该文件标识的程序),该程序将被传递到verify 分开。

size是以字节为单位的文件大小。

md5是文件的md5哈希值。

文件读取器

filereader是为特定文件格式生成读取器的工厂。一 reader提供两种方法,packunpack,用于解析和 正在从文件中断开数据。在发动机罩下,它使用结构模块。

file reader(format)构造一个文件读取器,其中format是 描述文件格式的字符串,例如:

score_reader=FileReader("""<Uint32      score         # Score at index 0x00, before namestring[16]  nameoptions[6]  game_options  # A six byte field with a custom data format""")

每行的格式为

TYPE VARIABLE_NAME

TYPE[COUNT] VARIABLE_NAME

如果未指定计数,则默认为1。

可选地,行可以包含一个字符来描述 文件中数字的结尾,以结构的形式。通过 默认情况下,假定为小尾数('<;')整数。

磅符号("")后面的字符被视为注释和 被忽略。

如果type是struct模块支持的内置类型之一(例如 uint16),它将由struct处理。对于内置类型,count是 作为结构的重复计数处理:uint32[4]表示四个32位 无符号整数(16字节),字符串[4]表示4字节字符串。

否则,类型将被视为用户定义的类型。那么count就是 变量占用的字节数,文件读取器将查找 对于名为parse_type的函数(例如parse_选项),在解压缩 数据。如果找到,将使用bytestring作为 参数和指定为变量值的返回值。 类似地,filereader将把变量传递给名为 unparse_type(例如unparse_options),它应该返回一个bytestring 打包数据时的长度计数。如果这些函数没有定义, 字节将按原样返回。

此模块使用的结构可以直接访问为 如果需要,score\u reader.struct

上面指定的读取器将从26字节中提取三个变量 文件:分数,一个(小尾数)32位无符号整数;名称,一个 16字节字符串;和游戏选项,自定义格式的6字节字段。

给定所需格式的文件,可以使用以下命令分析该文件:

data=scorefile.read(26)scores=score_reader.unpack(data)

它将产生分数,一个有三个词条的字典

scores={"name":"SomeName","score":1234,"game_options":b'......'}

给一本字典ntries,pack可用于生成 原始格式的分数文件。

data=score_reader.pack({"name":"Cheater","score":9999,"game_options":b'......'})scorefile.write(data)

因为我们没有定义parse_optionsunparse_options函数, 专门用于该变量的6个字节只需直接赋值。它 不过,分析选项可能更有用:

defparse_options(b):return{'option'+str(i):b[i]foriinrange(6)}defunparse_options(o):returnbytes([o['option'+str(i)]foriinrange(6)])

文件读取器.from_offset

如果您知道文件中数据的偏移量,但不一定知道 整个文件中,from_offset的构造函数可能更有用。

from_offset(format_def)构造一个文件读取器,其中format_def是 描述文件格式的字符串,例如:

identifying_files=[File("ARCHERY.EXE",31616,"d8fae202edcc48d51a72026cbfbe7fa8"),]path="path/to/archery"verify(identifying_files,path)
0

每行的格式为

identifying_files=[File("ARCHERY.EXE",31616,"d8fae202edcc48d51a72026cbfbe7fa8"),]path="path/to/archery"verify(identifying_files,path)
1

identifying_files=[File("ARCHERY.EXE",31616,"d8fae202edcc48d51a72026cbfbe7fa8"),]path="path/to/archery"verify(identifying_files,path)
2

格式定义的最后一行可能是:

identifying_files=[File("ARCHERY.EXE",31616,"d8fae202edcc48d51a72026cbfbe7fa8"),]path="path/to/archery"verify(identifying_files,path)
3

偏移量和文件长度必须以十六进制指定。号码必须 以"0x"开头,可以使用大写或小写,即0x1a和 0x1A相当。

无需按任何特定顺序指定偏移量。

可选地,行可以包含一个字符来描述 文件中数字的结尾,以结构的形式。通过 默认情况下,假定为小尾数('<;')整数。

有关每条线剩余线段的说明,请参见 文件读取器的文档

如果文件格式包含未知段, 因为from_offset将自动填充未知段 使用虚拟变量。所以:

identifying_files=[File("ARCHERY.EXE",31616,"d8fae202edcc48d51a72026cbfbe7fa8"),]path="path/to/archery"verify(identifying_files,path)
4

相当于:

identifying_files=[File("ARCHERY.EXE",31616,"d8fae202edcc48d51a72026cbfbe7fa8"),]path="path/to/archery"verify(identifying_files,path)
5

EOF语句不是必需的,但如果未指定,则变量 指定的最大偏移量也将假定为 文件。

示例用法

py被cgrr项目中的其他模块使用。例如:

许可证

CGRR在GPLv3或更高版本下可用。有关详细信息,请参见文件复制。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java什么是com。火基。客户服务器值。响应时间戳?   java方法和参数   java在Android中,如何获得7个具有相同父活动的片段来进行onclick通信?   java如何将子类对象与超类对象关联?   java热点为什么需要寄存器分配?   为什么这是数学。以这种格式列出的random()语句?   java JPanel未添加到JTabbedPane   java如何在moblie游戏开发中支持多种屏幕尺寸   java无法解析符号“GoogleCloudMessaging”GCM   java成员、类、可访问性说明   java在多大程度上引用了项目fork中的作者?   java如何在安卓中存储或获取sqlite数据库,而不是数据库默认位置   java JDBC断管Mac   java滑动选项卡布局不适用于API 15