mirror of
https://github.com/hakril/PythonForWindows
synced 2026-06-08 14:31:45 +00:00
880 lines
111 KiB
HTML
880 lines
111 KiB
HTML
<!DOCTYPE html>
|
|
|
|
<html lang="en" data-content_root="../../../">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>windows.debug.symbols — PythonForWindows 1.0.3 documentation</title>
|
|
<link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=fa44fd50" />
|
|
<link rel="stylesheet" type="text/css" href="../../../_static/classic.css?v=def86cc0" />
|
|
<link rel="stylesheet" type="text/css" href="../../../_static/css/mbasic.css?v=957880af" />
|
|
|
|
<script src="../../../_static/documentation_options.js?v=baaebd52"></script>
|
|
<script src="../../../_static/doctools.js?v=9a2dae69"></script>
|
|
<script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
|
|
|
|
<link rel="index" title="Index" href="../../../genindex.html" />
|
|
<link rel="search" title="Search" href="../../../search.html" />
|
|
</head><body>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../../genindex.html" title="General Index"
|
|
accesskey="I">index</a></li>
|
|
<li class="right" >
|
|
<a href="../../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../../index.html">PythonForWindows 1.0.3 documentation</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">windows.debug.symbols</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="document">
|
|
<div class="documentwrapper">
|
|
<div class="bodywrapper">
|
|
<div class="body" role="main">
|
|
|
|
<h1>Source code for windows.debug.symbols</h1><div class="highlight"><pre>
|
|
<span></span><span class="kn">import</span> <span class="nn">os.path</span>
|
|
<span class="kn">import</span> <span class="nn">ctypes</span>
|
|
<span class="kn">import</span> <span class="nn">copy</span>
|
|
<span class="kn">import</span> <span class="nn">itertools</span>
|
|
<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">namedtuple</span>
|
|
|
|
<span class="kn">import</span> <span class="nn">windows</span>
|
|
<span class="kn">import</span> <span class="nn">windows.generated_def</span> <span class="k">as</span> <span class="nn">gdef</span>
|
|
<span class="kn">from</span> <span class="nn">windows</span> <span class="kn">import</span> <span class="n">winproxy</span>
|
|
<span class="kn">from</span> <span class="nn">windows.pycompat</span> <span class="kn">import</span> <span class="n">basestring</span>
|
|
|
|
<span class="n">DEFAULT_DBG_OPTION</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SYMOPT_DEFERRED_LOADS</span> <span class="o">+</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SYMOPT_UNDNAME</span>
|
|
|
|
|
|
<div class="viewcode-block" id="set_dbghelp_path">
|
|
<a class="viewcode-back" href="../../../debug.html#windows.debug.symbols.set_dbghelp_path">[docs]</a>
|
|
<span class="k">def</span> <span class="nf">set_dbghelp_path</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sa">r</span><span class="sd">"""Set the path of the ``dbghelp.dll`` file to use. It allow to configure a different version of the DLL handling PDB downloading.</span>
|
|
|
|
<span class="sd"> If ``path`` is a directory, the final ``dbghelp.dll`` will be computed as</span>
|
|
<span class="sd"> ``path\<current_process_bitness>\dbghelp.dll``.</span>
|
|
|
|
<span class="sd"> This allow to use the same script transparently in both 32b & 64b python interpreters.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">loaded_modules</span> <span class="o">=</span> <span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">peb</span><span class="o">.</span><span class="n">modules</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
|
|
<span class="n">path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">bitness</span><span class="p">),</span> <span class="sa">u</span><span class="s2">"dbghelp.dll"</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="s2">"dbghelp.dll"</span> <span class="ow">in</span> <span class="n">loaded_modules</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"setup_dbghelp_path should be called before any dbghelp function"</span><span class="p">)</span>
|
|
<span class="c1"># Change the DLL used by DbgHelpProxy</span>
|
|
<span class="n">winproxy</span><span class="o">.</span><span class="n">DbgHelpProxy</span><span class="o">.</span><span class="n">APIDLL</span> <span class="o">=</span> <span class="n">path</span>
|
|
<span class="k">return</span></div>
|
|
|
|
|
|
<span class="c1"># Load symbol config from ENV if present</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">env_dbghelp_path</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">"PFW_DBGHELP_PATH"</span><span class="p">]</span>
|
|
<span class="c1"># Setup the dbghelp path used by PFW</span>
|
|
<span class="n">set_dbghelp_path</span><span class="p">(</span><span class="n">env_dbghelp_path</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">KeyError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="k">pass</span>
|
|
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">SymbolInfoBase</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Represent a Symbol.</span>
|
|
<span class="sd"> This class in based on the class `SYMBOL_INFO <https://docs.microsoft.com/en-us/windows/win32/api/dbghelp/ns-dbghelp-symbol_info>`_</span>
|
|
<span class="sd"> with the handling on displacement embeded into it.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># Init on ctypes struct is not always called</span>
|
|
<span class="c1"># resolver & displacement should be set manually</span>
|
|
<span class="n">CHAR_TYPE</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">resolver</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"resolver"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">displacement</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"displacement"</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">as_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="c1"># assert self.Address == 0 ?</span>
|
|
<span class="k">return</span> <span class="n">SymbolType</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">Index</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ModBase</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">resolver</span><span class="p">)</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""The name of the symbol"""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">NameLen</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
<span class="n">size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">NameLen</span>
|
|
<span class="n">addr</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">+</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">Name</span><span class="o">.</span><span class="n">offset</span>
|
|
<span class="c1"># self.NameLen should not include the final \x00</span>
|
|
<span class="c1"># But some W api (like SymSearchW) returns SYMBOL_INFOW with the leading \x00</span>
|
|
<span class="c1"># For NtCreateFile:</span>
|
|
<span class="c1"># A() API -> NameLen == 12</span>
|
|
<span class="c1"># W() API -> NameLen == 13</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">CHAR_TYPE</span> <span class="o">*</span> <span class="n">size</span><span class="p">)</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">addr</span><span class="p">)[:]</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="sa">u</span><span class="s2">"</span><span class="se">\x00</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">fullname</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""The fullname of the symbol in the windbg format ``mod!sym+displacement``"""</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">addr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""The address of the symbol"""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">Address</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">displacement</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""The address of the start of the symbol</span>
|
|
<span class="sd"> If the symbol include a displacement, it is not taken into account</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">Address</span>
|
|
|
|
<span class="nd">@property</span> <span class="c1"># Fixed ?</span>
|
|
<span class="k">def</span> <span class="nf">module</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""The module containing the symbol</span>
|
|
|
|
<span class="sd"> :type: :class:`SymbolModule`</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">resolver</span><span class="o">.</span><span class="n">get_module</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ModBase</span><span class="p">)</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">tag</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""The Tag of the module</span>
|
|
|
|
<span class="sd"> :type: :class:`~windows.generated_def.winstructs.SymTagEnum`</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SymTagEnum</span><span class="o">.</span><span class="n">mapper</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">Tag</span><span class="p">]</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__int__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""An alias for ``addr``"""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">addr</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""The fullname of the symbol in the windbg format ``mod!sym+displacement``"""</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">displacement</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s2">"</span><span class="si">{self.module.name}</span><span class="s2">!</span><span class="si">{self.name}</span><span class="s2">+</span><span class="si">{self.displacement:#x}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="s2">"</span><span class="si">{self.module.name}</span><span class="s2">!</span><span class="si">{self.name}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">displacement</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'<</span><span class="si">{0}</span><span class="s1"> name="</span><span class="si">{1}</span><span class="s1">" start=</span><span class="si">{2:#x}</span><span class="s1"> displacement=</span><span class="si">{3:#x}</span><span class="s1"> tag=</span><span class="si">{4}</span><span class="s1">>'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">displacement</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="s1">'<</span><span class="si">{0}</span><span class="s1"> name="</span><span class="si">{1}</span><span class="s1">" start=</span><span class="si">{2:#x}</span><span class="s1"> tag=</span><span class="si">{3}</span><span class="s1">>'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
|
|
|
|
|
<div class="viewcode-block" id="SymbolInfoA">
|
|
<a class="viewcode-back" href="../../../debug.html#windows.debug.symbols.SymbolInfoA">[docs]</a>
|
|
<span class="k">class</span> <span class="nc">SymbolInfoA</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SYMBOL_INFO</span><span class="p">,</span> <span class="n">SymbolInfoBase</span><span class="p">):</span>
|
|
<span class="n">CHAR_TYPE</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">CHAR</span></div>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">SymbolInfoW</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SYMBOL_INFOW</span><span class="p">,</span> <span class="n">SymbolInfoBase</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sa">r</span><span class="sd">"""Represent a Symbol.</span>
|
|
<span class="sd"> This class in based on the class `SYMBOL_INFO <https://docs.microsoft.com/en-us/windows/win32/api/dbghelp/ns-dbghelp-symbol_info>`_</span>
|
|
<span class="sd"> with the handling on displacement embeded into it.s</span>
|
|
|
|
<span class="sd"> Exemple:</span>
|
|
|
|
<span class="sd"> >>> sh = windows.debug.symbols.VirtualSymbolHandler()</span>
|
|
<span class="sd"> >>> mod = sh.load_file(r"c:\windows\system32\kernelbase.dll")</span>
|
|
<span class="sd"> >>> sym1 = sh["kernelbase!CreateFileW"]</span>
|
|
<span class="sd"> >>> sym2 = sh[int(sym1) + 3]</span>
|
|
<span class="sd"> >>> sym2</span>
|
|
<span class="sd"> <SymbolInfoW name="CreateFileW" start=0x100f20b0 displacement=0x3 tag=SymTagPublicSymbol></span>
|
|
<span class="sd"> >>> hex(sym2.start)</span>
|
|
<span class="sd"> '0x100f20b0L'</span>
|
|
<span class="sd"> >>> hex(sym2.addr)</span>
|
|
<span class="sd"> '0x100f20b3L'</span>
|
|
<span class="sd"> >>> hex(sym2.displacement)</span>
|
|
<span class="sd"> '0x3L'</span>
|
|
<span class="sd"> >>> str(sym2)</span>
|
|
<span class="sd"> 'kernelbase!CreateFileW+0x3'</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">CHAR_TYPE</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">WCHAR</span>
|
|
|
|
<span class="c1"># Unicode everywhere !</span>
|
|
<span class="n">SymbolInfo</span> <span class="o">=</span> <span class="n">SymbolInfoW</span>
|
|
|
|
<span class="k">class</span> <span class="nc">SymbolType</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">typeid</span><span class="p">,</span> <span class="n">modbase</span><span class="p">,</span> <span class="n">resolver</span><span class="p">):</span>
|
|
<span class="c1"># Inheritance ?</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">resolver</span> <span class="o">=</span> <span class="n">resolver</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_typeid</span> <span class="o">=</span> <span class="n">typeid</span> <span class="c1"># Kind of a handle. Different of typeid property.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">modbase</span> <span class="o">=</span> <span class="n">modbase</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_get_type_info</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">typeinfo</span><span class="p">,</span> <span class="n">ires</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="n">res</span> <span class="o">=</span> <span class="n">ires</span>
|
|
<span class="k">if</span> <span class="n">res</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">res</span> <span class="o">=</span> <span class="n">TST_TYPE_RES_TYPE</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">typeinfo</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">)()</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">SymGetTypeInfo</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">resolver</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">modbase</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_typeid</span><span class="p">,</span> <span class="n">typeinfo</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
|
|
<span class="k">except</span> <span class="ne">WindowsError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ERROR_INVALID_FUNCTION</span><span class="p">:</span>
|
|
<span class="c1"># invalid function on object -> None</span>
|
|
<span class="c1"># We may lose some information with that between no return value VS error</span>
|
|
<span class="c1"># Explicit verification on attributes per tags ?</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
<span class="k">raise</span>
|
|
<span class="k">if</span> <span class="n">ires</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">ires</span>
|
|
<span class="n">newres</span> <span class="o">=</span> <span class="n">res</span><span class="o">.</span><span class="n">value</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">LPWSTR</span><span class="p">):</span>
|
|
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">LocalFree</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">newres</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">module</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">resolver</span><span class="o">.</span><span class="n">get_module</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">modbase</span><span class="p">)</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_SYMNAME</span><span class="p">)</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">size</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_LENGTH</span><span class="p">)</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">tag</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_SYMTAG</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Diff type/typeid ?</span>
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">new_typeid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_TYPE</span><span class="p">))</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">typeid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">new_typeid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_TYPEID</span><span class="p">))</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">basetype</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BasicType</span><span class="o">.</span><span class="n">mapper</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_BASETYPE</span><span class="p">)]</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">parent</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">new_typeid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_CLASSPARENTID</span><span class="p">))</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">datakind</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DataKind</span><span class="o">.</span><span class="n">mapper</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_DATAKIND</span><span class="p">)]</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">udtkind</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">UdtKind</span><span class="o">.</span><span class="n">mapper</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_UDTKIND</span><span class="p">)]</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">offset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_OFFSET</span><span class="p">)</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="c1"># Only valid on tag == SymTagArrayType</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_COUNT</span><span class="p">)</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">nb_children</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_CHILDRENCOUNT</span><span class="p">)</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_VALUE</span><span class="p">)</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">address</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_ADDRESS</span><span class="p">)</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">children</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nb_children</span>
|
|
<span class="k">if</span> <span class="n">count</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
<span class="k">class</span> <span class="nc">res_struct</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">Structure</span><span class="p">):</span>
|
|
<span class="n">_fields_</span> <span class="o">=</span> <span class="p">[(</span><span class="s2">"Count"</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ULONG</span><span class="p">),</span> <span class="p">(</span><span class="s2">"Start"</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ULONG</span><span class="p">),</span> <span class="p">(</span><span class="s2">"Types"</span><span class="p">,</span> <span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">ULONG</span> <span class="o">*</span> <span class="n">count</span><span class="p">))]</span>
|
|
<span class="n">x</span> <span class="o">=</span> <span class="n">res_struct</span><span class="p">()</span>
|
|
<span class="n">x</span><span class="o">.</span><span class="n">Count</span> <span class="o">=</span> <span class="n">count</span>
|
|
<span class="n">x</span><span class="o">.</span><span class="n">Start</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_get_type_info</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TI_FINDCHILDREN</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">new_typeid</span><span class="p">(</span><span class="n">ch</span><span class="p">)</span> <span class="k">for</span> <span class="n">ch</span> <span class="ow">in</span> <span class="n">x</span><span class="o">.</span><span class="n">Types</span><span class="p">]</span>
|
|
|
|
<span class="c1"># Constructor</span>
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">from_symbol_info</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">syminfo</span><span class="p">,</span> <span class="n">resolver</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">syminfo</span><span class="o">.</span><span class="n">TypeIndex</span><span class="p">,</span> <span class="n">syminfo</span><span class="o">.</span><span class="n">ModBase</span><span class="p">,</span> <span class="n">resolver</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Constructor</span>
|
|
<span class="k">def</span> <span class="nf">new_typeid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">newtypeid</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">newtypeid</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
<span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)(</span><span class="n">newtypeid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">modbase</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">resolver</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SymTagBaseType</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'<</span><span class="si">{0}</span><span class="s1"> <basetype> </span><span class="si">{1!r}</span><span class="s1">>'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">basetype</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SymTagArrayType</span><span class="p">:</span>
|
|
<span class="n">target_type</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="o">.</span><span class="n">name</span>
|
|
<span class="n">array_size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">count</span>
|
|
<span class="k">return</span> <span class="s1">'<</span><span class="si">{0}</span><span class="s1"> </span><span class="si">{1}</span><span class="s1">[</span><span class="si">{2}</span><span class="s1">] tag=</span><span class="si">{3!r}</span><span class="s1">>'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">target_type</span><span class="p">,</span> <span class="n">array_size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SymTagPointerType</span><span class="p">:</span>
|
|
<span class="n">target_type</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="o">.</span><span class="n">name</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="o">.</span><span class="n">tag</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SymTagBaseType</span><span class="p">:</span>
|
|
<span class="n">target_type</span> <span class="o">=</span> <span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="o">.</span><span class="n">basetype</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">target_type</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="o">.</span><span class="n">name</span>
|
|
<span class="k">return</span> <span class="s1">'<</span><span class="si">{0}</span><span class="s1"> PTR TO "</span><span class="si">{1}</span><span class="s1">" tag=</span><span class="si">{2!r}</span><span class="s1">>'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">target_type</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="s1">'<</span><span class="si">{0}</span><span class="s1"> name="</span><span class="si">{1}</span><span class="s1">" tag=</span><span class="si">{2!r}</span><span class="s1">>'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag</span><span class="p">)</span>
|
|
|
|
|
|
<div class="viewcode-block" id="SymbolModule">
|
|
<a class="viewcode-back" href="../../../debug.html#windows.debug.symbols.SymbolModule">[docs]</a>
|
|
<span class="k">class</span> <span class="nc">SymbolModule</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">IMAGEHLP_MODULEW64</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Represent a loaded symbol module</span>
|
|
<span class="sd"> (see `MSDN _IMAGEHLP_MODULEW64 <https://docs.microsoft.com/en-us/windows/win32/api/dbghelp/ns-dbghelp-imagehlp_modulew64>`_)</span>
|
|
|
|
<span class="sd"> .. note::</span>
|
|
|
|
<span class="sd"> This represent a module in the ``symbol space`` for symbol resolution.</span>
|
|
<span class="sd"> This can be completly virtual (particularly in the case of :class:`VirtualSymbolHandler`</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># Init on ctypes struct is not always called</span>
|
|
<span class="c1"># resolver should be set manually</span>
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">resolver</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">resolver</span> <span class="o">=</span> <span class="n">resolver</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">addr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""The load address of the module"""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">BaseOfImage</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""The name of the module"""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">ModuleName</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">path</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""The full path and file name of the file from which symbols were loaded."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">LoadedImageName</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""The type of module (:class:`~windows.generated_def.winstructs.SYM_TYPE`),</span>
|
|
<span class="sd"> which can be one of:</span>
|
|
|
|
<span class="sd"> =========== =========================</span>
|
|
<span class="sd"> SymCoff COFF symbols.</span>
|
|
<span class="sd"> SymCv CodeView symbols.</span>
|
|
<span class="sd"> SymDeferred Symbol loading deferred.</span>
|
|
<span class="sd"> SymDia DIA symbols.</span>
|
|
<span class="sd"> SymExport Symbols generated from a DLL export table.</span>
|
|
<span class="sd"> SymNone No symbols are loaded.</span>
|
|
<span class="sd"> SymPdb PDB symbols.</span>
|
|
<span class="sd"> SymSym .sym file.</span>
|
|
<span class="sd"> SymVirtual The virtual module created by SymLoadModuleEx with SLMFLAG_VIRTUAL.</span>
|
|
<span class="sd"> =========== =========================</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">SymType</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">pdb</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sa">r</span><span class="sd">"""The local path of the loaded PDB if present</span>
|
|
|
|
<span class="sd"> Exemple:</span>
|
|
<span class="sd"> >>> sh = windows.debug.symbols.VirtualSymbolHandler()</span>
|
|
<span class="sd"> >>> mod = sh.load_file(r"c:\windows\system32\kernelbase.dll")</span>
|
|
<span class="sd"> >>> mod.pdb</span>
|
|
<span class="sd"> 'd:\\symbols\\wkernelbase.pdb\\017FA9C5278235B7E6BFBA74A9A5AAD91\\wkernelbase.pdb'</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">LoadedPdbName</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">LoadedPdbName</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">LoadedPdbName</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
<span class="k">return</span> <span class="n">LoadedPdbName</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">pdb_basename</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">LoadedPdbName</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"</span><span class="se">\\</span><span class="s2">"</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="k">return</span> <span class="s1">'<</span><span class="si">{0}</span><span class="s1"> name="</span><span class="si">{1}</span><span class="s1">" type=</span><span class="si">{2}</span><span class="s1"> pdb="</span><span class="si">{3}</span><span class="s1">" addr=</span><span class="si">{4:#x}</span><span class="s1">>'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">pdb_basename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">addr</span><span class="p">)</span></div>
|
|
|
|
|
|
|
|
<span class="c1"># https://docs.microsoft.com/en-us/windows/win32/debug/symbol-handler-initialization</span>
|
|
<span class="k">class</span> <span class="nc">SymbolHandler</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Base class of symbol handler"""</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handle</span><span class="p">,</span> <span class="n">search_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">invade_process</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="c1"># https://docs.microsoft.com/en-us/windows/desktop/api/dbghelp/nf-dbghelp-syminitialize</span>
|
|
<span class="c1"># This value should be unique and nonzero, but need not be a process handle.</span>
|
|
<span class="c1"># be sure to use the correct handle.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">handle</span> <span class="o">=</span> <span class="n">handle</span> <span class="c1">#: The handle of the symbol handler</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">engine</span><span class="o">.</span><span class="n">options_already_setup</span><span class="p">:</span>
|
|
<span class="n">engine</span><span class="o">.</span><span class="n">set_options</span><span class="p">(</span><span class="n">DEFAULT_DBG_OPTION</span><span class="p">)</span>
|
|
<span class="n">winproxy</span><span class="o">.</span><span class="n">SymInitializeW</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">search_path</span><span class="p">,</span> <span class="n">invade_process</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">load_module</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file_handle</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">addr</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Load a module at a given ``addr``. The module to load can be pass via a ``file_handle``</span>
|
|
<span class="sd"> or the direct ``path`` of the file to load.</span>
|
|
|
|
<span class="sd"> :return: :class:`SymbolModule` -- The loaded module</span>
|
|
|
|
<span class="sd"> .. note::</span>
|
|
|
|
<span class="sd"> The logic of ``SymLoadModuleEx`` seems somewhat strange about the naming of the loaded module.</span>
|
|
<span class="sd"> A custom module ``name`` is only taken into account if the file is passed via a File handle.</span>
|
|
<span class="sd"> To make it more intuitive, if this function is call with a ``path`` and ``name`` and no ``file_handle``,</span>
|
|
<span class="sd"> it will open the path and directly call ``SymLoadModuleEx`` with a file handle and a name.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="c1"># Is that a bug in SymLoadModuleEx ?</span>
|
|
<span class="c1"># To get a custom name for a module it use "path"</span>
|
|
<span class="c1"># So we need to use file_handle and set a custom path</span>
|
|
<span class="c1"># ! BUT it means we cannot get a custom name for a module where the path is not explicit and need to be searched</span>
|
|
<span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">file_handle</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
|
|
<span class="n">file_handle</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">get_handle_from_file</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
|
<span class="n">path</span> <span class="o">=</span> <span class="n">name</span>
|
|
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="k">pass</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">load_addr</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">SymLoadModuleExW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">file_handle</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">flags</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">WindowsError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="c1"># if e.winerror == 0:</span>
|
|
<span class="c1"># Already loaded ?</span>
|
|
<span class="c1"># What if someone try to load another PE at the same BaseOfDll ?</span>
|
|
<span class="c1"># return BaseOfDll</span>
|
|
<span class="k">raise</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_module</span><span class="p">(</span><span class="n">load_addr</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">load_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">addr</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Load the module ``path`` at ``addr``</span>
|
|
|
|
<span class="sd"> :return: :class:`SymbolModule` -- The loaded module</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">load_module</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">addr</span><span class="o">=</span><span class="n">addr</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="n">size</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">flags</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">unload</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Unload the module at ``addr``"""</span>
|
|
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">SymUnloadModule64</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">addr</span><span class="p">)</span>
|
|
|
|
|
|
<span class="nd">@staticmethod</span>
|
|
<span class="nd">@ctypes</span><span class="o">.</span><span class="n">WINFUNCTYPE</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">BOOL</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PVOID</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD64</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">py_object</span><span class="p">)</span>
|
|
<span class="k">def</span> <span class="nf">modules_aggregator</span><span class="p">(</span><span class="n">modname</span><span class="p">,</span> <span class="n">modaddr</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
|
|
<span class="n">ctx</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">modaddr</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span> <span class="nf">modules</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""The list of loaded modules</span>
|
|
|
|
<span class="sd"> :return: [:class:`SymbolModule`] -- A list of modules</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">SymEnumerateModulesW64</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">modules_aggregator</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">get_module</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span> <span class="k">for</span> <span class="n">addr</span> <span class="ow">in</span> <span class="n">res</span><span class="p">]</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">get_module</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">base</span><span class="p">):</span>
|
|
<span class="n">modinfo</span> <span class="o">=</span> <span class="n">SymbolModule</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="n">modinfo</span><span class="o">.</span><span class="n">SizeOfStruct</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">modinfo</span><span class="p">)</span>
|
|
<span class="n">winproxy</span><span class="o">.</span><span class="n">SymGetModuleInfoW64</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">base</span><span class="p">,</span> <span class="n">modinfo</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">modinfo</span>
|
|
|
|
<span class="k">def</span> <span class="nf">symbol_and_displacement_from_address</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
|
|
<span class="n">displacement</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD64</span><span class="p">()</span>
|
|
<span class="n">max_len_size</span> <span class="o">=</span> <span class="mh">0x1000</span>
|
|
<span class="n">full_size</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">SymbolInfo</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">max_len_size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="n">buff</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">BUFFER</span><span class="p">(</span><span class="n">SymbolInfo</span><span class="p">)(</span><span class="n">size</span><span class="o">=</span><span class="n">full_size</span><span class="p">)</span>
|
|
<span class="n">sym</span> <span class="o">=</span> <span class="n">buff</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">sym</span><span class="o">.</span><span class="n">SizeOfStruct</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">SymbolInfo</span><span class="p">)</span>
|
|
<span class="n">sym</span><span class="o">.</span><span class="n">MaxNameLen</span> <span class="o">=</span> <span class="n">max_len_size</span>
|
|
<span class="n">winproxy</span><span class="o">.</span><span class="n">SymFromAddrW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">displacement</span><span class="p">,</span> <span class="n">buff</span><span class="p">)</span>
|
|
<span class="n">sym</span><span class="o">.</span><span class="n">resolver</span> <span class="o">=</span> <span class="bp">self</span>
|
|
<span class="n">sym</span><span class="o">.</span><span class="n">displacement</span> <span class="o">=</span> <span class="n">displacement</span><span class="o">.</span><span class="n">value</span>
|
|
<span class="k">return</span> <span class="n">sym</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">symbol_from_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="n">max_len_size</span> <span class="o">=</span> <span class="mh">0x1000</span>
|
|
<span class="n">full_size</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">SymbolInfo</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">max_len_size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="n">buff</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">BUFFER</span><span class="p">(</span><span class="n">SymbolInfo</span><span class="p">)(</span><span class="n">size</span><span class="o">=</span><span class="n">full_size</span><span class="p">)</span>
|
|
<span class="n">sym</span> <span class="o">=</span> <span class="n">buff</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">sym</span><span class="o">.</span><span class="n">SizeOfStruct</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">SymbolInfo</span><span class="p">)</span>
|
|
<span class="n">sym</span><span class="o">.</span><span class="n">MaxNameLen</span> <span class="o">=</span> <span class="n">max_len_size</span>
|
|
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">SymFromNameW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">buff</span><span class="p">)</span>
|
|
<span class="n">sym</span><span class="o">.</span><span class="n">resolver</span> <span class="o">=</span> <span class="bp">self</span>
|
|
<span class="n">sym</span><span class="o">.</span><span class="n">displacement</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">return</span> <span class="n">sym</span>
|
|
|
|
<span class="k">def</span> <span class="nf">resolve</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name_or_addr</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sa">r</span><span class="sd">"""Resolve ``name_or_addr``.</span>
|
|
|
|
<span class="sd"> If its an int -> Return the :class:`SymbolInfo` at the address.</span>
|
|
<span class="sd"> If its a string -> Return the :class:`SymbolInfo` corresponding to the symbol name</span>
|
|
|
|
<span class="sd"> :return: :class:`SymbolInfo`</span>
|
|
|
|
<span class="sd"> .. note::</span>
|
|
|
|
<span class="sd"> ``__getitem__`` is an alias for ``resolve()``</span>
|
|
|
|
<span class="sd"> Exemple:</span>
|
|
|
|
<span class="sd"> >>> sh = windows.debug.symbols.VirtualSymbolHandler()</span>
|
|
<span class="sd"> >>> mod = sh.load_file(r"c:\windows\system32\kernelbase.dll")</span>
|
|
<span class="sd"> >>> mod</span>
|
|
<span class="sd"> <SymbolModule name="kernelbase" type=SymPdb pdb="wkernelbase.pdb" addr=0x10000000></span>
|
|
<span class="sd"> >>> sh.resolve("kernelbase!CreateFileInternal")</span>
|
|
<span class="sd"> <SymbolInfoA name="CreateFileInternal" addr=0x100f2120 tag=SymTagFunction></span>
|
|
<span class="sd"> >>> sh[0x100f2042]</span>
|
|
<span class="sd"> <SymbolInfoA name="ReadFile" addr=0x100f1ee0 displacement=0x162 tag=SymTagFunction></span>
|
|
<span class="sd"> >>> str(sh[0x100f2042])</span>
|
|
<span class="sd"> 'kernelbase!ReadFile+0x162'</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># Only returns None if symbol is not Found ?</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">name_or_addr</span><span class="p">,</span> <span class="n">windows</span><span class="o">.</span><span class="n">pycompat</span><span class="o">.</span><span class="n">anybuff</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">symbol_from_name</span><span class="p">(</span><span class="n">name_or_addr</span><span class="p">)</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">symbol_and_displacement_from_address</span><span class="p">(</span><span class="n">name_or_addr</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">WindowsError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">!=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ERROR_MOD_NOT_FOUND</span><span class="p">:</span>
|
|
<span class="k">raise</span>
|
|
<span class="c1"># We could not resolve and address -> return None</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
|
|
<span class="fm">__getitem__</span> <span class="o">=</span> <span class="n">resolve</span>
|
|
<span class="w"> </span><span class="sd">"""Alias to resolve for simpler use"""</span>
|
|
|
|
<span class="nd">@staticmethod</span>
|
|
<span class="nd">@ctypes</span><span class="o">.</span><span class="n">WINFUNCTYPE</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">BOOL</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">POINTER</span><span class="p">(</span><span class="n">SymbolInfo</span><span class="p">),</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ULONG</span> <span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">py_object</span><span class="p">)</span>
|
|
<span class="k">def</span> <span class="nf">simple_aggregator</span><span class="p">(</span><span class="n">info</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
|
|
<span class="n">sym</span> <span class="o">=</span> <span class="n">info</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">fullsize</span> <span class="o">=</span> <span class="n">sym</span><span class="o">.</span><span class="n">SizeOfStruct</span> <span class="o">+</span> <span class="p">(</span><span class="n">sym</span><span class="o">.</span><span class="n">NameLen</span> <span class="o">*</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">SymbolInfo</span><span class="o">.</span><span class="n">CHAR_TYPE</span><span class="p">))</span>
|
|
<span class="n">cpy</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">BUFFER</span><span class="p">(</span><span class="n">SymbolInfo</span><span class="p">)(</span><span class="n">size</span><span class="o">=</span><span class="n">fullsize</span><span class="p">)</span>
|
|
<span class="n">ctypes</span><span class="o">.</span><span class="n">memmove</span><span class="p">(</span><span class="n">cpy</span><span class="p">,</span> <span class="n">info</span><span class="p">,</span> <span class="n">fullsize</span><span class="p">)</span>
|
|
<span class="n">ctx</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cpy</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
|
|
<span class="k">def</span> <span class="nf">search</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mask</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">SYMSEARCH_ALLITEMS</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sa">r</span><span class="sd">"""Search the symbols matching ``mask`` (``Windbg`` like).</span>
|
|
|
|
<span class="sd"> :return: [:class:`SymbolInfo`] -- A list of :class:`SymbolInfo`</span>
|
|
|
|
<span class="sd"> >>> sh = windows.debug.symbols.VirtualSymbolHandler()</span>
|
|
<span class="sd"> >>> mod = sh.load_file(r"c:\windows\system32\kernelbase.dll")</span>
|
|
<span class="sd"> >>> sh.search("kernelbase!CreateFile*")</span>
|
|
<span class="sd"> [<SymbolInfoW name="CreateFileInternal" addr=0x100f2120 tag=SymTagFunction>,</span>
|
|
<span class="sd"> <SymbolInfoW name="CreateFileMoniker" addr=0x10117d80 tag=SymTagFunction>,</span>
|
|
<span class="sd"> <SymbolInfoW name="CreateFile2" addr=0x1011e690 tag=SymTagFunction>,</span>
|
|
<span class="sd"> ...]</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">if</span> <span class="n">callback</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">callback</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">simple_aggregator</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">callback</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">WINFUNCTYPE</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">BOOL</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">POINTER</span><span class="p">(</span><span class="n">SymbolInfo</span><span class="p">),</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ULONG</span> <span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">py_object</span><span class="p">)(</span><span class="n">callback</span><span class="p">)</span>
|
|
|
|
<span class="n">addr</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="s2">"addr"</span><span class="p">,</span> <span class="n">mod</span><span class="p">)</span> <span class="c1"># Retrieve mod.addr, else use the value directly</span>
|
|
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">SymSearchW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD64</span><span class="p">(</span><span class="n">addr</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">mask</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">res</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">sym</span> <span class="ow">in</span> <span class="n">res</span><span class="p">:</span>
|
|
<span class="n">sym</span><span class="o">.</span><span class="n">resolver</span> <span class="o">=</span> <span class="bp">self</span>
|
|
<span class="n">sym</span><span class="o">.</span><span class="n">displacement</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">return</span> <span class="n">res</span>
|
|
|
|
<span class="k">def</span> <span class="nf">get_symbols</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">if</span> <span class="n">callback</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">callback</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">simple_aggregator</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">callback</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">WINFUNCTYPE</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">BOOL</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">POINTER</span><span class="p">(</span><span class="n">SymbolInfo</span><span class="p">),</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ULONG</span> <span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">py_object</span><span class="p">)(</span><span class="n">callback</span><span class="p">)</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">SymEnumSymbolsForAddrW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">WindowsError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ERROR_MOD_NOT_FOUND</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="p">[]</span>
|
|
<span class="k">raise</span>
|
|
|
|
<span class="k">for</span> <span class="n">sym</span> <span class="ow">in</span> <span class="n">res</span><span class="p">:</span>
|
|
<span class="n">sym</span><span class="o">.</span><span class="n">resolver</span> <span class="o">=</span> <span class="bp">self</span>
|
|
<span class="n">sym</span><span class="o">.</span><span class="n">displacement</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">return</span> <span class="n">res</span>
|
|
|
|
<span class="c1"># Type stuff</span>
|
|
<span class="k">def</span> <span class="nf">get_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
|
|
<span class="n">max_len_size</span> <span class="o">=</span> <span class="mh">0x1000</span>
|
|
<span class="n">full_size</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">SymbolInfo</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">max_len_size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="n">buff</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">BUFFER</span><span class="p">(</span><span class="n">SymbolInfo</span><span class="p">)(</span><span class="n">size</span><span class="o">=</span><span class="n">full_size</span><span class="p">)</span>
|
|
<span class="n">buff</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">SizeOfStruct</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">SymbolInfo</span><span class="p">)</span>
|
|
<span class="n">buff</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">MaxNameLen</span> <span class="o">=</span> <span class="n">max_len_size</span>
|
|
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">SymGetTypeFromNameW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">mod</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">buff</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">SymbolType</span><span class="o">.</span><span class="n">from_symbol_info</span><span class="p">(</span><span class="n">buff</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">resolver</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
|
|
|
|
|
|
<span class="c1"># TODO: mets de l'huile pour w4kfu</span>
|
|
<span class="k">class</span> <span class="nc">StackWalker</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">resolver</span><span class="p">,</span> <span class="n">process</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">thread</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">resolver</span> <span class="o">=</span> <span class="n">resolver</span>
|
|
<span class="k">if</span> <span class="n">process</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">thread</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"At least a process or thread must be provided"</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">process</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">process</span> <span class="o">=</span> <span class="n">thread</span><span class="o">.</span><span class="n">owner</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">process</span> <span class="o">=</span> <span class="n">process</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">thread</span> <span class="o">=</span> <span class="n">thread</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">context</span> <span class="o">=</span> <span class="n">context</span>
|
|
<span class="k">if</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">bitness</span> <span class="o">==</span> <span class="mi">32</span> <span class="ow">and</span> <span class="n">process</span><span class="o">.</span><span class="n">bitness</span> <span class="o">==</span> <span class="mi">64</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">"StackWalking 64b does not seems to works from 32b process"</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_stack_frame_generator</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">ctx</span><span class="p">,</span> <span class="n">machine</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_effective_context_and_machine</span><span class="p">()</span>
|
|
<span class="n">frame</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setup_initial_frame_from_context</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">machine</span><span class="p">)</span>
|
|
<span class="n">thread_handle</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">thread</span><span class="o">.</span><span class="n">handle</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">thread</span> <span class="k">else</span> <span class="kc">None</span>
|
|
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">StackWalkEx</span><span class="p">(</span><span class="n">machine</span><span class="p">,</span>
|
|
<span class="c1"># dbg.current_process.handle,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">resolver</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span>
|
|
<span class="n">thread_handle</span><span class="p">,</span>
|
|
<span class="c1"># 0,</span>
|
|
<span class="n">frame</span><span class="p">,</span>
|
|
<span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">ctx</span><span class="p">),</span>
|
|
<span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">winproxy</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">SymFunctionTableAccess64</span><span class="p">),</span>
|
|
<span class="n">winproxy</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">SymGetModuleBase64</span><span class="p">),</span>
|
|
<span class="kc">None</span><span class="p">,</span>
|
|
<span class="mi">0</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">WindowsError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">e</span><span class="o">.</span><span class="n">winerror</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="c1"># No_ERROR -> end of stack walking</span>
|
|
<span class="k">raise</span>
|
|
<span class="k">yield</span> <span class="nb">type</span><span class="p">(</span><span class="n">frame</span><span class="p">)</span><span class="o">.</span><span class="n">from_buffer_copy</span><span class="p">(</span><span class="n">frame</span><span class="p">)</span> <span class="c1"># Make a copy ?</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_stack_frame_generator</span><span class="p">()</span>
|
|
|
|
<span class="c1"># Autorise to force the retrieving of 32b stack when code is currently on 64b code ?</span>
|
|
<span class="k">def</span> <span class="nf">_get_effective_context_and_machine</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">ctx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">context</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">thread</span><span class="o">.</span><span class="n">context</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">bitness</span> <span class="o">==</span> <span class="mi">32</span><span class="p">:</span>
|
|
<span class="c1"># Process is 32b, so the context is inevitably x86</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IMAGE_FILE_MACHINE_I386</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">bitness</span> <span class="o">==</span> <span class="mi">32</span><span class="p">:</span>
|
|
<span class="c1"># If we are 32b, we will only be able to handle x86 stack</span>
|
|
<span class="c1"># ctx is obligatory a 32b one, as the case us32/target64 is handled</span>
|
|
<span class="c1"># in __init__ with a NotImplementedError</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IMAGE_FILE_MACHINE_I386</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">bitness</span> <span class="o">==</span> <span class="mi">64</span><span class="p">:</span>
|
|
<span class="c1"># Process is 64b, so the context is inevitably x64</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IMAGE_FILE_MACHINE_AMD64</span><span class="p">)</span>
|
|
<span class="c1"># Thing get a little more complicated here :)</span>
|
|
<span class="c1"># We are a 64b process and target is 32b.</span>
|
|
<span class="c1"># So we must find-out if we are in 32 or 64b world at the moment.</span>
|
|
<span class="c1"># The context_syswow.SegCS give us the information</span>
|
|
<span class="c1"># The context32.SegCs would be always 32</span>
|
|
<span class="n">ctxsyswow</span> <span class="o">=</span> <span class="n">dbg</span><span class="o">.</span><span class="n">current_thread</span><span class="o">.</span><span class="n">context_syswow</span>
|
|
<span class="k">if</span> <span class="n">ctxsyswow</span><span class="o">.</span><span class="n">SegCs</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">CS_USER_32B</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IMAGE_FILE_MACHINE_I386</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="n">ctxsyswow</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IMAGE_FILE_MACHINE_AMD64</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_setup_initial_frame_from_context</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">,</span> <span class="n">machine</span><span class="p">):</span>
|
|
<span class="n">frame</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">STACKFRAME_EX</span><span class="p">()</span>
|
|
<span class="n">frame</span><span class="o">.</span><span class="n">AddrPC</span><span class="o">.</span><span class="n">Mode</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">AddrModeFlat</span>
|
|
<span class="n">frame</span><span class="o">.</span><span class="n">AddrFrame</span><span class="o">.</span><span class="n">Mode</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">AddrModeFlat</span>
|
|
<span class="n">frame</span><span class="o">.</span><span class="n">AddrStack</span><span class="o">.</span><span class="n">Mode</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">AddrModeFlat</span>
|
|
<span class="n">frame</span><span class="o">.</span><span class="n">AddrPC</span><span class="o">.</span><span class="n">Offset</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">pc</span>
|
|
<span class="n">frame</span><span class="o">.</span><span class="n">AddrStack</span><span class="o">.</span><span class="n">Offset</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">sp</span>
|
|
<span class="k">if</span> <span class="n">machine</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IMAGE_FILE_MACHINE_I386</span><span class="p">:</span>
|
|
<span class="n">frame</span><span class="o">.</span><span class="n">AddrFrame</span><span class="o">.</span><span class="n">Offset</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">Ebp</span>
|
|
<span class="c1"># Need RBP on 64b ?</span>
|
|
<span class="k">return</span> <span class="n">frame</span>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="VirtualSymbolHandler">
|
|
<a class="viewcode-back" href="../../../debug.html#windows.debug.symbols.VirtualSymbolHandler">[docs]</a>
|
|
<span class="k">class</span> <span class="nc">VirtualSymbolHandler</span><span class="p">(</span><span class="n">SymbolHandler</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""A SymbolHandler where its handle is not a valid process handle</span>
|
|
<span class="sd"> Allow to create/resolve symbol in a 'virtual' process</span>
|
|
<span class="sd"> But all API needing a real process handle will fail</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">VIRTUAL_HANDLER_COUNTER</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="mh">0x11223344</span><span class="p">)</span>
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">search_path</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="n">handle</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">VIRTUAL_HANDLER_COUNTER</span><span class="p">)</span>
|
|
<span class="nb">super</span><span class="p">(</span><span class="n">VirtualSymbolHandler</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">search_path</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
|
|
<span class="c1"># The VirtualSymbolHandler is not based on an existing process</span>
|
|
<span class="c1"># So load() in its simplest for should just take the path of the file to load</span>
|
|
<span class="n">load</span> <span class="o">=</span> <span class="n">SymbolHandler</span><span class="o">.</span><span class="n">load_file</span>
|
|
<span class="w"> </span><span class="sd">"""An alias for :func:`VirtualSymbolHandler.load_file`"""</span>
|
|
|
|
<div class="viewcode-block" id="VirtualSymbolHandler.refresh">
|
|
<a class="viewcode-back" href="../../../debug.html#windows.debug.symbols.VirtualSymbolHandler.refresh">[docs]</a>
|
|
<span class="k">def</span> <span class="nf">refresh</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Do nothing for a :class:`VirtualSymbolHandler`"""</span>
|
|
<span class="k">return</span> <span class="kc">False</span></div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="ProcessSymbolHandler">
|
|
<a class="viewcode-back" href="../../../debug.html#windows.debug.symbols.ProcessSymbolHandler">[docs]</a>
|
|
<span class="k">class</span> <span class="nc">ProcessSymbolHandler</span><span class="p">(</span><span class="n">SymbolHandler</span><span class="p">):</span>
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">process</span><span class="p">,</span> <span class="n">search_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">invade_process</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="nb">super</span><span class="p">(</span><span class="n">ProcessSymbolHandler</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">process</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">search_path</span><span class="p">,</span> <span class="n">invade_process</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="n">process</span>
|
|
|
|
<span class="c1"># The ProcessSymbolHandler is based on an existing process</span>
|
|
<span class="c1"># So load() in its simplest form should be able to load the symbol for an existing</span>
|
|
<span class="c1"># module that is already loaded</span>
|
|
<span class="c1"># Question: should be able to load other module at other address ?</span>
|
|
<div class="viewcode-block" id="ProcessSymbolHandler.load">
|
|
<a class="viewcode-back" href="../../../debug.html#windows.debug.symbols.ProcessSymbolHandler.load">[docs]</a>
|
|
<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Load the :class:`SymbolModule` associated with the loaded module ``name`` (as found in the PEB)</span>
|
|
|
|
<span class="sd"> :return: :class:`SymbolModule`</span>
|
|
|
|
<span class="sd"> Exemple:</span>
|
|
|
|
<span class="sd"> >>> sh = windows.debug.symbols.ProcessSymbolHandler(windows.test.pop_proc_64())</span>
|
|
<span class="sd"> <windows.debug.symbols.ProcessSymbolHandler object at 0x033A2C30></span>
|
|
<span class="sd"> >>> sh</span>
|
|
<span class="sd"> <windows.debug.symbols.ProcessSymbolHandler object at 0x033A2C30></span>
|
|
<span class="sd"> >>> sh.load("kernelbase.dll")</span>
|
|
<span class="sd"> <SymbolModule name="kernelbase" type=SymDeferred pdb="" addr=0x7ffb5b090000></span>
|
|
<span class="sd"> >>> sh["kernelbase!CreateProcessA"]</span>
|
|
<span class="sd"> <SymbolInfoA name="CreateProcessA" start=0x7ffb5b2371f0 tag=SymTagPublicSymbol></span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">mods</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">peb</span><span class="o">.</span><span class="n">modules</span> <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">name</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">mods</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Could not find module <</span><span class="si">{0}</span><span class="s2">>"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
|
|
<span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">mods</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="c1"># Load all if multiple match ?</span>
|
|
<span class="n">mod</span> <span class="o">=</span> <span class="n">mods</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">load_module</span><span class="p">(</span><span class="n">addr</span><span class="o">=</span><span class="n">mod</span><span class="o">.</span><span class="n">baseaddr</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="n">mod</span><span class="o">.</span><span class="n">fullname</span><span class="p">)</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="ProcessSymbolHandler.refresh">
|
|
<a class="viewcode-back" href="../../../debug.html#windows.debug.symbols.ProcessSymbolHandler.refresh">[docs]</a>
|
|
<span class="k">def</span> <span class="nf">refresh</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Update the list of loaded modules to match the modules present in the target process</span>
|
|
|
|
<span class="sd"> .. note::</span>
|
|
<span class="sd"> This function only call `SymRefreshModuleList <https://docs.microsoft.com/en-us/windows/win32/api/dbghelp/nf-dbghelp-symrefreshmodulelist>`_ for now.</span>
|
|
<span class="sd"> It seems that this function do not handle refreshing a 64b target from a 32b python</span>
|
|
|
|
<span class="sd"> Also, on a 32b target from a 64b python it seems to only load symbols for the 64b modules (ntdll + syswow dll)</span>
|
|
|
|
<span class="sd"> Exemple:</span>
|
|
|
|
<span class="sd"> >>> sh = windows.debug.symbols.ProcessSymbolHandler(windows.test.pop_proc_64())</span>
|
|
<span class="sd"> >>> sh.modules</span>
|
|
<span class="sd"> []</span>
|
|
<span class="sd"> >>> sh.refresh()</span>
|
|
<span class="sd"> 44</span>
|
|
<span class="sd"> >>> sh.modules</span>
|
|
<span class="sd"> [<SymbolModule name="notepad" type=SymDeferred pdb="" addr=0x7ff772b80000>,</span>
|
|
<span class="sd"> <SymbolModule name="ntdll" type=SymDeferred pdb="" addr=0x7ffb5d860000>,</span>
|
|
<span class="sd"> <SymbolModule name="KERNEL32" type=SymDeferred pdb="" addr=0x7ffb5bb90000>,</span>
|
|
<span class="sd"> <SymbolModule name="KERNELBASE" type=SymDeferred pdb="" addr=0x7ffb5b090000>,</span>
|
|
<span class="sd"> ...]</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">SymRefreshModuleList</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">)</span></div>
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">stackwalk</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
|
|
<span class="k">pass</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="SymbolEngine">
|
|
<a class="viewcode-back" href="../../../debug.html#windows.debug.symbols.SymbolEngine">[docs]</a>
|
|
<span class="k">class</span> <span class="nc">SymbolEngine</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Represent the global symbol engine. Just a proxy to get/set global engine options</span>
|
|
|
|
<span class="sd"> Its instance can be accessed using ``windows.debug.symbols.engine``</span>
|
|
|
|
<span class="sd"> Exemple:</span>
|
|
|
|
<span class="sd"> >>> windows.debug.symbols.engine.options</span>
|
|
<span class="sd"> 6L</span>
|
|
<span class="sd"> >>> windows.debug.symbols.engine.options = gdef.SYMOPT_UNDNAME</span>
|
|
<span class="sd"> >>> windows.debug.symbols.engine.options</span>
|
|
<span class="sd"> 2L</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="c1"># use to now if we need to call the setup of options</span>
|
|
<span class="c1"># At the first DbgHelp call</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">options_already_setup</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
<span class="k">def</span> <span class="nf">set_options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">options_already_setup</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">SymSetOptions</span><span class="p">(</span><span class="n">options</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">get_options</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">SymGetOptions</span><span class="p">()</span>
|
|
|
|
<span class="n">options</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">get_options</span><span class="p">,</span> <span class="n">set_options</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="sd">"""The options of the Symbol engine</span>
|
|
<span class="sd"> (`see options <https://docs.microsoft.com/en-us/windows/win32/api/dbghelp/nf-dbghelp-symsetoptions#parameters>`_)</span>
|
|
|
|
<span class="sd"> .. note::</span>
|
|
|
|
<span class="sd"> Default options are: ``gdef.SYMOPT_DEFERRED_LOADS + gdef.SYMOPT_UNDNAME``</span>
|
|
<span class="sd"> """</span></div>
|
|
|
|
|
|
<span class="n">engine</span> <span class="o">=</span> <span class="n">SymbolEngine</span><span class="p">()</span>
|
|
<span class="sd">"""The instance of the :class:`SymbolEngine`"""</span>
|
|
|
|
|
|
<span class="n">TST_TYPE_RES_TYPE</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_SYMNAME</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">LPWSTR</span><span class="p">,</span>
|
|
<span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_LENGTH</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ULONG64</span><span class="p">,</span>
|
|
<span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_ADDRESS</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ULONG64</span><span class="p">,</span>
|
|
<span class="n">gdef</span><span class="o">.</span><span class="n">TI_GTIEX_REQS_VALID</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ULONG64</span><span class="p">,</span>
|
|
<span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_SYMTAG</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SymTagEnum</span><span class="p">,</span>
|
|
<span class="n">gdef</span><span class="o">.</span><span class="n">TI_GET_VALUE</span><span class="p">:</span> <span class="n">windows</span><span class="o">.</span><span class="n">com</span><span class="o">.</span><span class="n">Variant</span><span class="p">,</span>
|
|
<span class="p">}</span>
|
|
</pre></div>
|
|
|
|
<div class="clearer"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
<div class="sphinxsidebarwrapper">
|
|
<search id="searchbox" style="display: none" role="search">
|
|
<h3 id="searchlabel">Quick search</h3>
|
|
<div class="searchformwrapper">
|
|
<form class="search" action="../../../search.html" method="get">
|
|
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
|
|
<input type="submit" value="Go" />
|
|
</form>
|
|
</div>
|
|
</search>
|
|
<script>document.getElementById('searchbox').style.display = "block"</script>
|
|
</div>
|
|
</div>
|
|
<div class="clearer"></div>
|
|
</div>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../../genindex.html" title="General Index"
|
|
>index</a></li>
|
|
<li class="right" >
|
|
<a href="../../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../../index.html">PythonForWindows 1.0.3 documentation</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">windows.debug.symbols</a></li>
|
|
</ul>
|
|
</div>
|
|
<div class="footer" role="contentinfo">
|
|
© Copyright 2015-2020, Clement Rouault.
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
|
|
</div>
|
|
</body>
|
|
</html> |