strings.py
ofrak.core.strings
StringFindReplaceConfig (ComponentConfig)
dataclass
Attributes:
Name | Type | Description |
---|---|---|
to_find |
str |
the string to search for |
replace_with |
str |
the string to pass in |
null_terminate |
bool |
add a null terminator to the replacement if True |
allow_overflow |
bool |
allow the replace string to overflow the found string if True |
StringFindReplaceModifier (Modifier)
Find and replace all instances of a given string with a replacement string.
modify(self, resource, config)
async
Modify the given resource.
Users should not call this method directly; rather, they should run Resource.run.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
resource |
Resource |
required | |
config |
StringFindReplaceConfig |
Optional config for modification. If an implementation provides a default, this default will always be used when config would otherwise be None. Note that a copy of the default config will be passed, so the default config values cannot be modified persistently by a component run. |
required |
Source code in ofrak/core/strings.py
async def modify(self, resource: Resource, config: StringFindReplaceConfig) -> None:
to_find = config.to_find.encode("utf-8")
replace_with = config.replace_with.encode("utf-8") + (
b"\x00" if config.null_terminate and config.replace_with[-1] != "\x00" else b""
)
if not config.allow_overflow and len(replace_with) > len(to_find):
raise ModifierError(
f"Original string is longer than the new string ({len(to_find)} < "
f"{len(replace_with)})! Set config.allow_overflow = True to override this error. "
f"If you expect that the string to replace is null-terminated, then an overflow "
f"of one byte when config.null_terminate = True will not have any effect."
)
original_data = await resource.get_data()
offsets = [m.start() for m in re.finditer(to_find, original_data)]
for offset in offsets:
await resource.run(BinaryPatchModifier, BinaryPatchConfig(offset, replace_with))
StringPatchingConfig (ComponentConfig)
dataclass
Dataclass required to apply a string patch with StringPatchingModifier
. The configuration
describes the offset
where the patch is to be applied, and the string
to patch in.
Attributes:
Name | Type | Description |
---|---|---|
offset |
int |
the offset at which to apply the patch |
string |
str |
the string to patch in |
StringPatchingModifier (Modifier)
Patch a string in a resource at a given offset, based on the provided configuration.
modify(self, resource, config)
async
Modify the given resource.
Users should not call this method directly; rather, they should run Resource.run.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
resource |
Resource |
required | |
config |
StringPatchingConfig |
Optional config for modification. If an implementation provides a default, this default will always be used when config would otherwise be None. Note that a copy of the default config will be passed, so the default config values cannot be modified persistently by a component run. |
required |
Source code in ofrak/core/strings.py
async def modify(self, resource: Resource, config: StringPatchingConfig):
new_data = config.string.encode("utf-8")
if config.null_terminate:
new_data += b"\x00"
patch_config = BinaryPatchConfig(config.offset, new_data)
await resource.run(BinaryPatchModifier, patch_config)
