Analyzers
Overview
Analyzers are discrete components that gather and analyze specific information from the target binary, returning custom processed data results, called ResourceAttributes
, which are useful for supplementing other components.
The following is an example of the MagicAnalzyer
, which runs libmagic file type identification against resources:
from dataclasses import dataclass
import magic
from ofrak.component.analyzer import Analyzer
from ofrak.model.resource_model import ResourceAttributes
from ofrak.core.filesystem import File
from ofrak.resource import Resource
@dataclass(**ResourceAttributes.DATACLASS_PARAMS)
class Magic(ResourceAttributes):
mime: str
descriptor: str
class MagicAnalyzer(Analyzer[None, Magic]):
targets = (File,)
outputs = (Magic,)
async def analyze(self, resource: Resource, config=None) -> Magic:
data = await resource.get_data()
magic_mime = magic.from_buffer(await resource.get_data(), mime=True)
magic_description = magic.from_buffer(data)
return Magic(magic_mime, magic_description)
This analyzer targets resource's with the File
tag, and outputs Magic
.
Usage
Run Analyze
The preferred way to run OFRAK Analyzers is to use Resource.analyze
:
from ofrak.resource import Resource
from ofrak.core.filesystem import File
from ofrak.core.magic import Magic
resource: Resource
assert resource.has_tag(File)
magic = await resource.analyze(Magic)
When Resource.analyze
is run, OFRAK will search for and run a registered analyzer that targets File
and returns Magic
. If the requested analysis has already been run, OFRAK will not rerun the analysis but merely return the already-analyzed result.
Run Explicitly
Analyzers can also be run explicitly:
from ofrak.core.magic import MagicAnalyzer
from ofrak.resource import Resource
resource: Resource
await resource.run(MagicAnalyzer)
This manner of running analyzers can be used if the analysis results are not needed immediately.
Recursive Analysis
It is also possible to recursively analyzers against a resource and its descendants with the Resource.analyze_recursively
method. See Resource for more details.