Skip to main content

CFGUtils

A Utility library for working with Control Flow Graphs (CFGs) in Python. This library implements previous academic and industrial research in the field of CFGs. It is also the home of the CFGED algorithm, refered to as Basque-CFGED, created in the USENIX Security 2024 Paper "Ahoy SAILR! There is No Need to DREAM of C: A Compiler-Aware Structuring Algorithm for Binary Decompilation".

If you use this library in your research, please cite the SAILR paper.

Install

pip3 install cfgutils

Usage

CFGUtils is used on Networkx DiGraphs. Most analysis assumes the graph is composed of GenericBlock nodes. The nodes a very simple and can be subclassed to represent different kinds of blocks.

All algorithms in this library have a testcase, which can be found in the tests.py file.

Region Identification

Regions here are defined as Single-Entry Single-Exit (SESE) subgraphs of the CFG. These regions are mostly used in the context of control flow recovery and decompilation.

from cfgutils.data.generic_block import GenericBlock
from cfgutils.regions.region_identifier import RegionIdentifier
import networkx as nx

blocks = [GenericBlock(i) for i in range(9)]
numbered_edges = [(1, 2), (1, 3), (2, 4), (3, 4), (4, 5), (4, 6), (5, 7), (6, 7)]
block_edges = [
    (blocks[in_e], blocks[out_e]) for (in_e, out_e) in numbered_edges
]
graph = nx.DiGraph(block_edges)
ri = RegionIdentifier(graph)
top_region = ri.region
print(top_region.graph.nodes)

Subclass GenericBlock to use different kinds of blocks in your graph.

Basque CFGED

The Basque CFGED algorithm is a graph edit distance algorithm for CFGs. To use it you need to have two CFGs and a mapping of the nodes between the two graphs. Not all nodes need to be mapped, just as many as you can do.

import networkx as nx
from cfgutils.similarity import cfg_edit_distance
from cfgutils.data import numbered_edges_to_block_graph


g1: nx.DiGraph = numbered_edges_to_block_graph([(1, 2), (1, 3), (3, 6.2), (3, 5), (5, 6.2), (2, 6.1)])
g2: nx.DiGraph = numbered_edges_to_block_graph([(1, 2), (1, 3), (3, 4), (3, 5), (4, 6), (5, 6), (2, 6)])
mapping = {n: {n} for n in range(7)}
# see tests for an explanation
assert cfg_edit_distance(g1, g2, mapping, mapping) == 5

Features

  • Region Identification
  • Graph Edit Distance:
    • Basque CFGED
    • Abu-Aisheh GED
    • Hu CFGED
  • Dominator Trees

Metadata

Release files for cfgutils 1.16.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cfgutils 1.16.0
File Size Uploaded Provenance Actions
cfgutils-1.16.0.tar.gz 64.3 kB Without provenance Details for cfgutils-1.16.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for cfgutils 1.16.0
File Interpreter ABI Platform Actions
cfgutils-1.16.0-py3-none-any.whl Python 3 none any Details for cfgutils-1.16.0-py3-none-any.whl

Total release size: 133.8 kB

Release files / cfgutils-1.16.0.tar.gz

Download URL cfgutils-1.16.0.tar.gz
Size 64.3 kB
Tags Source
SHA-256 checksum
How to use checksums
74cb03bd3b80dabaa8ad71414b04034c2f23f4bc5c9399e7d566c03e176bc2e5
BLAKE2b-256 checksum
How to use checksums
a0e77e1d482e482eb0e2440ebac6a1193aa0e90abe9630055b8060e7247f1293
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.25

Release files / cfgutils-1.16.0-py3-none-any.whl

Download URL cfgutils-1.16.0-py3-none-any.whl
Size 69.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a13bc71cb5e98f57a638bb518f8c66854eb2f1584295b0e7edf1d0b5c30541f0
BLAKE2b-256 checksum
How to use checksums
3b358c5549d98b0612f333c094f3ee1f59883a06eb6079375aaedcbd4ae8704c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.25

Security for cfgutils 1.16.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page