Python脚本匹配二进制Dump文件时TypeError报错的修复咨询
修复二进制Dump文件配置段匹配脚本的类型错误
问题背景
需要编写Python脚本,在二进制Dump文件中查找重复的配置段——该段以202个0xff字节开头,后跟4字节\x00\x00\x23\x27,并打印所有匹配段的起始地址。
原脚本与错误信息
原脚本
#!/usr/bin/env python3 import re import mmap import sys magic = '\xff' * 202 pattern = magic + '\x00\x00\x23\x27' fh = open(sys.argv[1], "r+b") mf = mmap.mmap(fh.fileno(), 0) mf.seek(0) fh.seek(0) for occurence in re.finditer(pattern, mf): print(occurence.start()) mf.close() fh.close()
运行错误
$ ./matcher.py dump.bin Traceback (most recent call last): File "/home/eviecomp/BC2UTILS/dump_previous_profile/./matcher.py", line 13, in <module> for occurence in re.finditer(pattern, mf): File "/usr/lib/python3.9/re.py", line 248, in finditer return _compile(pattern, flags).finditer(string) TypeError: cannot use a string pattern on a bytes-like object
错误原因
mmap.mmap对象属于字节类对象(bytes-like),但原脚本中定义的pattern是字符串类型,正则表达式无法用字符串模式匹配字节数据,导致类型不兼容错误。
修复后的脚本
#!/usr/bin/env python3 import re import mmap import sys # 改用字节串定义匹配模式,前缀b表示字节类型 magic = b'\xff' * 202 pattern = magic + b'\x00\x00\x23\x27' # 使用with语句自动管理文件和mmap资源 with open(sys.argv[1], "rb") as fh: with mmap.mmap(fh.fileno(), 0, access=mmap.ACCESS_READ) as mf: # 模式与目标均为字节类型,匹配正常执行 for occurrence in re.finditer(pattern, mf): print(occurrence.start())
关键修复点
- 类型统一:将匹配模式从字符串改为字节串(前缀
b),确保与mmap对象的字节类型一致。 - 资源自动管理:改用
with语句处理文件和mmap对象,无需手动调用close(),避免资源泄漏。 - 访问权限明确:指定mmap的
access=mmap.ACCESS_READ,符合只读匹配的场景,提升安全性。
内容的提问来源于stack exchange,提问作者Lexx Luxx
相关产品推荐
相关产品推荐

