binaryninja/personal/api-docs/binaryninja.flowgraph.FlowGraph.html

390 lines
24 KiB
HTML

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>binaryninja.flowgraph.FlowGraph &mdash; Binary Ninja API Documentation v1.1</title>
<link rel="shortcut icon" href="_static/favicon.ico"/>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/css/other.css" type="text/css" />
<link rel="index" title="Index"
href="genindex.html"/>
<link rel="search" title="Search" href="search.html"/>
<link rel="top" title="Binary Ninja API Documentation v1.1" href="index.html"/>
<link rel="up" title="flowgraph module" href="binaryninja.flowgraph-module.html"/>
<link rel="next" title="binaryninja.flowgraph.FlowGraphEdge" href="binaryninja.flowgraph.FlowGraphEdge.html"/>
<link rel="prev" title="binaryninja.flowgraph.CoreFlowGraph" href="binaryninja.flowgraph.CoreFlowGraph.html"/>
<script src="_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<a href="index.html" class="icon icon-home"> Binary Ninja API
</a>
<div class="version">
<script>
window.addEventListener("load", function() {
var ver = document.getElementsByClassName("version");
ver[0].innerHTML = DOCUMENTATION_OPTIONS['VERSION'];
});
</script>
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="binaryninja.architecture-module.html">architecture</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.atexit-module.html">atexit</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.basicblock-module.html">basicblock</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.binaryview-module.html">binaryview</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.callingconvention-module.html">callingconvention</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.databuffer-module.html">databuffer</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.datarender-module.html">datarender</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.demangle-module.html">demangle</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.downloadprovider-module.html">downloadprovider</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.enums-module.html">enums</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.fileaccessor-module.html">fileaccessor</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.filemetadata-module.html">filemetadata</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="binaryninja.flowgraph-module.html">flowgraph</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="binaryninja.flowgraph.CoreFlowGraph.html">binaryninja.flowgraph.CoreFlowGraph</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">binaryninja.flowgraph.FlowGraph</a></li>
<li class="toctree-l2"><a class="reference internal" href="binaryninja.flowgraph.FlowGraphEdge.html">binaryninja.flowgraph.FlowGraphEdge</a></li>
<li class="toctree-l2"><a class="reference internal" href="binaryninja.flowgraph.FlowGraphLayoutRequest.html">binaryninja.flowgraph.FlowGraphLayoutRequest</a></li>
<li class="toctree-l2"><a class="reference internal" href="binaryninja.flowgraph.FlowGraphNode.html">binaryninja.flowgraph.FlowGraphNode</a></li>
<li class="toctree-l2"><a class="reference internal" href="binaryninja.flowgraph.range.html">binaryninja.flowgraph.range</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.function-module.html">function</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.functionrecognizer-module.html">functionrecognizer</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.highlight-module.html">highlight</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.interaction-module.html">interaction</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.lineardisassembly-module.html">lineardisassembly</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.log-module.html">log</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.lowlevelil-module.html">lowlevelil</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.mainthread-module.html">mainthread</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.mediumlevelil-module.html">mediumlevelil</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.metadata-module.html">metadata</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.numbers-module.html">numbers</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.platform-module.html">platform</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.plugin-module.html">plugin</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.pluginmanager-module.html">pluginmanager</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.scriptingprovider-module.html">scriptingprovider</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.settings-module.html">settings</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.transform-module.html">transform</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.types-module.html">types</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.undoaction-module.html">undoaction</a></li>
<li class="toctree-l1"><a class="reference internal" href="binaryninja.update-module.html">update</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Binary Ninja API</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li><a href="binaryninja.flowgraph-module.html">flowgraph module</a> &raquo;</li>
<li>binaryninja.flowgraph.FlowGraph</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/binaryninja.flowgraph.FlowGraph.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="binaryninja-flowgraph-flowgraph">
<h1>binaryninja.flowgraph.FlowGraph<a class="headerlink" href="#binaryninja-flowgraph-flowgraph" title="Permalink to this headline"></a></h1>
<dl class="class">
<dt id="binaryninja.flowgraph.FlowGraph">
<em class="property">class </em><code class="descname">FlowGraph</code><span class="sig-paren">(</span><em>handle=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binaryninja/flowgraph.html#FlowGraph"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binaryninja.flowgraph.FlowGraph" title="Permalink to this definition"></a></dt>
<dd><p><code class="docutils literal notranslate"><span class="pre">class</span> <span class="pre">FlowGraph</span></code> implements a directed flow graph to be shown in the UI. This class allows plugins to
create custom flow graphs and render them in the UI using the flow graph report API.</p>
<p>An example of creating a flow graph and presenting it in the UI:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">graph</span> <span class="o">=</span> <span class="n">FlowGraph</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">node_a</span> <span class="o">=</span> <span class="n">FlowGraphNode</span><span class="p">(</span><span class="n">graph</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">node_a</span><span class="o">.</span><span class="n">lines</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Node A&quot;</span><span class="p">]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">node_b</span> <span class="o">=</span> <span class="n">FlowGraphNode</span><span class="p">(</span><span class="n">graph</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">node_b</span><span class="o">.</span><span class="n">lines</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Node B&quot;</span><span class="p">]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">node_c</span> <span class="o">=</span> <span class="n">FlowGraphNode</span><span class="p">(</span><span class="n">graph</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">node_c</span><span class="o">.</span><span class="n">lines</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Node C&quot;</span><span class="p">]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">graph</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node_a</span><span class="p">)</span>
<span class="go">0</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">graph</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node_b</span><span class="p">)</span>
<span class="go">1</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">graph</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node_c</span><span class="p">)</span>
<span class="go">2</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">node_a</span><span class="o">.</span><span class="n">add_outgoing_edge</span><span class="p">(</span><span class="n">BranchType</span><span class="o">.</span><span class="n">UnconditionalBranch</span><span class="p">,</span> <span class="n">node_b</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">node_a</span><span class="o">.</span><span class="n">add_outgoing_edge</span><span class="p">(</span><span class="n">BranchType</span><span class="o">.</span><span class="n">UnconditionalBranch</span><span class="p">,</span> <span class="n">node_c</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">show_graph_report</span><span class="p">(</span><span class="s2">&quot;Custom Graph&quot;</span><span class="p">,</span> <span class="n">graph</span><span class="p">)</span>
</pre></div>
</div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">In the current implementation, only graphs that have a single start node where all other nodes are reachable from outgoing edges can be rendered correctly. This describes the natural limitations of a control flow graph, which is what the rendering logic was designed for. Graphs that have nodes that are only reachable from incoming edges, or graphs that have disjoint subgraphs will not render correctly. This will be fixed in a future version.</p>
</div>
<dl class="method">
<dt id="binaryninja.flowgraph.FlowGraph.__init__">
<code class="descname">__init__</code><span class="sig-paren">(</span><em>handle=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binaryninja/flowgraph.html#FlowGraph.__init__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binaryninja.flowgraph.FlowGraph.__init__" title="Permalink to this definition"></a></dt>
<dd><p>x.__init__(…) initializes x; see help(type(x)) for signature</p>
</dd></dl>
<p class="rubric">Methods</p>
<table border="1" class="longtable docutils">
<colgroup>
<col width="10%" />
<col width="90%" />
</colgroup>
<tbody valign="top">
<tr class="row-odd"><td><a class="reference internal" href="#binaryninja.flowgraph.FlowGraph.__init__" title="binaryninja.flowgraph.FlowGraph.__init__"><code class="xref py py-obj docutils literal notranslate"><span class="pre">__init__</span></code></a>([handle])</td>
<td>x.__init__(…) initializes x; see help(type(x)) for signature</td>
</tr>
<tr class="row-even"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.append" title="binaryninja.flowgraph.FlowGraph.append"><code class="xref py py-obj docutils literal notranslate"><span class="pre">append</span></code></a>(node)</td>
<td><code class="docutils literal notranslate"><span class="pre">append</span></code> adds a node to a flow graph.</td>
</tr>
<tr class="row-odd"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.complete_layout" title="binaryninja.flowgraph.FlowGraph.complete_layout"><code class="xref py py-obj docutils literal notranslate"><span class="pre">complete_layout</span></code></a>()</td>
<td><code class="docutils literal notranslate"><span class="pre">complete_layout</span></code> can be overridden by subclasses and is called when a graph layout is completed.</td>
</tr>
<tr class="row-even"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.finish_prepare_for_layout" title="binaryninja.flowgraph.FlowGraph.finish_prepare_for_layout"><code class="xref py py-obj docutils literal notranslate"><span class="pre">finish_prepare_for_layout</span></code></a>()</td>
<td><code class="docutils literal notranslate"><span class="pre">finish_prepare_for_layout</span></code> signals that preparations for rendering a graph are complete.</td>
</tr>
<tr class="row-odd"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.get_nodes_in_region" title="binaryninja.flowgraph.FlowGraph.get_nodes_in_region"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_nodes_in_region</span></code></a>(left,&nbsp;top,&nbsp;right,&nbsp;bottom)</td>
<td></td>
</tr>
<tr class="row-even"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.layout" title="binaryninja.flowgraph.FlowGraph.layout"><code class="xref py py-obj docutils literal notranslate"><span class="pre">layout</span></code></a>([callback])</td>
<td><code class="docutils literal notranslate"><span class="pre">layout</span></code> starts rendering a graph for display.</td>
</tr>
<tr class="row-odd"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.layout_and_wait" title="binaryninja.flowgraph.FlowGraph.layout_and_wait"><code class="xref py py-obj docutils literal notranslate"><span class="pre">layout_and_wait</span></code></a>()</td>
<td><code class="docutils literal notranslate"><span class="pre">layout_and_wait</span></code> starts rendering a graph for display, and waits for the graph to be ready to display.</td>
</tr>
<tr class="row-even"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.populate_nodes" title="binaryninja.flowgraph.FlowGraph.populate_nodes"><code class="xref py py-obj docutils literal notranslate"><span class="pre">populate_nodes</span></code></a>()</td>
<td><code class="docutils literal notranslate"><span class="pre">prepare_for_layout</span></code> can be overridden by subclasses to create nodes in a graph when a flow graph needs to be rendered.</td>
</tr>
<tr class="row-odd"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.prepare_for_layout" title="binaryninja.flowgraph.FlowGraph.prepare_for_layout"><code class="xref py py-obj docutils literal notranslate"><span class="pre">prepare_for_layout</span></code></a>()</td>
<td><code class="docutils literal notranslate"><span class="pre">prepare_for_layout</span></code> can be overridden by subclasses to handling preparations that must take place before a flow graph is rendered, such as waiting for a function to finish analysis.</td>
</tr>
<tr class="row-even"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.show" title="binaryninja.flowgraph.FlowGraph.show"><code class="xref py py-obj docutils literal notranslate"><span class="pre">show</span></code></a>(title)</td>
<td><code class="docutils literal notranslate"><span class="pre">show</span></code> displays the graph in a new tab in the UI.</td>
</tr>
<tr class="row-odd"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.update" title="binaryninja.flowgraph.FlowGraph.update"><code class="xref py py-obj docutils literal notranslate"><span class="pre">update</span></code></a>()</td>
<td><code class="docutils literal notranslate"><span class="pre">update</span></code> can be overridden by subclasses to allow a graph to be updated after it has been presented in the UI.</td>
</tr>
</tbody>
</table>
<p class="rubric">Attributes</p>
<table border="1" class="longtable docutils">
<colgroup>
<col width="10%" />
<col width="90%" />
</colgroup>
<tbody valign="top">
<tr class="row-odd"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.complete" title="binaryninja.flowgraph.FlowGraph.complete"><code class="xref py py-obj docutils literal notranslate"><span class="pre">complete</span></code></a></td>
<td>Whether flow graph layout is complete (read-only)</td>
</tr>
<tr class="row-even"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.function" title="binaryninja.flowgraph.FlowGraph.function"><code class="xref py py-obj docutils literal notranslate"><span class="pre">function</span></code></a></td>
<td>Function for a flow graph</td>
</tr>
<tr class="row-odd"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.has_nodes" title="binaryninja.flowgraph.FlowGraph.has_nodes"><code class="xref py py-obj docutils literal notranslate"><span class="pre">has_nodes</span></code></a></td>
<td>Whether the flow graph has at least one node (read-only)</td>
</tr>
<tr class="row-even"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.height" title="binaryninja.flowgraph.FlowGraph.height"><code class="xref py py-obj docutils literal notranslate"><span class="pre">height</span></code></a></td>
<td>Flow graph height (read-only)</td>
</tr>
<tr class="row-odd"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.horizontal_block_margin" title="binaryninja.flowgraph.FlowGraph.horizontal_block_margin"><code class="xref py py-obj docutils literal notranslate"><span class="pre">horizontal_block_margin</span></code></a></td>
<td></td>
</tr>
<tr class="row-even"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.il_function" title="binaryninja.flowgraph.FlowGraph.il_function"><code class="xref py py-obj docutils literal notranslate"><span class="pre">il_function</span></code></a></td>
<td></td>
</tr>
<tr class="row-odd"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.is_il" title="binaryninja.flowgraph.FlowGraph.is_il"><code class="xref py py-obj docutils literal notranslate"><span class="pre">is_il</span></code></a></td>
<td></td>
</tr>
<tr class="row-even"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.is_low_level_il" title="binaryninja.flowgraph.FlowGraph.is_low_level_il"><code class="xref py py-obj docutils literal notranslate"><span class="pre">is_low_level_il</span></code></a></td>
<td></td>
</tr>
<tr class="row-odd"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.is_medium_level_il" title="binaryninja.flowgraph.FlowGraph.is_medium_level_il"><code class="xref py py-obj docutils literal notranslate"><span class="pre">is_medium_level_il</span></code></a></td>
<td></td>
</tr>
<tr class="row-even"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.nodes" title="binaryninja.flowgraph.FlowGraph.nodes"><code class="xref py py-obj docutils literal notranslate"><span class="pre">nodes</span></code></a></td>
<td>List of nodes in graph (read-only)</td>
</tr>
<tr class="row-odd"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.vertical_block_margin" title="binaryninja.flowgraph.FlowGraph.vertical_block_margin"><code class="xref py py-obj docutils literal notranslate"><span class="pre">vertical_block_margin</span></code></a></td>
<td></td>
</tr>
<tr class="row-even"><td><a class="reference internal" href="binaryninja.flowgraph-module.html#binaryninja.flowgraph.FlowGraph.width" title="binaryninja.flowgraph.FlowGraph.width"><code class="xref py py-obj docutils literal notranslate"><span class="pre">width</span></code></a></td>
<td>Flow graph width (read-only)</td>
</tr>
</tbody>
</table>
</dd></dl>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="binaryninja.flowgraph.FlowGraphEdge.html" class="btn btn-neutral float-right" title="binaryninja.flowgraph.FlowGraphEdge" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
<a href="binaryninja.flowgraph.CoreFlowGraph.html" class="btn btn-neutral" title="binaryninja.flowgraph.CoreFlowGraph" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2015-2019, Vector 35 Inc.
</p>
</div>
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.StickyNav.enable();
});
</script>
</body>
</html>