Skip to content

program.py

ofrak.core.program

Program (LinkableBinary)

Generic representation for a binary program with functions, code and memory regions, and ProgramAttributes.

get_code_regions(self) async

Return code regions associated with the resource

Returns:

Type Description
Iterable[ofrak.core.code_region.CodeRegion]

Iterable of CodeRegions

Source code in ofrak/core/program.py
async def get_code_regions(self) -> Iterable[CodeRegion]:
    """
    Return code regions associated with the resource

    :return: Iterable of CodeRegions
    """
    return await self.resource.get_children_as_view(
        CodeRegion, r_filter=ResourceFilter.with_tags(CodeRegion)
    )

get_code_region_for_vaddr(self, vaddr) async

Return the code region in this program containing vaddr.

Parameters:

Name Type Description Default
vaddr int

Virtual address

required

Returns:

Type Description
Optional[ofrak.core.code_region.CodeRegion]

Code region containing the input vaddr

Exceptions:

Type Description
NotFoundError

If vaddr is not in any code region

Source code in ofrak/core/program.py
async def get_code_region_for_vaddr(self, vaddr: int) -> Optional[CodeRegion]:
    """
    Return the code region in this program containing vaddr.

    :param vaddr: Virtual address

    :raises NotFoundError: If vaddr is not in any code region

    :return: Code region containing the input vaddr
    """

    code_regions = await self.get_code_regions()

    for cr_view in code_regions:
        code_region_vaddr_range = Range(
            cr_view.virtual_address,
            cr_view.virtual_address + cr_view.size,
        )
        if vaddr in code_region_vaddr_range:
            return cr_view

    raise NotFoundError

get_memory_region_for_vaddr(self, vaddr) async

Return the largest memory region containing vaddr.

Parameters:

Name Type Description Default
vaddr int

Virtual address

required

Returns:

Type Description
Optional[ofrak.core.memory_region.MemoryRegion]

The most general (largest) region of memory containing the input vaddr, if such a memory region exists

Exceptions:

Type Description
NotFoundError

If vaddr is not in any memory region

Source code in ofrak/core/program.py
async def get_memory_region_for_vaddr(self, vaddr: int) -> Optional[MemoryRegion]:
    """
    Return the largest [memory region][ofrak.core.memory_region.MemoryRegion] containing vaddr.

    :param vaddr: Virtual address

    :raises NotFoundError: If vaddr is not in any memory region

    :return: The most general (largest) region of memory containing the input vaddr,
    if such a memory region exists
    """
    # we're looking for the largest (most general) memory region containing this vaddr
    mem_regions = await self.resource.get_descendants_as_view(
        MemoryRegion,
        r_filter=ResourceFilter.with_tags(MemoryRegion),
        r_sort=ResourceSort(
            attribute=MemoryRegion.Size,
            direction=ResourceSortDirection.DESCENDANT,
        ),
    )

    return MemoryRegion.get_mem_region_with_vaddr_from_sorted(vaddr, mem_regions)

ReferencedDataAnalyzer (Analyzer, ABC)

analyze(self, resource, config=None) async

Analyze a resource for to extract specific ResourceAttributes.

Users should not call this method directly; rather, they should run Resource.run or Resource.analyze.

Parameters:

Name Type Description Default
resource Resource

The resource that is being analyzed

required
config

Optional config for analyzing. 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.

None

Returns:

Type Description
Tuple[ofrak.core.data.ReferencedDataAttributes]

The analysis results

Source code in ofrak/core/program.py
@abstractmethod
async def analyze(self, resource: Resource, config=None) -> Tuple[ReferencedDataAttributes]:
    raise NotImplementedError()

ReferencedStringsAnalyzer (Analyzer, ABC)

analyze(self, resource, config=None) async

Analyze a resource for to extract specific ResourceAttributes.

Users should not call this method directly; rather, they should run Resource.run or Resource.analyze.

Parameters:

Name Type Description Default
resource Resource

The resource that is being analyzed

required
config

Optional config for analyzing. 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.

None

Returns:

Type Description
Tuple[ofrak.core.data.ReferencedStringsAttributes]

The analysis results

Source code in ofrak/core/program.py
@abstractmethod
async def analyze(self, resource: Resource, config=None) -> Tuple[ReferencedStringsAttributes]:
    raise NotImplementedError()