Files
2025-05-15 09:32:55 +02:00

4883 lines
747 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" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>18. Samples of code &#8212; 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" />
<link rel="next" title="19. Python, Windows &amp; encoding" href="encoding.html" />
<link rel="prev" title="17. Internals" href="internals.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="right" >
<a href="encoding.html" title="19. Python, Windows &amp; encoding"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="internals.html" title="17. Internals"
accesskey="P">previous</a> |</li>
<li class="nav-item nav-item-0"><a href="index.html">PythonForWindows 1.0.3 documentation</a> &#187;</li>
<li class="nav-item nav-item-this"><a href=""><span class="section-number">18. </span>Samples of code</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="samples-of-code">
<span id="sample-of-code"></span><h1><span class="section-number">18. </span>Samples of code<a class="headerlink" href="#samples-of-code" title="Link to this heading"></a></h1>
<section id="processes">
<h2><span class="section-number">18.1. </span>Processes<a class="headerlink" href="#processes" title="Link to this heading"></a></h2>
<section id="windows-current-process">
<span id="sample-current-process"></span><h3><span class="section-number">18.1.1. </span><code class="docutils literal notranslate"><span class="pre">windows.current_process</span></code><a class="headerlink" href="#windows-current-process" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.native_exec.simple_x86</span> <span class="k">as</span> <span class="nn">x86</span>
<span class="kn">import</span> <span class="nn">windows.native_exec.simple_x64</span> <span class="k">as</span> <span class="nn">x64</span>
<span class="c1"># Here is our current process</span>
<span class="n">cp</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;current process is </span><span class="si">{cp}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cp</span><span class="o">=</span><span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;current process is a &lt;</span><span class="si">{cp.bitness}</span><span class="s2">&gt; bits process&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cp</span><span class="o">=</span><span class="n">cp</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;current process is a SysWow64 process ? &lt;</span><span class="si">{cp.is_wow_64}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cp</span><span class="o">=</span><span class="n">cp</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;current process pid &lt;</span><span class="si">{cp.pid}</span><span class="s2">&gt; and ppid &lt;</span><span class="si">{cp.ppid}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cp</span><span class="o">=</span><span class="n">cp</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Here are the current process threads: &lt;</span><span class="si">{cp.threads}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cp</span><span class="o">=</span><span class="n">cp</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Let&#39;s execute some native code ! (0x41 + 1)&quot;</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"># Let&#39;s generate some native code</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">x86</span><span class="o">.</span><span class="n">MultipleInstr</span><span class="p">()</span>
<span class="n">code</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Mov</span><span class="p">(</span><span class="s2">&quot;Eax&quot;</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">)</span>
<span class="n">code</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Inc</span><span class="p">(</span><span class="s2">&quot;EAX&quot;</span><span class="p">)</span>
<span class="n">code</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Ret</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">x64</span><span class="o">.</span><span class="n">MultipleInstr</span><span class="p">()</span>
<span class="n">code</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Mov</span><span class="p">(</span><span class="s2">&quot;RAX&quot;</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">)</span>
<span class="n">code</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Inc</span><span class="p">(</span><span class="s2">&quot;RAX&quot;</span><span class="p">)</span>
<span class="n">code</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Ret</span><span class="p">()</span>
<span class="n">native_code</span> <span class="o">=</span> <span class="n">code</span><span class="o">.</span><span class="n">get_code</span><span class="p">()</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">native_code</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Native code returned &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">v</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Allocating memory in current process&quot;</span><span class="p">)</span>
<span class="n">addr</span> <span class="o">=</span> <span class="n">cp</span><span class="o">.</span><span class="n">virtual_alloc</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">)</span> <span class="c1"># Default alloc is RWX (so secure !)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Allocated memory is at &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">addr</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Writing &#39;SOME STUFF&#39; in allocation memory&quot;</span><span class="p">)</span>
<span class="n">cp</span><span class="o">.</span><span class="n">write_memory</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="s2">&quot;SOME STUFF&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Reading memory : &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">cp</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="mi">20</span><span class="p">))))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python process\current_process.py
current process is &lt;windows.winobject.process.CurrentProcess object at 0x000001DD8BC5CA10&gt;
current process is a &lt;64&gt; bits process
current process is a SysWow64 process ? &lt;False&gt;
current process pid &lt;26976&gt; and ppid &lt;28256&gt;
Here are the current process threads: &lt;[&lt;WinThread 15220 owner &quot;CurrentProcess&quot; at 0x1dd8d20b0d0&gt;, &lt;WinThread 27912 owner &quot;CurrentProcess&quot; at 0x1dd8d20afd0&gt;, &lt;WinThread 27832 owner &quot;CurrentProcess&quot; at 0x1dd8d20af10&gt;, &lt;WinThread 26820 owner &quot;CurrentProcess&quot; at 0x1dd8d20ae90&gt;]&gt;
Let&#39;s execute some native code ! (0x41 + 1)
Native code returned &lt;0x42&gt;
Allocating memory in current process
Allocated memory is at &lt;0x1dd8d2f0000&gt;
Writing &#39;SOME STUFF&#39; in allocation memory
Reading memory : &lt;b&#39;SOME STUFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&#39;&gt;
</pre></div>
</div>
</section>
<section id="remote-process-winprocess">
<span id="sample-remote-process"></span><h3><span class="section-number">18.1.2. </span>Remote process : <code class="xref py py-class docutils literal notranslate"><span class="pre">WinProcess</span></code><a class="headerlink" href="#remote-process-winprocess" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.native_exec.simple_x86</span> <span class="k">as</span> <span class="nn">x86</span>
<span class="kn">import</span> <span class="nn">windows.native_exec.simple_x64</span> <span class="k">as</span> <span class="nn">x64</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Creating a notepad&quot;</span><span class="p">)</span> <span class="c1">## Replaced calc.exe by notepad.exe cause of windows 10.</span>
<span class="n">notepad</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">create_process</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;C:\windows\system32\notepad.exe&quot;</span><span class="p">)</span>
<span class="c1"># You don&#39;t need to do that in our case, but it&#39;s useful to now</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Looking for notepads in the processes&quot;</span><span class="p">)</span>
<span class="n">all_notepads</span> <span class="o">=</span> <span class="p">[</span><span class="n">proc</span> <span class="k">for</span> <span class="n">proc</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">processes</span> <span class="k">if</span> <span class="n">proc</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;notepad.exe&quot;</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;They are currently &lt;</span><span class="si">{0}</span><span class="s2">&gt; notepads running on the system&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">all_notepads</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Let&#39;s play with our notepad: &lt;</span><span class="si">{notepad}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">notepad</span><span class="o">=</span><span class="n">notepad</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Our notepad pid is </span><span class="si">{notepad.pid}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">notepad</span><span class="o">=</span><span class="n">notepad</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Our notepad is a &lt;</span><span class="si">{notepad.bitness}</span><span class="s2">&gt; bits process&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">notepad</span><span class="o">=</span><span class="n">notepad</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Our notepad is a SysWow64 process ? &lt;</span><span class="si">{notepad.is_wow_64}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">notepad</span><span class="o">=</span><span class="n">notepad</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Our notepad have threads ! &lt;</span><span class="si">{notepad.threads}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">notepad</span><span class="o">=</span><span class="n">notepad</span><span class="p">))</span>
<span class="c1"># PEB STUFF</span>
<span class="n">peb</span> <span class="o">=</span> <span class="n">notepad</span><span class="o">.</span><span class="n">peb</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Exploring our notepad PEB ! </span><span class="si">{peb}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">peb</span><span class="o">=</span><span class="n">peb</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Command line is </span><span class="si">{peb.commandline}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">peb</span><span class="o">=</span><span class="n">peb</span><span class="p">))</span>
<span class="n">modules</span> <span class="o">=</span> <span class="n">peb</span><span class="o">.</span><span class="n">modules</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Here are 3 loaded modules: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">modules</span><span class="p">[:</span><span class="mi">3</span><span class="p">]))</span>
<span class="c1"># See iat_hook.py for module exploration</span>
<span class="c1"># Remote alloc / read / write</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Allocating memory in our notepad&quot;</span><span class="p">)</span>
<span class="n">addr</span> <span class="o">=</span> <span class="n">notepad</span><span class="o">.</span><span class="n">virtual_alloc</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Allocated memory is at &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">addr</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Writing &#39;SOME STUFF&#39; in allocated memory&quot;</span><span class="p">)</span>
<span class="n">notepad</span><span class="o">.</span><span class="n">write_memory</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="s2">&quot;SOME STUFF&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Reading allocated memory : &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">notepad</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="mi">20</span><span class="p">))))</span>
<span class="c1"># Remote Execution</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Execution some native code in our notepad (write 0x424242 at allocated address + return 0x1337)&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">notepad</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"># Let&#39;s generate some native code</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">x86</span><span class="o">.</span><span class="n">MultipleInstr</span><span class="p">()</span>
<span class="n">code</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Mov</span><span class="p">(</span><span class="n">x86</span><span class="o">.</span><span class="n">deref</span><span class="p">(</span><span class="n">addr</span><span class="p">),</span> <span class="mh">0x42424242</span><span class="p">)</span>
<span class="n">code</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Mov</span><span class="p">(</span><span class="s2">&quot;EAX&quot;</span><span class="p">,</span> <span class="mh">0x1337</span><span class="p">)</span>
<span class="n">code</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Ret</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">x64</span><span class="o">.</span><span class="n">MultipleInstr</span><span class="p">()</span>
<span class="n">code</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Mov</span><span class="p">(</span><span class="s1">&#39;RAX&#39;</span><span class="p">,</span> <span class="n">addr</span><span class="p">)</span>
<span class="n">code</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Mov</span><span class="p">(</span><span class="n">x64</span><span class="o">.</span><span class="n">mem</span><span class="p">(</span><span class="s2">&quot;[RAX]&quot;</span><span class="p">),</span> <span class="mh">0x42424242</span><span class="p">)</span>
<span class="n">code</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Mov</span><span class="p">(</span><span class="s2">&quot;RAX&quot;</span><span class="p">,</span> <span class="mh">0x1337</span><span class="p">)</span>
<span class="n">code</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Ret</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Executing native code !&quot;</span><span class="p">)</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">notepad</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">code</span><span class="o">.</span><span class="n">get_code</span><span class="p">())</span>
<span class="n">t</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Return code = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">exit_code</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Reading allocated memory : &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">notepad</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="mi">20</span><span class="p">))))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Executing python code !&quot;</span><span class="p">)</span>
<span class="c1"># Make &#39;windows&#39; importable in remote python</span>
<span class="n">notepad</span><span class="o">.</span><span class="n">execute_python</span><span class="p">(</span><span class="s2">&quot;import sys; sys.path.append(r&#39;</span><span class="si">{0}</span><span class="s2">&#39;)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]))</span>
<span class="n">notepad</span><span class="o">.</span><span class="n">execute_python</span><span class="p">(</span><span class="s2">&quot;import windows&quot;</span><span class="p">)</span>
<span class="c1"># Let&#39;s write in the notepad &#39;current_process&#39; memory :)</span>
<span class="n">notepad</span><span class="o">.</span><span class="n">execute_python</span><span class="p">(</span><span class="s2">&quot;addr = </span><span class="si">{addr}</span><span class="s2">; windows.current_process.write_memory(addr, &#39;HELLO FROM notepad&#39;)&quot;</span><span class="o">.</span><span class="n">format</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="nb">print</span><span class="p">(</span><span class="s2">&quot;Reading allocated memory : &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">notepad</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="mi">20</span><span class="p">))))</span>
<span class="c1"># python_execute is &#39;safe&#39;:</span>
<span class="c1"># - it waits for the thread completion</span>
<span class="c1"># - it raise an error if remote code raised some</span>
<span class="k">try</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Trying to import in remote module &#39;FAKE_MODULE&#39;&quot;</span><span class="p">)</span>
<span class="n">notepad</span><span class="o">.</span><span class="n">execute_python</span><span class="p">(</span><span class="s2">&quot;def func():</span><span class="se">\n</span><span class="s2"> import FAKE_MODULE</span><span class="se">\n</span><span class="s2">func()&quot;</span><span class="p">)</span>
<span class="k">except</span> <span class="n">windows</span><span class="o">.</span><span class="n">injection</span><span class="o">.</span><span class="n">RemotePythonError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Exception in remote process!&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;That&#39;s all ! killing the notepad&quot;</span><span class="p">)</span>
<span class="n">notepad</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python process\remote_process.py
Creating a notepad
Looking for notepads in the processes
They are currently &lt;1&gt; notepads running on the system
Let&#39;s play with our notepad: &lt;&lt;WinProcess &quot;notepad.exe&quot; pid 8400 at 0x6238510&gt;&gt;
Our notepad pid is 8400
Our notepad is a &lt;32&gt; bits process
Our notepad is a SysWow64 process ? &lt;True&gt;
Our notepad have threads ! &lt;[&lt;WinThread 16028 owner &quot;notepad.exe&quot; at 0x6238f10&gt;, &lt;WinThread 5924 owner &quot;notepad.exe&quot; at 0x6238a10&gt;, &lt;WinThread 11620 owner &quot;notepad.exe&quot; at 0x6238fb0&gt;, &lt;WinThread 3480 owner &quot;notepad.exe&quot; at 0x6238ff0&gt;, &lt;WinThread 200 owner &quot;notepad.exe&quot; at 0x62389b0&gt;, &lt;WinThread 16804 owner &quot;notepad.exe&quot; at 0x62389f0&gt;, &lt;WinThread 13340 owner &quot;notepad.exe&quot; at 0x6238930&gt;]&gt;
Exploring our notepad PEB ! &lt;windows.winobject.process.RemotePEB object at 0x061BDA80&gt;
Command line is &lt;Remote_LSA_UNICODE_STRING &quot;&quot;C:\windows\system32\notepad.exe&quot;&quot; at 0x61bdb20&gt;
Here are 3 loaded modules: [&lt;RemoteLoadedModule &quot;notepad.exe&quot; at 0x61bdad0&gt;, &lt;RemoteLoadedModule &quot;ntdll.dll&quot; at 0x61bd940&gt;, &lt;RemoteLoadedModule &quot;kernel32.dll&quot; at 0x61bd8f0&gt;]
Allocating memory in our notepad
Allocated memory is at &lt;0x6f00000&gt;
Writing &#39;SOME STUFF&#39; in allocated memory
Reading allocated memory : &lt;&#39;SOME STUFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&#39;&gt;
Execution some native code in our notepad (write 0x424242 at allocated address + return 0x1337)
Executing native code !
Return code = 0x1337L
Reading allocated memory : &lt;&#39;BBBB STUFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&#39;&gt;
Executing python code !
Reading allocated memory : &lt;&#39;HELLO FROM notepad\x00\x00&#39;&gt;
Trying to import in remote module &#39;FAKE_MODULE&#39;
Exception in remote process!
Traceback (most recent call last):
File &quot;&lt;string&gt;&quot;, line 3, in &lt;module&gt;
File &quot;&lt;string&gt;&quot;, line 2, in func
ImportError: No module named FAKE_MODULE
That&#39;s all ! killing the notepad
</pre></div>
</div>
</section>
<section id="peb-exploration">
<span id="sample-peb-exploration"></span><h3><span class="section-number">18.1.3. </span><code class="xref py py-class docutils literal notranslate"><span class="pre">PEB</span></code> exploration<a class="headerlink" href="#peb-exploration" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Exploring the current process PEB&quot;</span><span class="p">)</span>
<span class="n">peb</span> <span class="o">=</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="nb">print</span><span class="p">(</span><span class="s2">&quot;PEB is &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">peb</span><span class="p">))</span>
<span class="n">commandline</span> <span class="o">=</span> <span class="n">peb</span><span class="o">.</span><span class="n">commandline</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Commandline object is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">commandline</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Commandline string is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">commandline</span><span class="o">.</span><span class="n">Buffer</span><span class="p">)))</span>
<span class="n">imagepath</span> <span class="o">=</span> <span class="n">peb</span><span class="o">.</span><span class="n">imagepath</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Imagepath </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">imagepath</span><span class="p">))</span>
<span class="n">modules</span> <span class="o">=</span> <span class="n">peb</span><span class="o">.</span><span class="n">modules</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Printing some modules: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">modules</span><span class="p">[:</span><span class="mi">6</span><span class="p">])))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;=== K32 ===&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Looking for kernel32.dll&quot;</span><span class="p">)</span>
<span class="n">k32</span> <span class="o">=</span> <span class="p">[</span><span class="n">m</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">modules</span> <span class="k">if</span> <span class="n">m</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;kernel32.dll&quot;</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Kernel32 module: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">k32</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Module name = &lt;</span><span class="si">{0}</span><span class="s2">&gt; | Fullname = &lt;</span><span class="si">{1}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">k32</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">k32</span><span class="o">.</span><span class="n">fullname</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Kernel32 is loaded at address </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">k32</span><span class="o">.</span><span class="n">baseaddr</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;=== K32 PE ===&quot;</span><span class="p">)</span>
<span class="n">k32pe</span> <span class="o">=</span> <span class="n">k32</span><span class="o">.</span><span class="n">pe</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;PE Representation of k32: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">k32pe</span><span class="p">))</span>
<span class="n">exports</span> <span class="o">=</span> <span class="n">k32pe</span><span class="o">.</span><span class="n">exports</span>
<span class="n">some_exports</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">((</span><span class="n">k</span><span class="p">,</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">exports</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">k</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">42</span><span class="p">,</span> <span class="s2">&quot;VirtualAlloc&quot;</span><span class="p">,</span> <span class="s2">&quot;CreateFileA&quot;</span><span class="p">])</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Here are some exports </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">some_exports</span><span class="p">))</span>
<span class="n">imports</span> <span class="o">=</span> <span class="n">k32pe</span><span class="o">.</span><span class="n">imports</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Import DLL dependancies are (without api-*): </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</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="n">imports</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">x</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;api-&quot;</span><span class="p">)]))</span>
<span class="n">NtCreateFile_iat</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="n">imports</span><span class="p">[</span><span class="s2">&quot;ntdll.dll&quot;</span><span class="p">]</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="s2">&quot;NtCreateFile&quot;</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;IAT Entry for ntdll!NtCreateFile = </span><span class="si">{0}</span><span class="s2"> | addr = </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">NtCreateFile_iat</span><span class="p">,</span> <span class="nb">hex</span><span class="p">(</span><span class="n">NtCreateFile_iat</span><span class="o">.</span><span class="n">addr</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Sections: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">k32pe</span><span class="o">.</span><span class="n">sections</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python process\peb.py
Exploring the current process PEB
PEB is &lt;&lt;windows.winobject.process.PEB object at 0x05A6F710&gt;&gt;
Commandline object is &lt;_LSA_UNICODE_STRING &quot;C:\Python27\python.exe process\peb.py&quot; at 0x5a6f8a0&gt;
Commandline string is 47063282
Imagepath &lt;_LSA_UNICODE_STRING &quot;C:\Python27\python.exe&quot; at 0x5a6f990&gt;
Printing some modules: &lt;LoadedModule &quot;python.exe&quot; at 0x60d2080&gt;
&lt;LoadedModule &quot;ntdll.dll&quot; at 0x60d2030&gt;
&lt;LoadedModule &quot;kernel32.dll&quot; at 0x60d2b20&gt;
&lt;LoadedModule &quot;kernelbase.dll&quot; at 0x60d2b70&gt;
&lt;LoadedModule &quot;python27.dll&quot; at 0x60d2bc0&gt;
&lt;LoadedModule &quot;msvcr90.dll&quot; at 0x60d2c10&gt;
=== K32 ===
Looking for kernel32.dll
Kernel32 module: &lt;LoadedModule &quot;kernel32.dll&quot; at 0x60d2b20&gt;
Module name = &lt;kernel32.dll&gt; | Fullname = &lt;c:\windows\system32\kernel32.dll&gt;
Kernel32 is loaded at address 0x76930000
=== K32 PE ===
PE Representation of k32: &lt;windows.pe_parse.PEFile object at 0x060CCA10&gt;
Here are some exports {0: 1989445168L, &#39;CreateFileA&#39;: 1989795280L, 42: 1989636592L, &#39;VirtualAlloc&#39;: 1989437552L}
Import DLL dependancies are (without api-*): [&#39;kernelbase.dll&#39;, &#39;ntdll.dll&#39;]
IAT Entry for ntdll!NtCreateFile = &lt;IATEntry &quot;NtCreateFile&quot; ordinal 272&gt; | addr = 0x769a1a28L
Sections: [&lt;PESection &quot;.text&quot;&gt;, &lt;PESection &quot;.rdata&quot;&gt;, &lt;PESection &quot;.data&quot;&gt;, &lt;PESection &quot;.rsrc&quot;&gt;, &lt;PESection &quot;.reloc&quot;&gt;]
</pre></div>
</div>
</section>
<section id="apisetmap">
<span id="sample-apisetmap"></span><h3><span class="section-number">18.1.4. </span>ApiSetMap<a class="headerlink" href="#apisetmap" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">windows</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Computer is a &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">version_name</span><span class="p">))</span>
<span class="n">cp</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span>
<span class="n">apism</span> <span class="o">=</span> <span class="n">cp</span><span class="o">.</span><span class="n">peb</span><span class="o">.</span><span class="n">apisetmap</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ApiSetMap: </span><span class="si">{0}</span><span class="s2"> (version = </span><span class="si">{1}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">apism</span><span class="p">,</span> <span class="n">apism</span><span class="o">.</span><span class="n">version</span><span class="p">))</span>
<span class="c1"># Find the current version of &quot;api-ms-win-core-processthreads&quot; used by windows</span>
<span class="n">dll_demos_fullname</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="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">apisetmap</span><span class="o">.</span><span class="n">apisetmap_dict</span> <span class="k">if</span> <span class="s2">&quot;api-ms-win-core-processthreads&quot;</span> <span class="ow">in</span> <span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">dll_demos_utilname</span> <span class="o">=</span> <span class="s1">&#39;api-ms-win-core-processthreads-l1-1-&#39;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Entries in &#39;apisetmap_dict&#39; are the full api-dll path extracted&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * apisetmap.apisetmap_dict[&#39;</span><span class="si">{0}</span><span class="s2">&#39;] -&gt; </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">dll_demos_fullname</span><span class="p">,</span> <span class="n">apism</span><span class="o">.</span><span class="n">apisetmap_dict</span><span class="p">[</span><span class="n">dll_demos_fullname</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Entries in &#39;resolution_dict&#39; are the contains the util-part check by windows&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * apisetmap.resolution_dict[&#39;</span><span class="si">{0}</span><span class="s2">&#39;] -&gt; </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">dll_demos_utilname</span><span class="p">,</span> <span class="n">apism</span><span class="o">.</span><span class="n">resolution_dict</span><span class="p">[</span><span class="n">dll_demos_utilname</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ApiSetMap.resolve resolve a api-dll based on the util part&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">suffix</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;1&quot;</span><span class="p">,</span> <span class="s2">&quot;2&quot;</span><span class="p">,</span> <span class="s2">&quot;PART_IS_IGNORED&quot;</span><span class="p">]:</span>
<span class="n">testname</span> <span class="o">=</span> <span class="n">dll_demos_utilname</span> <span class="o">+</span> <span class="n">suffix</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * apisetmap.resolve(&#39;</span><span class="si">{0}</span><span class="s2">&#39;) -&gt; </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">testname</span><span class="p">,</span> <span class="n">apism</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="n">testname</span><span class="p">)))</span>
<span class="n">testname</span> <span class="o">=</span> <span class="s2">&quot;BAD_DLL-3.dll&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * apisetmap.resolve(&#39;</span><span class="si">{0}</span><span class="s2">&#39;) -&gt; </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">testname</span><span class="p">,</span> <span class="n">apism</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="n">testname</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="nb">print</span><span class="p">(</span><span class="s2">&quot; * apisetmap.resolve(&#39;</span><span class="si">{0}</span><span class="s2">&#39;) -&gt; raised: </span><span class="si">{1!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">testname</span><span class="p">,</span> <span class="n">e</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">process</span>\<span class="n">apisetmap</span><span class="o">.</span><span class="n">py</span>
<span class="n">Computer</span> <span class="ow">is</span> <span class="n">a</span> <span class="o">&lt;</span><span class="n">Windows</span> <span class="mi">10</span><span class="o">&gt;</span>
<span class="n">ApiSetMap</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">windows</span><span class="o">.</span><span class="n">winobject</span><span class="o">.</span><span class="n">apisetmap</span><span class="o">.</span><span class="n">ApiSetMapVersion6</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x0645ECB0</span><span class="o">&gt;</span> <span class="p">(</span><span class="n">version</span> <span class="o">=</span> <span class="mi">6</span><span class="p">)</span>
<span class="n">Entries</span> <span class="ow">in</span> <span class="s1">&#39;apisetmap_dict&#39;</span> <span class="n">are</span> <span class="n">the</span> <span class="n">full</span> <span class="n">api</span><span class="o">-</span><span class="n">dll</span> <span class="n">path</span> <span class="n">extracted</span>
<span class="o">*</span> <span class="n">apisetmap</span><span class="o">.</span><span class="n">apisetmap_dict</span><span class="p">[</span><span class="s1">&#39;api-ms-win-core-processthreads-l1-1-3&#39;</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="n">kernelbase</span><span class="o">.</span><span class="n">dll</span>
<span class="n">Entries</span> <span class="ow">in</span> <span class="s1">&#39;resolution_dict&#39;</span> <span class="n">are</span> <span class="n">the</span> <span class="n">contains</span> <span class="n">the</span> <span class="n">util</span><span class="o">-</span><span class="n">part</span> <span class="n">check</span> <span class="n">by</span> <span class="n">windows</span>
<span class="o">*</span> <span class="n">apisetmap</span><span class="o">.</span><span class="n">resolution_dict</span><span class="p">[</span><span class="s1">&#39;api-ms-win-core-processthreads-l1-1-&#39;</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="n">kernelbase</span><span class="o">.</span><span class="n">dll</span>
<span class="n">ApiSetMap</span><span class="o">.</span><span class="n">resolve</span> <span class="n">resolve</span> <span class="n">a</span> <span class="n">api</span><span class="o">-</span><span class="n">dll</span> <span class="n">based</span> <span class="n">on</span> <span class="n">the</span> <span class="n">util</span> <span class="n">part</span>
<span class="o">*</span> <span class="n">apisetmap</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="s1">&#39;api-ms-win-core-processthreads-l1-1-1&#39;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">kernelbase</span><span class="o">.</span><span class="n">dll</span>
<span class="o">*</span> <span class="n">apisetmap</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="s1">&#39;api-ms-win-core-processthreads-l1-1-2&#39;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">kernelbase</span><span class="o">.</span><span class="n">dll</span>
<span class="o">*</span> <span class="n">apisetmap</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="s1">&#39;api-ms-win-core-processthreads-l1-1-PART_IS_IGNORED&#39;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">kernelbase</span><span class="o">.</span><span class="n">dll</span>
<span class="o">*</span> <span class="n">apisetmap</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="s1">&#39;BAD_DLL-3.dll&#39;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">raised</span><span class="p">:</span> <span class="ne">KeyError</span><span class="p">(</span><span class="s1">&#39;BAD_DLL-&#39;</span><span class="p">,)</span>
</pre></div>
</div>
</section>
<section id="iat-hooking">
<span id="sample-iat-hook"></span><h3><span class="section-number">18.1.5. </span>IAT hooking<a class="headerlink" href="#iat-hooking" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">winreg</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">_winreg</span> <span class="k">as</span> <span class="nn">winreg</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="c1"># Here is a demo of IAT hooking in python</span>
<span class="c1"># We will hook the &#39;RegOpenKeyExA&#39; entry of Python27.dll because it is easy to trigger !</span>
<span class="c1"># First: let&#39;s create our hook</span>
<span class="c1"># windows.hooks.RegOpenKeyExACallback is generated based on windows.generated_def.winfuncs</span>
<span class="nd">@windows</span><span class="o">.</span><span class="n">hooks</span><span class="o">.</span><span class="n">RegOpenKeyExACallback</span>
<span class="k">def</span> <span class="nf">open_reg_hook</span><span class="p">(</span><span class="n">hKey</span><span class="p">,</span> <span class="n">lpSubKey</span><span class="p">,</span> <span class="n">ulOptions</span><span class="p">,</span> <span class="n">samDesired</span><span class="p">,</span> <span class="n">phkResult</span><span class="p">,</span> <span class="n">real_function</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&lt;in hook&gt; Hook called | hKey = </span><span class="si">{0}</span><span class="s2"> | lpSubKey = &lt;</span><span class="si">{1}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">hKey</span><span class="p">),</span> <span class="n">lpSubKey</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
<span class="c1"># Our hook can choose to call the real_function or not</span>
<span class="k">if</span> <span class="s2">&quot;SECRET&quot;</span> <span class="ow">in</span> <span class="n">lpSubKey</span><span class="o">.</span><span class="n">value</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&lt;in hook&gt; Secret key asked, returning magic handle 0x12345678&quot;</span><span class="p">)</span>
<span class="c1"># We must respect the hooked method return-value interface</span>
<span class="n">phkResult</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mh">0x12345678</span>
<span class="k">return</span> <span class="mi">0</span>
<span class="k">if</span> <span class="s2">&quot;FAIL&quot;</span> <span class="ow">in</span> <span class="n">lpSubKey</span><span class="o">.</span><span class="n">value</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&lt;in hook&gt; Asked for a failing key: returning 0x2a&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="mi">42</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&lt;in hook&gt; Non-secret key : calling normal function&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">real_function</span><span class="p">()</span>
<span class="c1">## Wide version of the Hook for python3 !</span>
<span class="nd">@windows</span><span class="o">.</span><span class="n">hooks</span><span class="o">.</span><span class="n">RegOpenKeyExWCallback</span>
<span class="k">def</span> <span class="nf">open_reg_hookw</span><span class="p">(</span><span class="n">hKey</span><span class="p">,</span> <span class="n">lpSubKey</span><span class="p">,</span> <span class="n">ulOptions</span><span class="p">,</span> <span class="n">samDesired</span><span class="p">,</span> <span class="n">phkResult</span><span class="p">,</span> <span class="n">real_function</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&lt;in hook&gt; Hook called | hKey = </span><span class="si">{0}</span><span class="s2"> | lpSubKey = &lt;</span><span class="si">{1}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">hKey</span><span class="p">),</span> <span class="n">lpSubKey</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
<span class="c1"># Our hook can choose to call the real_function or not</span>
<span class="k">if</span> <span class="s2">&quot;SECRET&quot;</span> <span class="ow">in</span> <span class="n">lpSubKey</span><span class="o">.</span><span class="n">value</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&lt;in hook&gt; Secret key asked, returning magic handle 0x12345678&quot;</span><span class="p">)</span>
<span class="c1"># We must respect the hooked method return-value interface</span>
<span class="n">phkResult</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mh">0x12345678</span>
<span class="k">return</span> <span class="mi">0</span>
<span class="k">if</span> <span class="s2">&quot;FAIL&quot;</span> <span class="ow">in</span> <span class="n">lpSubKey</span><span class="o">.</span><span class="n">value</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&lt;in hook&gt; Asked for a failing key: returning 0x2a&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="mi">42</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&lt;in hook&gt; Non-secret key : calling normal function&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">real_function</span><span class="p">()</span>
<span class="c1"># Get the peb of our process</span>
<span class="n">peb</span> <span class="o">=</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="c1"># Get the pythonxx.dll module</span>
<span class="n">pythondll_module</span> <span class="o">=</span> <span class="p">[</span><span class="n">m</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">peb</span><span class="o">.</span><span class="n">modules</span> <span class="k">if</span> <span class="n">m</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;python&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">m</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;.dll&quot;</span><span class="p">)][</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># Get the iat entries for DLL advapi32.dll</span>
<span class="n">adv_imports</span> <span class="o">=</span> <span class="n">pythondll_module</span><span class="o">.</span><span class="n">pe</span><span class="o">.</span><span class="n">imports</span><span class="p">[</span><span class="s1">&#39;advapi32.dll&#39;</span><span class="p">]</span>
<span class="c1"># Get RegOpenKeyExA iat entry</span>
<span class="n">RegOpenKeyEx_iat</span> <span class="o">=</span> <span class="p">[</span><span class="n">n</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">adv_imports</span> <span class="k">if</span> <span class="n">n</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;RegOpenKeyExA&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">RegOpenKeyEx_iat</span><span class="p">:</span> <span class="c1"># Py3</span>
<span class="n">RegOpenKeyEx_iat</span> <span class="o">=</span> <span class="p">[</span><span class="n">n</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">adv_imports</span> <span class="k">if</span> <span class="n">n</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;RegOpenKeyExW&quot;</span><span class="p">]</span>
<span class="n">open_reg_hook</span> <span class="o">=</span> <span class="n">open_reg_hookw</span>
<span class="n">RegOpenKeyEx_iat</span> <span class="o">=</span> <span class="n">RegOpenKeyEx_iat</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># Setup our hook</span>
<span class="n">RegOpenKeyEx_iat</span><span class="o">.</span><span class="n">set_hook</span><span class="p">(</span><span class="n">open_reg_hook</span><span class="p">)</span>
<span class="c1">### !!!! You must keep the iat_entry alive !!!!</span>
<span class="c1">### If the hook is garbage collected while active -&gt; python will crash</span>
<span class="c1"># Use python native module _winreg that call &#39;RegOpenKeyExA&#39;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Asking for &lt;MY_SECRET_KEY&gt;&quot;</span><span class="p">)</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">winreg</span><span class="o">.</span><span class="n">OpenKey</span><span class="p">(</span><span class="mi">1234567</span><span class="p">,</span> <span class="s2">&quot;MY_SECRET_KEY&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result = &quot;</span> <span class="o">+</span> <span class="nb">hex</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">handle</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Asking for &lt;MY_FAIL_KEY&gt;&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">winreg</span><span class="o">.</span><span class="n">OpenKey</span><span class="p">(</span><span class="mi">1234567</span><span class="p">,</span> <span class="s2">&quot;MY_FAIL_KEY&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result = &quot;</span> <span class="o">+</span> <span class="nb">hex</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">handle</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="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Asking for &lt;HKEY_CURRENT_USER/Software&gt;&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">winreg</span><span class="o">.</span><span class="n">OpenKey</span><span class="p">(</span><span class="n">winreg</span><span class="o">.</span><span class="n">HKEY_CURRENT_USER</span><span class="p">,</span> <span class="s2">&quot;Software&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result = &quot;</span> <span class="o">+</span> <span class="nb">hex</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">handle</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="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">process</span>\<span class="n">iat_hook</span><span class="o">.</span><span class="n">py</span>
<span class="n">Asking</span> <span class="k">for</span> <span class="o">&lt;</span><span class="n">MY_SECRET_KEY</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="ow">in</span> <span class="n">hook</span><span class="o">&gt;</span> <span class="n">Hook</span> <span class="n">called</span> <span class="o">|</span> <span class="n">hKey</span> <span class="o">=</span> <span class="mh">0x12d687</span> <span class="o">|</span> <span class="n">lpSubKey</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">MY_SECRET_KEY</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="ow">in</span> <span class="n">hook</span><span class="o">&gt;</span> <span class="n">Secret</span> <span class="n">key</span> <span class="n">asked</span><span class="p">,</span> <span class="n">returning</span> <span class="n">magic</span> <span class="n">handle</span> <span class="mh">0x12345678</span>
<span class="n">Result</span> <span class="o">=</span> <span class="mh">0x12345678</span>
<span class="n">Asking</span> <span class="k">for</span> <span class="o">&lt;</span><span class="n">MY_FAIL_KEY</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="ow">in</span> <span class="n">hook</span><span class="o">&gt;</span> <span class="n">Hook</span> <span class="n">called</span> <span class="o">|</span> <span class="n">hKey</span> <span class="o">=</span> <span class="mh">0x12d687</span> <span class="o">|</span> <span class="n">lpSubKey</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">MY_FAIL_KEY</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="ow">in</span> <span class="n">hook</span><span class="o">&gt;</span> <span class="n">Asked</span> <span class="k">for</span> <span class="n">a</span> <span class="n">failing</span> <span class="n">key</span><span class="p">:</span> <span class="n">returning</span> <span class="mh">0x2a</span>
<span class="ne">WindowsError</span><span class="p">(</span><span class="mi">42</span><span class="p">,</span> <span class="s1">&#39;Windows Error 0x2A&#39;</span><span class="p">)</span>
<span class="n">Asking</span> <span class="k">for</span> <span class="o">&lt;</span><span class="n">HKEY_CURRENT_USER</span><span class="o">/</span><span class="n">Software</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="ow">in</span> <span class="n">hook</span><span class="o">&gt;</span> <span class="n">Hook</span> <span class="n">called</span> <span class="o">|</span> <span class="n">hKey</span> <span class="o">=</span> <span class="mh">0x80000001</span><span class="n">L</span> <span class="o">|</span> <span class="n">lpSubKey</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">Software</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="ow">in</span> <span class="n">hook</span><span class="o">&gt;</span> <span class="n">Non</span><span class="o">-</span><span class="n">secret</span> <span class="n">key</span> <span class="p">:</span> <span class="n">calling</span> <span class="n">normal</span> <span class="n">function</span>
<span class="n">Result</span> <span class="o">=</span> <span class="mh">0x428</span>
</pre></div>
</div>
</section>
<section id="microsoft-store-python-injection">
<span id="token-sample"></span><h3><span class="section-number">18.1.6. </span>Microsoft Store Python Injection<a class="headerlink" href="#microsoft-store-python-injection" title="Link to this heading"></a></h3>
<p>Python execution in remote process fails with Microsoft Store builds of pythons (<cite>mspython</cite>), as the interpreter DLLs do not grant execute to Users.
This sample shows a workaround by user <a class="reference external" href="https://github.com/dariushoule">https://github.com/dariushoule</a> by copying needed mspython files to a temporary directory and injecting those instead.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># Some python interpreters run in environments with restrictive ACLs (no Users/* execute) on bundled DLLs.</span>
<span class="c1"># The Microsoft Store version of python is the prime example of this.</span>
<span class="c1">#</span>
<span class="c1"># Remote execution of python is still possible by creating a minimal set of the dependencies outside of the restricted directory.</span>
<span class="c1">#</span>
<span class="c1"># This can be very helpful when operating PFW in environments with restrive GPOs / AppLocker.</span>
<span class="kn">import</span> <span class="nn">ctypes</span>
<span class="kn">import</span> <span class="nn">glob</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">shutil</span>
<span class="kn">import</span> <span class="nn">tempfile</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">struct</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">from</span> <span class="nn">windows.generated_def.ntstatus</span> <span class="kn">import</span> <span class="n">STATUS_THREAD_IS_TERMINATING</span>
<span class="kn">from</span> <span class="nn">windows.generated_def.windef</span> <span class="kn">import</span> <span class="n">CREATE_SUSPENDED</span>
<span class="kn">from</span> <span class="nn">windows.generated_def.winstructs</span> <span class="kn">import</span> <span class="n">PROCESS_INFORMATION</span><span class="p">,</span> <span class="n">STARTUPINFOW</span>
<span class="kn">from</span> <span class="nn">windows.injection</span> <span class="kn">import</span> <span class="n">RemotePythonError</span><span class="p">,</span> \
<span class="n">find_python_dll_to_inject</span><span class="p">,</span> <span class="n">get_dll_name_from_python_version</span><span class="p">,</span> <span class="n">inject_python_command</span><span class="p">,</span> <span class="n">load_dll_in_remote_process</span><span class="p">,</span> <span class="n">retrieve_exc</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Executable is: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">))</span>
<span class="n">CACHE_DIR</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">tempfile</span><span class="o">.</span><span class="n">gettempdir</span><span class="p">(),</span> <span class="s1">&#39;pfw_dllcache&#39;</span><span class="p">)</span>
<span class="n">INTERPRETER_DIR</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">dirname</span><span class="p">(</span><span class="n">find_python_dll_to_inject</span><span class="p">(</span><span class="mi">64</span><span class="p">))</span> <span class="c1"># Tailor bitness to your needs</span>
<span class="k">def</span> <span class="nf">mspython_acl_workaround</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">pydll_path</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Works around mspython ACL restrictions on mspython interpreters</span>
<span class="sd"> by copying the critical DLLs to a TEMP dir and orienting the interpreter</span>
<span class="sd"> against that TEMP dir.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</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">CACHE_DIR</span><span class="p">):</span>
<span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">CACHE_DIR</span><span class="p">)</span>
<span class="k">for</span> <span class="n">dll</span> <span class="ow">in</span> <span class="p">[</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">INTERPRETER_DIR</span><span class="p">,</span> <span class="s1">&#39;vcruntime140.dll&#39;</span><span class="p">),</span> <span class="n">pydll_path</span><span class="p">]:</span>
<span class="n">cache_dll_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">CACHE_DIR</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">dll</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Creates a copy of the DLL without bringing over restrictive ACLs</span>
<span class="n">shutil</span><span class="o">.</span><span class="n">copyfile</span><span class="p">(</span><span class="n">dll</span><span class="p">,</span> <span class="n">cache_dll_path</span><span class="p">)</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="c1"># If its not writeable good chance these DLLs are just already loaded somewhere</span>
<span class="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="c1"># Preloading python DLL and vcruntime so they don&#39;t get loaded from the path tree with restrictive ACLs</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Injecting: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cache_dll_path</span><span class="p">))</span>
<span class="n">load_dll_in_remote_process</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">cache_dll_path</span><span class="p">)</span>
<span class="k">for</span> <span class="n">dll</span> <span class="ow">in</span> <span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</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">INTERPRETER_DIR</span><span class="p">,</span> <span class="s1">&#39;dlls&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">)):</span>
<span class="n">cache_dll_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">CACHE_DIR</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">dll</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Dynamic lib DLLs with restrictive ACLs copied to unrestricted parent</span>
<span class="n">shutil</span><span class="o">.</span><span class="n">copyfile</span><span class="p">(</span><span class="n">dll</span><span class="p">,</span> <span class="n">cache_dll_path</span><span class="p">)</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="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="n">target</span><span class="o">.</span><span class="n">_workaround_applied</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1"># Adapted from windows\winobject\process.py</span>
<span class="k">def</span> <span class="nf">execute_python_code</span><span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="n">code</span><span class="p">):</span>
<span class="n">py_dll_name</span> <span class="o">=</span> <span class="n">get_dll_name_from_python_version</span><span class="p">()</span>
<span class="n">pydll_path</span> <span class="o">=</span> <span class="n">find_python_dll_to_inject</span><span class="p">(</span><span class="n">process</span><span class="o">.</span><span class="n">bitness</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="s2">&quot;_workaround_applied&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
<span class="n">mspython_acl_workaround</span><span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="n">pydll_path</span><span class="p">)</span>
<span class="n">shellcode</span><span class="p">,</span> <span class="n">pythoncode</span> <span class="o">=</span> <span class="n">inject_python_command</span><span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">py_dll_name</span><span class="p">)</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">process</span><span class="o">.</span><span class="n">create_thread</span><span class="p">(</span><span class="n">shellcode</span><span class="p">,</span> <span class="n">pythoncode</span><span class="p">)</span>
<span class="k">return</span> <span class="n">t</span>
<span class="k">def</span> <span class="nf">safe_execute_python</span><span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="n">code</span><span class="p">):</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">execute_python_code</span><span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="n">code</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span> <span class="c1"># Wait termination of the thread</span>
<span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">exit_code</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">exit_code</span> <span class="o">==</span> <span class="n">STATUS_THREAD_IS_TERMINATING</span> <span class="ow">or</span> <span class="n">process</span><span class="o">.</span><span class="n">is_exit</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">WindowsError</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{0}</span><span class="s2"> died during execution of python command&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">process</span><span class="p">))</span>
<span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">exit_code</span> <span class="o">!=</span> <span class="mh">0xffffffff</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unknown exit code </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">exit_code</span><span class="p">)))</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">retrieve_last_exception_data</span><span class="p">(</span><span class="n">process</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">RemotePythonError</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="c1"># Adapted from windows\injection.py</span>
<span class="k">def</span> <span class="nf">retrieve_last_exception_data</span><span class="p">(</span><span class="n">process</span><span class="p">):</span>
<span class="k">with</span> <span class="n">process</span><span class="o">.</span><span class="n">allocated_memory</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">)</span> <span class="k">as</span> <span class="n">mem</span><span class="p">:</span>
<span class="n">execute_python_code</span><span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="n">retrieve_exc</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">mem</span><span class="p">))</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="n">size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s2">&quot;&lt;I&quot;</span><span class="p">,</span> <span class="n">process</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="n">mem</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">c_uint</span><span class="p">)))[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">process</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="n">mem</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">ctypes</span><span class="o">.</span><span class="n">c_uint</span><span class="p">),</span> <span class="n">size</span><span class="p">)</span>
<span class="k">return</span> <span class="n">data</span>
<span class="c1"># First: show what happen when injecting mspython normally</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Trying normal execute_python()&quot;</span><span class="p">)</span>
<span class="n">proc1</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">create_process</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;C:\Windows\system32\winver.exe&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">proc1</span><span class="o">.</span><span class="n">execute_python</span><span class="p">(</span><span class="s2">&quot;2 + 2 == 5&quot;</span><span class="p">)</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="nb">print</span><span class="p">(</span><span class="s2">&quot; Exception during proc1.execute_python():&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">e</span><span class="p">)))</span>
<span class="n">proc1</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Trying mspython workaround:&quot;</span><span class="p">)</span>
<span class="n">proc_info</span> <span class="o">=</span> <span class="n">PROCESS_INFORMATION</span><span class="p">()</span>
<span class="n">StartupInfo</span> <span class="o">=</span> <span class="n">STARTUPINFOW</span><span class="p">()</span>
<span class="n">StartupInfo</span><span class="o">.</span><span class="n">cb</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">StartupInfo</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">CreateProcessW</span><span class="p">(</span>
<span class="sa">r</span><span class="s2">&quot;C:\Windows\system32\winver.exe&quot;</span><span class="p">,</span>
<span class="n">dwCreationFlags</span><span class="o">=</span><span class="n">CREATE_SUSPENDED</span><span class="p">,</span>
<span class="c1"># Point PYTHONHOME to the interpreter dir so non-DLL libs can load</span>
<span class="c1"># Point PYTHONPATH to the newly created cache directory so DLL libs are loaded from there</span>
<span class="n">lpEnvironment</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{}</span><span class="s1">=</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">items</span><span class="p">())</span> <span class="o">+</span> \
<span class="s1">&#39;</span><span class="se">\0</span><span class="s1">PYTHONHOME=</span><span class="si">{}</span><span class="se">\0</span><span class="s1">PYTHONPATH=</span><span class="si">{}</span><span class="se">\0\0</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">INTERPRETER_DIR</span><span class="p">,</span> <span class="n">CACHE_DIR</span><span class="p">))</span><span class="o">.</span><span class="n">encode</span><span class="p">(),</span>
<span class="n">lpProcessInformation</span><span class="o">=</span><span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">proc_info</span><span class="p">),</span>
<span class="n">lpStartupInfo</span><span class="o">=</span><span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">StartupInfo</span><span class="p">))</span>
<span class="n">process</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">winobject</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">WinProcess</span><span class="p">(</span><span class="n">pid</span><span class="o">=</span><span class="n">proc_info</span><span class="o">.</span><span class="n">dwProcessId</span><span class="p">,</span> <span class="n">handle</span><span class="o">=</span><span class="n">proc_info</span><span class="o">.</span><span class="n">hProcess</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; Executing python code!&quot;</span><span class="p">)</span>
<span class="n">safe_execute_python</span><span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">import windows</span>
<span class="s2">windows.utils.create_console()</span>
<span class="s2">print(&#39;hello from inside the suspended process!&#39;, flush=True)</span>
<span class="s2">&quot;&quot;&quot;</span><span class="p">)</span>
<span class="n">process</span><span class="o">.</span><span class="n">threads</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">resume</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; Executing more python code!&quot;</span><span class="p">)</span>
<span class="n">safe_execute_python</span><span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">print(&#39;hello from inside the resumed process!&#39;, flush=True)</span>
<span class="s2">&quot;&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; Executing an error python code!&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">safe_execute_python</span><span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="s2">&quot;&quot;&quot;BAD_VARIABLE&quot;&quot;&quot;</span><span class="p">)</span>
<span class="k">except</span> <span class="n">RemotePythonError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; Expected error during safe_execute_python&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; Sleeping a little&quot;</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; Killing target process !&quot;</span><span class="p">)</span>
<span class="n">process</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>PS C:\Users\hakril\PythonForWindows&gt; py .\samples\process\msstore_interpreter_remote_python.py
Executable is: C:\Users\hakril\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\python.exe
Trying normal execute_python()
Exception during proc1.execute_python():
InjectionFailedError(&#39;Injection of &lt;c:\\program files\\windowsapps\\pythonsoftwarefoundation.python.3.13_3.13.496.0_x64__qbz5n2kfra8p0\\vcruntime140.dll&gt; failed&#39;)
Trying mspython workaround:
Executing python code!
Injecting: C:\Users\hakril\AppData\Local\Temp\pfw_dllcache\vcruntime140.dll
Injecting: C:\Users\hakril\AppData\Local\Temp\pfw_dllcache\python313.dll
Executing more python code!
Executing an error python code!
Expected error during safe_execute_python
b&#39;Traceback (most recent call last):\n File &quot;&lt;string&gt;&quot;, line 1, in &lt;module&gt;\nNameError: name \&#39;BAD_VARIABLE\&#39; is not defined\n&#39;
Sleeping a little
Killing target process !
</pre></div>
</div>
</section>
</section>
<section id="token">
<h2><span class="section-number">18.2. </span>Token<a class="headerlink" href="#token" title="Link to this heading"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></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="n">tok</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">token</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Our process token is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tok</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Retrieving some infos&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Username: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tok</span><span class="o">.</span><span class="n">username</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;User: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tok</span><span class="o">.</span><span class="n">user</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - lookup : </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">lookup_sid</span><span class="p">(</span><span class="n">tok</span><span class="o">.</span><span class="n">user</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Primary group: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tok</span><span class="o">.</span><span class="n">primary_group</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - lookup : </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">lookup_sid</span><span class="p">(</span><span class="n">tok</span><span class="o">.</span><span class="n">primary_group</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">groups</span> <span class="o">=</span> <span class="n">tok</span><span class="o">.</span><span class="n">groups</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Token Groups is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">groups</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;First group SID is </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">groups</span><span class="o">.</span><span class="n">sids</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Some sid and attributes:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">group</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">),</span> <span class="n">groups</span><span class="o">.</span><span class="n">sids_and_attributes</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - </span><span class="si">{0}</span><span class="s2">: </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">group</span><span class="o">.</span><span class="n">Sid</span><span class="p">,</span> <span class="n">group</span><span class="o">.</span><span class="n">Attributes</span><span class="p">))</span>
<span class="c1"># Let&#39;s play with duplicate !</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">imp_tok</span> <span class="o">=</span> <span class="n">tok</span><span class="o">.</span><span class="n">duplicate</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">TokenImpersonation</span><span class="p">,</span> <span class="n">impersonation_level</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">SecurityImpersonation</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Duplicate token is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">imp_tok</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Enabling &lt;SeShutDownPrivilege&gt;&quot;</span><span class="p">)</span>
<span class="n">imp_tok</span><span class="o">.</span><span class="n">enable_privilege</span><span class="p">(</span><span class="s2">&quot;SeShutDownPrivilege&quot;</span><span class="p">)</span>
<span class="n">cur_thread</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_thread</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Current thread token is &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cur_thread</span><span class="o">.</span><span class="n">token</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Setting impersonation token !&quot;</span><span class="p">)</span>
<span class="n">cur_thread</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="n">imp_tok</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Current thread token is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cur_thread</span><span class="o">.</span><span class="n">token</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python token\token_demo.py
Our process token is &lt;Token TokenId=0x3f1f98fd Type=TokenPrimary(0x1L)&gt;
Retrieving some infos
Username: &lt;hakril&gt;
User: &lt;PSID &quot;S-1-5-21-184905214-2723199098-2761450773-1001&quot;&gt;
- lookup : (&#39;WILLIE&#39;, &#39;hakril&#39;)
Primary group: &lt;PSID &quot;S-1-5-21-184905214-2723199098-2761450773-513&quot;&gt;
- lookup : (&#39;WILLIE&#39;, &#39;Aucun&#39;)
Token Groups is &lt;TokenGroups count=15&gt;
First group SID is &lt;PSID &quot;S-1-5-21-184905214-2723199098-2761450773-513&quot;&gt;
Some sid and attributes:
- S-1-5-21-184905214-2723199098-2761450773-513: 7
- S-1-1-0: 7
- S-1-5-114: 16
Duplicate token is &lt;Token TokenId=0x3f1fac85 Type=TokenImpersonation(0x2L) ImpersonationLevel=SecurityImpersonation(0x2L)&gt;
Enabling &lt;SeShutDownPrivilege&gt;
Current thread token is &lt;None&gt;
Setting impersonation token !
Current thread token is &lt;Token TokenId=0x3f1fac85 Type=TokenImpersonation(0x2L) ImpersonationLevel=SecurityImpersonation(0x2L)&gt;
</pre></div>
</div>
</section>
<section id="windows-system">
<span id="sample-system"></span><h2><span class="section-number">18.3. </span><code class="docutils literal notranslate"><span class="pre">windows.system</span></code><a class="headerlink" href="#windows-system" title="Link to this heading"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="n">system</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Basic system infos:&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; version = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">version</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; bitness = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">bitness</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; computer_name = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">computer_name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; product_type = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">product_type</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; version_name = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">version_name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;There is </span><span class="si">{0}</span><span class="s2"> processes&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">processes</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;There is </span><span class="si">{0}</span><span class="s2"> threads&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">threads</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Dumping first logical drive:&quot;</span><span class="p">)</span>
<span class="n">drive</span> <span class="o">=</span> <span class="n">system</span><span class="o">.</span><span class="n">logicaldrives</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">drive</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;name = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">drive</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;type = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">drive</span><span class="o">.</span><span class="n">type</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;path = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">drive</span><span class="o">.</span><span class="n">path</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Dumping first service:&quot;</span><span class="p">)</span>
<span class="n">serv</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">services</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">serv</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;name = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">serv</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;description = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">serv</span><span class="o">.</span><span class="n">description</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;status = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">serv</span><span class="o">.</span><span class="n">status</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;process = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">serv</span><span class="o">.</span><span class="n">process</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Finding a service in a user process:&quot;</span><span class="p">)</span>
<span class="n">serv</span> <span class="o">=</span> <span class="p">[</span><span class="n">s</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">services</span> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">process</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">serv</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;name = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">serv</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;description = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">serv</span><span class="o">.</span><span class="n">description</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;status = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">serv</span><span class="o">.</span><span class="n">status</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;process = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">serv</span><span class="o">.</span><span class="n">process</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Enumerating handles:&quot;</span><span class="p">)</span>
<span class="n">handles</span> <span class="o">=</span> <span class="n">system</span><span class="o">.</span><span class="n">handles</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; There are </span><span class="si">{0}</span><span class="s2"> handles:&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">handles</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; First handle is: &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">handles</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; Enumerating handles of the current process:&quot;</span><span class="p">)</span>
<span class="n">cp_handles</span> <span class="o">=</span> <span class="p">[</span><span class="n">h</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">system</span><span class="o">.</span><span class="n">handles</span> <span class="k">if</span> <span class="n">h</span><span class="o">.</span><span class="n">dwProcessId</span> <span class="o">==</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">pid</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; There are </span><span class="si">{0}</span><span class="s2"> handles for this process&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">cp_handles</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; Looking for a File handle:&quot;</span><span class="p">)</span>
<span class="n">file_h</span> <span class="o">=</span> <span class="p">[</span><span class="n">h</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">cp_handles</span> <span class="k">if</span> <span class="n">h</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="s2">&quot;File&quot;</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; Handle is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">file_h</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; Name is &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">file_h</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Dumping the first system module&quot;</span><span class="p">)</span>
<span class="n">kmod</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">modules</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">kmod</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;ImageName = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">kmod</span><span class="o">.</span><span class="n">ImageName</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;Base = </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">kmod</span><span class="o">.</span><span class="n">Base</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;Size = </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">kmod</span><span class="o">.</span><span class="n">Size</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;Flags = </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">kmod</span><span class="o">.</span><span class="n">Flags</span><span class="p">))</span>
<span class="nb">print</span><span class="p">((</span><span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;LoadCount = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">kmod</span><span class="o">.</span><span class="n">LoadCount</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">system</span><span class="o">.</span><span class="n">py</span>
<span class="n">Basic</span> <span class="n">system</span> <span class="n">infos</span><span class="p">:</span>
<span class="n">version</span> <span class="o">=</span> <span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">bitness</span> <span class="o">=</span> <span class="mi">64</span>
<span class="n">computer_name</span> <span class="o">=</span> <span class="n">WILLIE</span>
<span class="n">product_type</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">version_name</span> <span class="o">=</span> <span class="n">Windows</span> <span class="mi">10</span>
<span class="n">There</span> <span class="ow">is</span> <span class="mi">331</span> <span class="n">processes</span>
<span class="n">There</span> <span class="ow">is</span> <span class="mi">4010</span> <span class="n">threads</span>
<span class="n">Dumping</span> <span class="n">first</span> <span class="n">logical</span> <span class="n">drive</span><span class="p">:</span>
<span class="o">&lt;</span><span class="n">LogicalDrive</span> <span class="s2">&quot;B:</span><span class="se">\&quot;</span><span class="s2"> (DRIVE_FIXED)&gt;</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">B</span><span class="p">:</span>\
<span class="nb">type</span> <span class="o">=</span> <span class="mi">3</span>
<span class="n">path</span> <span class="o">=</span> \<span class="n">Device</span>\<span class="n">HarddiskVolume7</span>
<span class="n">Dumping</span> <span class="n">first</span> <span class="n">service</span><span class="p">:</span>
<span class="o">&lt;</span><span class="n">Service</span> <span class="s2">&quot;1394ohci&quot;</span> <span class="n">SERVICE_STOPPED</span><span class="p">(</span><span class="mh">0x1</span><span class="p">)</span><span class="o">&gt;</span>
<span class="n">name</span> <span class="o">=</span> <span class="mi">1394</span><span class="n">ohci</span>
<span class="n">description</span> <span class="o">=</span> <span class="mi">1394</span> <span class="n">OHCI</span> <span class="n">Compliant</span> <span class="n">Host</span> <span class="n">Controller</span>
<span class="n">status</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">_SERVICE_STATUS_PROCESS</span> <span class="nb">type</span><span class="o">=</span><span class="n">SERVICE_KERNEL_DRIVER</span><span class="p">(</span><span class="mh">0x1</span><span class="p">)</span> <span class="n">state</span><span class="o">=</span><span class="n">SERVICE_STOPPED</span><span class="p">(</span><span class="mh">0x1</span><span class="p">)</span><span class="o">&gt;</span>
<span class="n">process</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">Finding</span> <span class="n">a</span> <span class="n">service</span> <span class="ow">in</span> <span class="n">a</span> <span class="n">user</span> <span class="n">process</span><span class="p">:</span>
<span class="o">&lt;</span><span class="n">Service</span> <span class="s2">&quot;AppIDSvc&quot;</span> <span class="n">SERVICE_RUNNING</span><span class="p">(</span><span class="mh">0x4</span><span class="p">)</span><span class="o">&gt;</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">AppIDSvc</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">Application</span> <span class="n">Identity</span>
<span class="n">status</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">_SERVICE_STATUS_PROCESS</span> <span class="nb">type</span><span class="o">=</span><span class="mi">48</span><span class="n">L</span> <span class="n">state</span><span class="o">=</span><span class="n">SERVICE_RUNNING</span><span class="p">(</span><span class="mh">0x4</span><span class="p">)</span><span class="o">&gt;</span>
<span class="n">process</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">WinProcess</span> <span class="s2">&quot;!cannot-retrieve-name&quot;</span> <span class="n">pid</span> <span class="mi">6060</span> <span class="n">at</span> <span class="mh">0x35851d0</span><span class="o">&gt;</span>
<span class="n">Enumerating</span> <span class="n">handles</span><span class="p">:</span>
<span class="n">There</span> <span class="n">are</span> <span class="mi">208332</span> <span class="n">handles</span><span class="p">:</span>
<span class="n">First</span> <span class="n">handle</span> <span class="ow">is</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">HandleWow64</span> <span class="n">value</span><span class="o">=&lt;</span><span class="mh">0x4</span><span class="o">&gt;</span> <span class="ow">in</span> <span class="n">process</span> <span class="n">pid</span><span class="o">=</span><span class="mi">4</span><span class="o">&gt;</span>
<span class="n">Enumerating</span> <span class="n">handles</span> <span class="n">of</span> <span class="n">the</span> <span class="n">current</span> <span class="n">process</span><span class="p">:</span>
<span class="n">There</span> <span class="n">are</span> <span class="mi">275</span> <span class="n">handles</span> <span class="k">for</span> <span class="n">this</span> <span class="n">process</span>
<span class="n">Looking</span> <span class="k">for</span> <span class="n">a</span> <span class="n">File</span> <span class="n">handle</span><span class="p">:</span>
<span class="n">Handle</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">HandleWow64</span> <span class="n">value</span><span class="o">=&lt;</span><span class="mh">0x4</span><span class="o">&gt;</span> <span class="ow">in</span> <span class="n">process</span> <span class="n">pid</span><span class="o">=</span><span class="mi">15236</span><span class="o">&gt;</span>
<span class="n">Name</span> <span class="ow">is</span> <span class="o">&lt;</span>\<span class="n">Device</span>\<span class="n">ConDrv</span><span class="o">&gt;</span>
<span class="n">Dumping</span> <span class="n">the</span> <span class="n">first</span> <span class="n">system</span> <span class="n">module</span>
<span class="o">&lt;</span><span class="n">SystemModuleWow64</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;\SystemRoot\system32</span><span class="se">\n</span><span class="s2">toskrnl.exe&quot;</span> <span class="n">base</span><span class="o">=</span><span class="mh">0xfffff80023000000</span><span class="o">&gt;</span>
<span class="n">ImageName</span> <span class="o">=</span> \<span class="n">SystemRoot</span>\<span class="n">system32</span>\<span class="n">ntoskrnl</span><span class="o">.</span><span class="n">exe</span>
<span class="n">Base</span> <span class="o">=</span> <span class="mh">0xfffff80023000000</span>
<span class="n">Size</span> <span class="o">=</span> <span class="mh">0xab7000</span>
<span class="n">Flags</span> <span class="o">=</span> <span class="mh">0x8804000</span>
<span class="n">LoadCount</span> <span class="o">=</span> <span class="mi">240</span>
</pre></div>
</div>
</section>
<section id="services">
<span id="sample-services-demo"></span><h2><span class="section-number">18.4. </span>Services<a class="headerlink" href="#services" title="Link to this heading"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></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="nb">print</span><span class="p">(</span><span class="s2">&quot;Listing the first 3 services:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">service</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">services</span><span class="p">[:</span><span class="mi">3</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">service</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">TARGET_SERVICE</span> <span class="o">=</span> <span class="s2">&quot;TapiSrv&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Retriving service &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">TARGET_SERVICE</span><span class="p">))</span>
<span class="n">service</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">services</span><span class="p">[</span><span class="n">TARGET_SERVICE</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">service</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - name: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">service</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - description: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">service</span><span class="o">.</span><span class="n">description</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - state: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">service</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">state</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - type: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">service</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">type</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - process: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">service</span><span class="o">.</span><span class="n">process</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - security-description: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">service</span><span class="o">.</span><span class="n">security_descriptor</span><span class="p">))</span>
<span class="k">if</span> <span class="n">service</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">state</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_RUNNING</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Service already running, not trying to start it&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Trying to start the service&quot;</span><span class="p">)</span>
<span class="n">service</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="k">while</span> <span class="n">service</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">state</span> <span class="o">!=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_RUNNING</span><span class="p">:</span>
<span class="k">pass</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Service started !&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">service</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - state: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">service</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">state</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - process: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">service</span><span class="o">.</span><span class="n">process</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python service\service_demo.py
Listing the first 3 services:
* &lt;Service &quot;1394ohci&quot; SERVICE_STOPPED(0x1)&gt;
* &lt;Service &quot;3ware&quot; SERVICE_STOPPED(0x1)&gt;
* &lt;Service &quot;ACPI&quot; SERVICE_RUNNING(0x4)&gt;
Retriving service &lt;TapiSrv&gt;
&lt;Service &quot;TapiSrv&quot; SERVICE_STOPPED(0x1)&gt;
- name: &#39;TapiSrv&#39;
- description: &#39;Telephony&#39;
- state: SERVICE_STOPPED(0x1)
- type: 48L
- process: None
- security-description: O:SYG:SYD:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWRPLOCRRC;;;IU)(A;;CCLCSWRPLOCRRC;;;SU)
Trying to start the service
Service started !
&lt;Service &quot;TapiSrv&quot; SERVICE_RUNNING(0x4)&gt;
- state: SERVICE_RUNNING(0x4)
- process: &lt;WinProcess &quot;!cannot-retrieve-name&quot; pid 14700 at 0x4a2c4f0&gt;
</pre></div>
</div>
<section id="windows-service-in-python">
<h3><span class="section-number">18.4.1. </span>Windows Service in Python<a class="headerlink" href="#windows-service-in-python" title="Link to this heading"></a></h3>
<p>This script can register itself as a service and act on <cite>stop</cite> request.
It also can delete its own service.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># A python script able to install itself as a service</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">argparse</span>
<span class="kn">import</span> <span class="nn">datetime</span>
<span class="kn">import</span> <span class="nn">ctypes</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="n">SERVICE_NAME</span> <span class="o">=</span> <span class="sa">u</span><span class="s2">&quot;PFW_SERVICE_DEMO&quot;</span>
<span class="n">SERVICE_DESCRIPTION</span> <span class="o">=</span> <span class="sa">u</span><span class="s2">&quot;PythonForWindows demo service&quot;</span>
<span class="n">SERVICE_LOGFILE</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">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="vm">__file__</span><span class="p">),</span> <span class="s2">&quot;pfw_service_logs.txt&quot;</span><span class="p">)</span>
<span class="n">SERVICE_HANDLE</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">install_demo_service</span><span class="p">():</span>
<span class="n">path</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{executable}</span><span class="s2"> </span><span class="si">{pyfile}</span><span class="s2"> --run&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">executable</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="n">pyfile</span><span class="o">=</span><span class="vm">__file__</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Registering service &lt;</span><span class="si">{0}</span><span class="s2">&gt; as : &lt;</span><span class="si">{1}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">SERVICE_NAME</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
<span class="n">newservice</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">services</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="n">SERVICE_NAME</span><span class="p">,</span>
<span class="n">description</span><span class="o">=</span><span class="n">SERVICE_DESCRIPTION</span><span class="p">,</span>
<span class="n">access</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_ALL_ACCESS</span><span class="p">,</span>
<span class="nb">type</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_WIN32_OWN_PROCESS</span><span class="p">,</span>
<span class="n">start</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_DEMAND_START</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">user</span><span class="o">=</span><span class="kc">None</span>
<span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">newservice</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">def</span> <span class="nf">uninstall_demo_service</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Deleting service&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">services</span><span class="p">[</span><span class="n">SERVICE_NAME</span><span class="p">]</span><span class="o">.</span><span class="n">delete</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">log</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">SERVICE_LOGFILE</span><span class="p">,</span> <span class="s2">&quot;a&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;[</span><span class="si">{time}</span><span class="s2">] </span><span class="si">{s}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">time</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(),</span> <span class="n">s</span><span class="o">=</span><span class="n">s</span><span class="p">))</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">DWORD</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="n">gdef</span><span class="o">.</span><span class="n">DWORD</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">PVOID</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">service_handlerex</span><span class="p">(</span><span class="n">dwControl</span><span class="p">,</span> <span class="n">dwEventType</span><span class="p">,</span> <span class="n">lpEventData</span><span class="p">,</span> <span class="n">lpContext</span><span class="p">):</span>
<span class="n">log</span><span class="p">(</span><span class="s2">&quot;in service_handlerex&quot;</span><span class="p">)</span>
<span class="n">log</span><span class="p">(</span><span class="s2">&quot;service_handlerex: called with </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">dwControl</span><span class="p">))</span>
<span class="k">if</span> <span class="n">dwControl</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_CONTROL_STOP</span><span class="p">:</span>
<span class="n">log</span><span class="p">(</span><span class="s2">&quot;Stopping the service&quot;</span><span class="p">)</span>
<span class="n">running_status</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_STATUS</span><span class="p">(</span>
<span class="n">dwServiceSpecificExitCode</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="n">dwServiceType</span> <span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_WIN32_OWN_PROCESS</span><span class="p">,</span>
<span class="n">dwCurrentState</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_STOPPED</span><span class="p">,</span>
<span class="n">dwWin32ExitCode</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">NO_ERROR</span><span class="p">,</span>
<span class="n">dwControlsAccepted</span><span class="o">=</span><span class="mi">0</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">SetServiceStatus</span><span class="p">(</span><span class="n">SERVICE_HANDLE</span><span class="p">,</span> <span class="n">running_status</span><span class="p">)</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="n">log</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
<span class="k">return</span> <span class="mi">0</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">PVOID</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="n">ctypes</span><span class="o">.</span><span class="n">POINTER</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="k">def</span> <span class="nf">service_main</span><span class="p">(</span><span class="n">dwNumServicesArgs</span><span class="p">,</span> <span class="n">lpServiceArgVectors</span><span class="p">):</span>
<span class="k">global</span> <span class="n">SERVICE_HANDLE</span>
<span class="n">log</span><span class="p">(</span><span class="s2">&quot;In service_main&quot;</span><span class="p">)</span>
<span class="n">log</span><span class="p">(</span><span class="s2">&quot;service_main: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">dwNumServicesArgs</span><span class="p">))</span>
<span class="n">log</span><span class="p">(</span><span class="s2">&quot;service_main: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lpServiceArgVectors</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">log</span><span class="p">(</span><span class="s2">&quot;Calling RegisterServiceCtrlHandlerExW&quot;</span><span class="p">)</span>
<span class="n">SERVICE_HANDLE</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">RegisterServiceCtrlHandlerExW</span><span class="p">(</span><span class="n">SERVICE_NAME</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">service_handlerex</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="kc">None</span><span class="p">)</span>
<span class="n">log</span><span class="p">(</span><span class="s2">&quot;RegisterServiceCtrlHandlerExW handle: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">SERVICE_HANDLE</span><span class="p">))</span>
<span class="n">running_status</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_STATUS</span><span class="p">(</span>
<span class="n">dwServiceSpecificExitCode</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="n">dwServiceType</span> <span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_WIN32_OWN_PROCESS</span><span class="p">,</span>
<span class="n">dwCurrentState</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_RUNNING</span><span class="p">,</span>
<span class="n">dwWin32ExitCode</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">NO_ERROR</span><span class="p">,</span>
<span class="n">dwControlsAccepted</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_ACCEPT_STOP</span> <span class="o">|</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_ACCEPT_PAUSE_CONTINUE</span>
<span class="p">)</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">SetServiceStatus</span><span class="p">(</span><span class="n">SERVICE_HANDLE</span><span class="p">,</span> <span class="n">running_status</span><span class="p">)</span>
<span class="n">log</span><span class="p">(</span><span class="s2">&quot;Service is running : </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">res</span><span class="p">))</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="n">log</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
<span class="k">raise</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">run_demo_service</span><span class="p">():</span>
<span class="n">log</span><span class="p">(</span><span class="s2">&quot;start of run_demo_service()&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">SERVICE_TABLE</span> <span class="o">=</span> <span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_TABLE_ENTRYW</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)(</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_TABLE_ENTRYW</span><span class="p">(</span><span class="n">SERVICE_NAME</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">service_main</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">SERVICE_TABLE_ENTRYW</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
<span class="p">)</span>
<span class="n">log</span><span class="p">(</span><span class="s2">&quot;Calling: StartServiceCtrlDispatcherW()&quot;</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">StartServiceCtrlDispatcherW</span><span class="p">(</span><span class="n">SERVICE_TABLE</span><span class="p">)</span>
<span class="n">log</span><span class="p">(</span><span class="s2">&quot;StartServiceCtrlDispatcherW returned: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">result</span><span class="p">))</span>
<span class="n">log</span><span class="p">(</span><span class="s2">&quot;Quitting&quot;</span><span class="p">)</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="n">log</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
<span class="k">raise</span>
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="vm">__file__</span><span class="p">,</span> <span class="n">formatter_class</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentDefaultsHelpFormatter</span><span class="p">)</span>
<span class="n">group</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_mutually_exclusive_group</span><span class="p">(</span><span class="n">required</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">group</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--install&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store_true&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Install the service in registry&quot;</span><span class="p">)</span>
<span class="n">group</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--uninstall&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store_true&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;UnInstall the service in registry&quot;</span><span class="p">)</span>
<span class="n">group</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--run&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store_true&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Called by the services.exe to run the service&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
<span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
<span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">install</span><span class="p">:</span>
<span class="n">install_demo_service</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">args</span><span class="o">.</span><span class="n">uninstall</span><span class="p">:</span>
<span class="n">uninstall_demo_service</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">args</span><span class="o">.</span><span class="n">run</span><span class="p">:</span>
<span class="n">log</span><span class="p">(</span><span class="s2">&quot;calling run_demo_service()&quot;</span><span class="p">)</span>
<span class="n">log</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
<span class="n">run_demo_service</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unknown argument&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="o">-</span><span class="n">admin</span><span class="p">)</span> <span class="n">sc</span><span class="o">.</span><span class="n">exe</span> <span class="n">query</span> <span class="n">PFW_SERVICE_DEMO</span>
<span class="p">[</span><span class="n">SC</span><span class="p">]</span> <span class="n">EnumQueryServicesStatus</span><span class="p">:</span><span class="n">OpenService</span> <span class="n">FAILED</span> <span class="mi">1060</span><span class="p">:</span>
<span class="n">The</span> <span class="n">specified</span> <span class="n">service</span> <span class="n">does</span> <span class="ow">not</span> <span class="n">exist</span> <span class="k">as</span> <span class="n">an</span> <span class="n">installed</span> <span class="n">service</span><span class="o">.</span>
<span class="p">(</span><span class="n">cmd</span><span class="o">-</span><span class="n">admin</span><span class="p">)</span> <span class="n">py</span> <span class="o">.</span>\<span class="n">service</span>\<span class="n">python_service</span><span class="o">.</span><span class="n">py</span> <span class="o">--</span><span class="n">install</span>
<span class="n">Registering</span> <span class="n">service</span> <span class="o">&lt;</span><span class="n">PFW_SERVICE_DEMO</span><span class="o">&gt;</span> <span class="k">as</span> <span class="p">:</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">Users</span>\<span class="n">cleme</span>\<span class="n">AppData</span>\<span class="n">Local</span>\<span class="n">Programs</span>\<span class="n">Python</span>\<span class="n">Python311</span>\<span class="n">python</span><span class="o">.</span><span class="n">exe</span> <span class="n">C</span><span class="p">:</span>\<span class="n">Users</span>\<span class="n">cleme</span>\<span class="n">Documents</span>\<span class="n">projets</span>\<span class="n">PythonForWindows</span>\<span class="n">samples</span>\<span class="n">service</span>\<span class="n">python_service</span><span class="o">.</span><span class="n">py</span> <span class="o">--</span><span class="n">run</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="n">Service</span> <span class="s2">&quot;PFW_SERVICE_DEMO&quot;</span> <span class="n">SERVICE_STOPPED</span><span class="p">(</span><span class="mh">0x1</span><span class="p">)</span><span class="o">&gt;</span>
<span class="p">(</span><span class="n">cmd</span><span class="o">-</span><span class="n">admin</span><span class="p">)</span> <span class="n">sc</span><span class="o">.</span><span class="n">exe</span> <span class="n">start</span> <span class="n">PFW_SERVICE_DEMO</span>
<span class="n">SERVICE_NAME</span><span class="p">:</span> <span class="n">PFW_SERVICE_DEMO</span>
<span class="n">TYPE</span> <span class="p">:</span> <span class="mi">10</span> <span class="n">WIN32_OWN_PROCESS</span>
<span class="n">STATE</span> <span class="p">:</span> <span class="mi">2</span> <span class="n">START_PENDING</span>
<span class="p">(</span><span class="n">NOT_STOPPABLE</span><span class="p">,</span> <span class="n">NOT_PAUSABLE</span><span class="p">,</span> <span class="n">IGNORES_SHUTDOWN</span><span class="p">)</span>
<span class="n">WIN32_EXIT_CODE</span> <span class="p">:</span> <span class="mi">0</span> <span class="p">(</span><span class="mh">0x0</span><span class="p">)</span>
<span class="n">SERVICE_EXIT_CODE</span> <span class="p">:</span> <span class="mi">0</span> <span class="p">(</span><span class="mh">0x0</span><span class="p">)</span>
<span class="n">CHECKPOINT</span> <span class="p">:</span> <span class="mh">0x0</span>
<span class="n">WAIT_HINT</span> <span class="p">:</span> <span class="mh">0x7d0</span>
<span class="n">PID</span> <span class="p">:</span> <span class="mi">21132</span>
<span class="n">FLAGS</span> <span class="p">:</span>
<span class="p">(</span><span class="n">cmd</span><span class="o">-</span><span class="n">admin</span><span class="p">)</span> <span class="n">sc</span><span class="o">.</span><span class="n">exe</span> <span class="n">query</span> <span class="n">PFW_SERVICE_DEMO</span>
<span class="n">SERVICE_NAME</span><span class="p">:</span> <span class="n">PFW_SERVICE_DEMO</span>
<span class="n">TYPE</span> <span class="p">:</span> <span class="mi">10</span> <span class="n">WIN32_OWN_PROCESS</span>
<span class="n">STATE</span> <span class="p">:</span> <span class="mi">4</span> <span class="n">RUNNING</span>
<span class="p">(</span><span class="n">STOPPABLE</span><span class="p">,</span> <span class="n">PAUSABLE</span><span class="p">,</span> <span class="n">IGNORES_SHUTDOWN</span><span class="p">)</span>
<span class="n">WIN32_EXIT_CODE</span> <span class="p">:</span> <span class="mi">0</span> <span class="p">(</span><span class="mh">0x0</span><span class="p">)</span>
<span class="n">SERVICE_EXIT_CODE</span> <span class="p">:</span> <span class="mi">0</span> <span class="p">(</span><span class="mh">0x0</span><span class="p">)</span>
<span class="n">CHECKPOINT</span> <span class="p">:</span> <span class="mh">0x0</span>
<span class="n">WAIT_HINT</span> <span class="p">:</span> <span class="mh">0x0</span>
<span class="p">(</span><span class="n">cmd</span><span class="o">-</span><span class="n">admin</span><span class="p">)</span> <span class="n">cat</span> <span class="o">.</span>\<span class="n">service</span>\<span class="n">pfw_service_logs</span><span class="o">.</span><span class="n">txt</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">36.033158</span><span class="p">]</span> <span class="n">calling</span> <span class="n">run_demo_service</span><span class="p">()</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">36.033158</span><span class="p">]</span> <span class="p">[</span><span class="s1">&#39;C:</span><span class="se">\\</span><span class="s1">Users</span><span class="se">\\</span><span class="s1">XXX</span><span class="se">\\</span><span class="s1">PythonForWindows</span><span class="se">\\</span><span class="s1">samples</span><span class="se">\\</span><span class="s1">service</span><span class="se">\\</span><span class="s1">python_service.py&#39;</span><span class="p">,</span> <span class="s1">&#39;--run&#39;</span><span class="p">]</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">36.033158</span><span class="p">]</span> <span class="n">start</span> <span class="n">of</span> <span class="n">run_demo_service</span><span class="p">()</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">36.033158</span><span class="p">]</span> <span class="n">Calling</span><span class="p">:</span> <span class="n">StartServiceCtrlDispatcherW</span><span class="p">()</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">36.033158</span><span class="p">]</span> <span class="n">In</span> <span class="n">service_main</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">36.033158</span><span class="p">]</span> <span class="n">service_main</span><span class="p">:</span> <span class="mi">1</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">36.033158</span><span class="p">]</span> <span class="n">service_main</span><span class="p">:</span> <span class="n">PFW_SERVICE_DEMO</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">36.033158</span><span class="p">]</span> <span class="n">Calling</span> <span class="n">RegisterServiceCtrlHandlerExW</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">36.033158</span><span class="p">]</span> <span class="n">RegisterServiceCtrlHandlerExW</span> <span class="n">handle</span><span class="p">:</span> <span class="mi">2591650953424</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">36.038274</span><span class="p">]</span> <span class="n">Service</span> <span class="ow">is</span> <span class="n">running</span> <span class="p">:</span> <span class="mi">1</span>
<span class="p">(</span><span class="n">cmd</span><span class="o">-</span><span class="n">admin</span><span class="p">)</span> <span class="n">sc</span><span class="o">.</span><span class="n">exe</span> <span class="n">stop</span> <span class="n">PFW_SERVICE_DEMO</span>
<span class="n">SERVICE_NAME</span><span class="p">:</span> <span class="n">PFW_SERVICE_DEMO</span>
<span class="n">TYPE</span> <span class="p">:</span> <span class="mi">10</span> <span class="n">WIN32_OWN_PROCESS</span>
<span class="n">STATE</span> <span class="p">:</span> <span class="mi">1</span> <span class="n">STOPPED</span>
<span class="n">WIN32_EXIT_CODE</span> <span class="p">:</span> <span class="mi">0</span> <span class="p">(</span><span class="mh">0x0</span><span class="p">)</span>
<span class="n">SERVICE_EXIT_CODE</span> <span class="p">:</span> <span class="mi">0</span> <span class="p">(</span><span class="mh">0x0</span><span class="p">)</span>
<span class="n">CHECKPOINT</span> <span class="p">:</span> <span class="mh">0x0</span>
<span class="n">WAIT_HINT</span> <span class="p">:</span> <span class="mh">0x0</span>
<span class="p">(</span><span class="n">cmd</span><span class="o">-</span><span class="n">admin</span><span class="p">)</span> <span class="n">cat</span> <span class="o">.</span>\<span class="n">service</span>\<span class="n">pfw_service_logs</span><span class="o">.</span><span class="n">txt</span>
<span class="p">[</span><span class="o">...</span><span class="p">]</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">36.038274</span><span class="p">]</span> <span class="n">Service</span> <span class="ow">is</span> <span class="n">running</span> <span class="p">:</span> <span class="mi">1</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">53.422375</span><span class="p">]</span> <span class="ow">in</span> <span class="n">service_handlerex</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">53.422375</span><span class="p">]</span> <span class="n">service_handlerex</span><span class="p">:</span> <span class="n">called</span> <span class="k">with</span> <span class="mi">1</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">53.432530</span><span class="p">]</span> <span class="n">Stopping</span> <span class="n">the</span> <span class="n">service</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">53.433035</span><span class="p">]</span> <span class="n">StartServiceCtrlDispatcherW</span> <span class="n">returned</span><span class="p">:</span> <span class="mi">1</span>
<span class="p">[</span><span class="mi">2024</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">10</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">53.433035</span><span class="p">]</span> <span class="n">Quitting</span>
<span class="p">(</span><span class="n">cmd</span><span class="o">-</span><span class="n">admin</span><span class="p">)</span> <span class="n">py</span> <span class="o">.</span>\<span class="n">service</span>\<span class="n">python_service</span><span class="o">.</span><span class="n">py</span> <span class="o">--</span><span class="n">uninstall</span>
<span class="n">Deleting</span> <span class="n">service</span>
<span class="mi">1</span>
<span class="p">(</span><span class="n">cmd</span><span class="o">-</span><span class="n">admin</span><span class="p">)</span> <span class="n">sc</span><span class="o">.</span><span class="n">exe</span> <span class="n">query</span> <span class="n">PFW_SERVICE_DEMO</span>
<span class="p">[</span><span class="n">SC</span><span class="p">]</span> <span class="n">EnumQueryServicesStatus</span><span class="p">:</span><span class="n">OpenService</span> <span class="n">FAILED</span> <span class="mi">1060</span><span class="p">:</span>
<span class="n">The</span> <span class="n">specified</span> <span class="n">service</span> <span class="n">does</span> <span class="ow">not</span> <span class="n">exist</span> <span class="k">as</span> <span class="n">an</span> <span class="n">installed</span> <span class="n">service</span><span class="o">.</span>
</pre></div>
</div>
</section>
</section>
<section id="network-socket-exploration">
<span id="sample-network-exploration"></span><h2><span class="section-number">18.5. </span><code class="xref py py-class docutils literal notranslate"><span class="pre">Network</span></code> - socket exploration<a class="headerlink" href="#network-socket-exploration" title="Link to this heading"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">socket</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">check_is_elevated</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;!!! Demo will fail because closing a connection require elevated process !!!&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Working on ipv4&quot;</span><span class="p">)</span>
<span class="n">conns</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">network</span><span class="o">.</span><span class="n">ipv4</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;== Listening ==&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Some listening connections: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">([</span><span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">conns</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">c</span><span class="o">.</span><span class="n">established</span><span class="p">][:</span><span class="mi">3</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listening ports are : </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">([</span><span class="n">c</span><span class="o">.</span><span class="n">local_port</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">conns</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">c</span><span class="o">.</span><span class="n">established</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;== Established ==&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Some established connections: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">([</span><span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">conns</span> <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">established</span><span class="p">][:</span><span class="mi">3</span><span class="p">]))</span>
<span class="n">TARGET_HOST</span> <span class="o">=</span> <span class="s2">&quot;localhost&quot;</span>
<span class="n">TARGET_PORT</span> <span class="o">=</span> <span class="mi">80</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;== connection to </span><span class="si">{0}</span><span class="s2">:</span><span class="si">{1}</span><span class="s2"> ==&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">TARGET_HOST</span><span class="p">,</span> <span class="n">TARGET_PORT</span><span class="p">))</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">create_connection</span><span class="p">((</span><span class="n">TARGET_HOST</span><span class="p">,</span> <span class="n">TARGET_PORT</span><span class="p">))</span>
<span class="n">our_connection</span> <span class="o">=</span> <span class="p">[</span><span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">network</span><span class="o">.</span><span class="n">ipv4</span> <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">established</span> <span class="ow">and</span> <span class="n">c</span><span class="o">.</span><span class="n">remote_port</span> <span class="o">==</span> <span class="n">TARGET_PORT</span> <span class="ow">and</span> <span class="n">c</span><span class="o">.</span><span class="n">remote_addr</span> <span class="o">==</span> <span class="n">s</span><span class="o">.</span><span class="n">getpeername</span><span class="p">()[</span><span class="mi">0</span><span class="p">]]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Our connection is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">our_connection</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Sending YOP&quot;</span><span class="p">)</span>
<span class="n">s</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s2">&quot;YOP&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Closing socket&quot;</span><span class="p">)</span>
<span class="n">our_connection</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Sending LAIT&quot;</span><span class="p">)</span>
<span class="n">s</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s2">&quot;LAIT&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>Output-New</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">network</span>\<span class="n">network</span><span class="o">.</span><span class="n">py</span>
<span class="n">Working</span> <span class="n">on</span> <span class="n">ipv4</span>
<span class="o">==</span> <span class="n">Listening</span> <span class="o">==</span>
<span class="n">Some</span> <span class="n">listening</span> <span class="n">connections</span><span class="p">:</span> <span class="p">[</span><span class="o">&lt;</span><span class="n">TCP</span> <span class="n">IPV4</span> <span class="n">Listening</span> <span class="n">socket</span> <span class="n">on</span> <span class="mf">0.0.0.0</span><span class="p">:</span><span class="mi">80</span><span class="o">&gt;</span><span class="p">,</span> <span class="o">&lt;</span><span class="n">TCP</span> <span class="n">IPV4</span> <span class="n">Listening</span> <span class="n">socket</span> <span class="n">on</span> <span class="mf">0.0.0.0</span><span class="p">:</span><span class="mi">135</span><span class="o">&gt;</span><span class="p">,</span> <span class="o">&lt;</span><span class="n">TCP</span> <span class="n">IPV4</span> <span class="n">Listening</span> <span class="n">socket</span> <span class="n">on</span> <span class="mf">0.0.0.0</span><span class="p">:</span><span class="mi">445</span><span class="o">&gt;</span><span class="p">]</span>
<span class="n">Listening</span> <span class="n">ports</span> <span class="n">are</span> <span class="p">:</span> <span class="p">[</span><span class="mi">80</span><span class="p">,</span> <span class="mi">135</span><span class="p">,</span> <span class="mi">445</span><span class="p">,</span> <span class="mi">902</span><span class="p">,</span> <span class="mi">912</span><span class="p">,</span> <span class="mi">27036</span><span class="p">,</span> <span class="mi">49664</span><span class="p">,</span> <span class="mi">49665</span><span class="p">,</span> <span class="mi">49666</span><span class="p">,</span> <span class="mi">49667</span><span class="p">,</span> <span class="mi">49671</span><span class="p">,</span> <span class="mi">49673</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">1120</span><span class="p">,</span> <span class="mi">5556</span><span class="p">,</span> <span class="mi">6463</span><span class="p">,</span> <span class="mi">22885</span><span class="p">,</span> <span class="mi">22886</span><span class="p">,</span> <span class="mi">27060</span><span class="p">,</span> <span class="mi">49330</span><span class="p">,</span> <span class="mi">49331</span><span class="p">,</span> <span class="mi">49794</span><span class="p">,</span> <span class="mi">49795</span><span class="p">,</span> <span class="mi">49867</span><span class="p">,</span> <span class="mi">52541</span><span class="p">,</span> <span class="mi">57125</span><span class="p">,</span> <span class="mi">57138</span><span class="p">,</span> <span class="mi">65000</span><span class="p">,</span> <span class="mi">65001</span><span class="p">,</span> <span class="mi">139</span><span class="p">,</span> <span class="mi">5556</span><span class="p">,</span> <span class="mi">57046</span><span class="p">,</span> <span class="mi">57109</span><span class="p">,</span> <span class="mi">57110</span><span class="p">,</span> <span class="mi">57143</span><span class="p">,</span> <span class="mi">57144</span><span class="p">,</span> <span class="mi">139</span><span class="p">,</span> <span class="mi">5556</span><span class="p">,</span> <span class="mi">139</span><span class="p">,</span> <span class="mi">5556</span><span class="p">]</span>
<span class="o">==</span> <span class="n">Established</span> <span class="o">==</span>
<span class="n">Some</span> <span class="n">established</span> <span class="n">connections</span><span class="p">:</span> <span class="p">[</span><span class="o">&lt;</span><span class="n">TCP</span> <span class="n">IPV4</span> <span class="n">Connection</span> <span class="mf">127.0.0.1</span><span class="p">:</span><span class="mi">912</span> <span class="o">-&gt;</span> <span class="mf">127.0.0.1</span><span class="p">:</span><span class="mi">49488</span><span class="o">&gt;</span><span class="p">,</span> <span class="o">&lt;</span><span class="n">TCP</span> <span class="n">IPV4</span> <span class="n">Connection</span> <span class="mf">127.0.0.1</span><span class="p">:</span><span class="mi">912</span> <span class="o">-&gt;</span> <span class="mf">127.0.0.1</span><span class="p">:</span><span class="mi">52332</span><span class="o">&gt;</span><span class="p">,</span> <span class="o">&lt;</span><span class="n">TCP</span> <span class="n">IPV4</span> <span class="n">Connection</span> <span class="mf">127.0.0.1</span><span class="p">:</span><span class="mi">49488</span> <span class="o">-&gt;</span> <span class="mf">127.0.0.1</span><span class="p">:</span><span class="mi">912</span><span class="o">&gt;</span><span class="p">]</span>
<span class="o">==</span> <span class="n">connection</span> <span class="n">to</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">80</span> <span class="o">==</span>
<span class="n">Our</span> <span class="n">connection</span> <span class="ow">is</span> <span class="p">[</span><span class="o">&lt;</span><span class="n">TCP</span> <span class="n">IPV4</span> <span class="n">Connection</span> <span class="mf">127.0.0.1</span><span class="p">:</span><span class="mi">57167</span> <span class="o">-&gt;</span> <span class="mf">127.0.0.1</span><span class="p">:</span><span class="mi">80</span><span class="o">&gt;</span><span class="p">]</span>
<span class="n">Sending</span> <span class="n">YOP</span>
<span class="n">Closing</span> <span class="n">socket</span>
<span class="n">Sending</span> <span class="n">LAIT</span>
<span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
<span class="n">File</span> <span class="s2">&quot;network</span><span class="se">\n</span><span class="s2">etwork.py&quot;</span><span class="p">,</span> <span class="n">line</span> <span class="mi">34</span><span class="p">,</span> <span class="ow">in</span> <span class="o">&lt;</span><span class="n">module</span><span class="o">&gt;</span>
<span class="n">s</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s2">&quot;LAIT&quot;</span><span class="p">)</span>
<span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">:</span> <span class="p">[</span><span class="n">Errno</span> <span class="mi">10054</span><span class="p">]</span> <span class="n">An</span> <span class="n">existing</span> <span class="n">connection</span> <span class="n">was</span> <span class="n">forcibly</span> <span class="n">closed</span> <span class="n">by</span> <span class="n">the</span> <span class="n">remote</span> <span class="n">host</span>
</pre></div>
</div>
</section>
<section id="registry">
<span id="sample-registry"></span><h2><span class="section-number">18.6. </span><code class="xref py py-class docutils literal notranslate"><span class="pre">Registry</span></code><a class="headerlink" href="#registry" title="Link to this heading"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="n">registry</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">registry</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Registry is &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">registry</span><span class="p">))</span>
<span class="n">current_user</span> <span class="o">=</span> <span class="n">registry</span><span class="p">(</span><span class="s2">&quot;HKEY_CURRENT_USER&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;HKEY_CURRENT_USER is &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">current_user</span><span class="p">))</span>
<span class="n">subkeys_name</span> <span class="o">=</span> <span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">current_user</span><span class="o">.</span><span class="n">subkeys</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;HKEY_CURRENT_USER subkeys names are:&quot;</span><span class="p">)</span>
<span class="n">pprint</span><span class="o">.</span><span class="n">pprint</span><span class="p">(</span><span class="n">subkeys_name</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Opening &#39;Software&#39; in HKEY_CURRENT_USER: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">current_user</span><span class="p">(</span><span class="s2">&quot;Software&quot;</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;We can also open it in one access: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">registry</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;HKEY_CURRENT_USER\Sofware&quot;</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Looking at CurrentVersion&quot;</span><span class="p">)</span>
<span class="n">windows_info</span> <span class="o">=</span> <span class="n">registry</span><span class="p">(</span><span class="s2">&quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Key is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">windows_info</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;values are:&quot;</span><span class="p">)</span>
<span class="n">pprint</span><span class="o">.</span><span class="n">pprint</span><span class="p">(</span><span class="n">windows_info</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
<span class="n">registered_owner</span> <span class="o">=</span> <span class="n">windows_info</span><span class="p">[</span><span class="s2">&quot;RegisteredOwner&quot;</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;registered owner = &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">registered_owner</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">registry</span>\<span class="n">registry</span><span class="o">.</span><span class="n">py</span>
<span class="n">Registry</span> <span class="ow">is</span> <span class="o">&lt;&lt;</span><span class="n">windows</span><span class="o">.</span><span class="n">winobject</span><span class="o">.</span><span class="n">registry</span><span class="o">.</span><span class="n">Registry</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x061F89F0</span><span class="o">&gt;&gt;</span>
<span class="n">HKEY_CURRENT_USER</span> <span class="ow">is</span> <span class="o">&lt;&lt;</span><span class="n">PyHKey</span> <span class="s2">&quot;HKEY_CURRENT_USER&quot;</span><span class="o">&gt;&gt;</span>
<span class="n">HKEY_CURRENT_USER</span> <span class="n">subkeys</span> <span class="n">names</span> <span class="n">are</span><span class="p">:</span>
<span class="p">[</span><span class="s1">&#39;AppEvents&#39;</span><span class="p">,</span>
<span class="s1">&#39;AppXBackupContentType&#39;</span><span class="p">,</span>
<span class="s1">&#39;Console&#39;</span><span class="p">,</span>
<span class="s1">&#39;Control Panel&#39;</span><span class="p">,</span>
<span class="s1">&#39;Environment&#39;</span><span class="p">,</span>
<span class="s1">&#39;EUDC&#39;</span><span class="p">,</span>
<span class="s1">&#39;Keyboard Layout&#39;</span><span class="p">,</span>
<span class="s1">&#39;Network&#39;</span><span class="p">,</span>
<span class="s1">&#39;Printers&#39;</span><span class="p">,</span>
<span class="s1">&#39;Software&#39;</span><span class="p">,</span>
<span class="s1">&#39;System&#39;</span><span class="p">,</span>
<span class="s1">&#39;Uninstall&#39;</span><span class="p">,</span>
<span class="s1">&#39;Volatile Environment&#39;</span><span class="p">]</span>
<span class="n">Opening</span> <span class="s1">&#39;Software&#39;</span> <span class="ow">in</span> <span class="n">HKEY_CURRENT_USER</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">PyHKey</span> <span class="s2">&quot;HKEY_CURRENT_USER\Software&quot;</span><span class="o">&gt;</span>
<span class="n">We</span> <span class="n">can</span> <span class="n">also</span> <span class="nb">open</span> <span class="n">it</span> <span class="ow">in</span> <span class="n">one</span> <span class="n">access</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">PyHKey</span> <span class="s2">&quot;HKEY_CURRENT_USER\Sofware&quot;</span><span class="o">&gt;</span>
<span class="n">Looking</span> <span class="n">at</span> <span class="n">CurrentVersion</span>
<span class="n">Key</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">PyHKey</span> <span class="s2">&quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion&quot;</span><span class="o">&gt;</span>
<span class="n">values</span> <span class="n">are</span><span class="p">:</span>
<span class="p">[</span><span class="n">KeyValue</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;SoftwareType&#39;</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="sa">u</span><span class="s1">&#39;System&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="mi">1</span><span class="p">),</span>
<span class="n">KeyValue</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;RegisteredOwner&#39;</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="sa">u</span><span class="s1">&#39;hakril&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="mi">1</span><span class="p">),</span>
<span class="o">...</span>
<span class="n">KeyValue</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;PathName&#39;</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="sa">u</span><span class="s1">&#39;C:</span><span class="se">\\</span><span class="s1">WINDOWS&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="mi">1</span><span class="p">)]</span>
<span class="n">registered</span> <span class="n">owner</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">KeyValue</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;RegisteredOwner&#39;</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="sa">u</span><span class="s1">&#39;hakril&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">&gt;</span>
</pre></div>
</div>
</section>
<section id="scheduled-tasks">
<span id="sample-scheduled-task"></span><h2><span class="section-number">18.7. </span>Scheduled tasks<a class="headerlink" href="#scheduled-tasks" title="Link to this heading"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</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="n">tscheduler</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">task_scheduler</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Task scheduler is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tscheduler</span><span class="p">))</span>
<span class="n">root</span> <span class="o">=</span> <span class="n">tscheduler</span><span class="o">.</span><span class="n">root</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Root folder is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">root</span><span class="p">))</span>
<span class="nb">print</span> <span class="p">(</span><span class="s2">&quot;Listing sub folders&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">subfolder</span> <span class="ow">in</span> <span class="n">root</span><span class="o">.</span><span class="n">folders</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">subfolder</span><span class="p">))</span>
<span class="n">last_name</span> <span class="o">=</span> <span class="n">subfolder</span><span class="o">.</span><span class="n">name</span>
<span class="n">demo_folder</span> <span class="o">=</span> <span class="s2">&quot;\Microsoft\Windows\AppID&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Manually opening subfolder &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">demo_folder</span><span class="p">))</span>
<span class="n">subfolder</span> <span class="o">=</span> <span class="n">root</span><span class="p">(</span><span class="n">demo_folder</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Working into </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">subfolder</span><span class="p">))</span>
<span class="k">for</span> <span class="n">task</span> <span class="ow">in</span> <span class="n">subfolder</span><span class="o">.</span><span class="n">tasks</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{task.name}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">task</span><span class="o">=</span><span class="n">task</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Analysing task </span><span class="si">{task}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">task</span><span class="o">=</span><span class="n">task</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Name: &lt;</span><span class="si">{task.name}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">task</span><span class="o">=</span><span class="n">task</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Path: &lt;</span><span class="si">{task.path}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">task</span><span class="o">=</span><span class="n">task</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Definition: &lt;</span><span class="si">{task.definition}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">task</span><span class="o">=</span><span class="n">task</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listing actions:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">task</span><span class="o">.</span><span class="n">definition</span><span class="o">.</span><span class="n">actions</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Action: &lt;</span><span class="si">{action}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">action</span><span class="o">=</span><span class="n">action</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Type: &lt;</span><span class="si">{action.type!r}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">action</span><span class="o">=</span><span class="n">action</span><span class="p">))</span>
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="s2">&quot;path&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * path: &lt;</span><span class="si">{action.path}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">action</span><span class="o">=</span><span class="n">action</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * arguments: &lt;</span><span class="si">{action.arguments}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">action</span><span class="o">=</span><span class="n">action</span><span class="p">))</span>
<span class="c1"># import pdb;pdb.set_trace()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listing triggers:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">trigger</span> <span class="ow">in</span> <span class="n">task</span><span class="o">.</span><span class="n">definition</span><span class="o">.</span><span class="n">triggers</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Trigger type: &lt;</span><span class="si">{trigger.type!r}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">trigger</span><span class="o">=</span><span class="n">trigger</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">DEMO_FOLDER_NAME</span> <span class="o">=</span> <span class="s2">&quot;PFW_DEMO_FOLDER&quot;</span>
<span class="n">DEMO_TASK_NAME</span> <span class="o">=</span> <span class="s2">&quot;PFW_DEMO_TASK&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Creating folder &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">DEMO_FOLDER_NAME</span><span class="p">))</span>
<span class="n">demo_folder</span> <span class="o">=</span> <span class="n">root</span><span class="o">.</span><span class="n">create_folder</span><span class="p">(</span><span class="n">DEMO_FOLDER_NAME</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Demo folder is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">demo_folder</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Creating Task definition&quot;</span><span class="p">)</span>
<span class="c1"># Create a Task definition</span>
<span class="n">new_task_definition</span> <span class="o">=</span> <span class="n">tscheduler</span><span class="o">.</span><span class="n">create</span><span class="p">()</span>
<span class="n">actions</span> <span class="o">=</span> <span class="n">new_task_definition</span><span class="o">.</span><span class="n">actions</span>
<span class="c1"># Add an TASK_ACTION_EXEC action to the task def</span>
<span class="n">new_action</span> <span class="o">=</span> <span class="n">actions</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TASK_ACTION_EXEC</span><span class="p">)</span>
<span class="n">new_action</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">executable</span>
<span class="n">new_action</span><span class="o">.</span><span class="n">arguments</span> <span class="o">=</span> <span class="s2">&quot;-c &#39;Hello !&#39;&quot;</span>
<span class="c1"># Register the new task under &#39;DEMO_TASK_NAME&#39;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Registering task definition as &lt;</span><span class="si">{0}</span><span class="s2">&gt; in &lt;</span><span class="si">{1}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">DEMO_TASK_NAME</span><span class="p">,</span> <span class="n">demo_folder</span><span class="p">))</span>
<span class="n">new_task</span> <span class="o">=</span> <span class="n">demo_folder</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">DEMO_TASK_NAME</span><span class="p">,</span> <span class="n">new_task_definition</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Created task is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">new_task</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Deleting the demo task&quot;</span><span class="p">)</span>
<span class="k">del</span> <span class="n">demo_folder</span><span class="p">[</span><span class="n">DEMO_TASK_NAME</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Deleting the demo folder&quot;</span><span class="p">)</span>
<span class="n">root</span><span class="o">.</span><span class="n">delete_folder</span><span class="p">(</span><span class="n">DEMO_FOLDER_NAME</span><span class="p">)</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">scheduled_tasks</span>\<span class="n">scheduled_task</span><span class="o">.</span><span class="n">py</span>
<span class="n">Task</span> <span class="n">scheduler</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">TaskService</span> <span class="n">at</span> <span class="mh">0x6f2a1c0</span><span class="o">&gt;</span>
<span class="n">Root</span> <span class="n">folder</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">TaskFolder</span> <span class="s2">&quot;</span><span class="se">\&quot;</span><span class="s2"> at 0x6f2a2b0&gt;</span>
<span class="n">Listing</span> <span class="n">sub</span> <span class="n">folders</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">TaskFolder</span> <span class="s2">&quot;\ASUS&quot;</span> <span class="n">at</span> <span class="mh">0x6f2a350</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">TaskFolder</span> <span class="s2">&quot;\Intel&quot;</span> <span class="n">at</span> <span class="mh">0x6f2a300</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">TaskFolder</span> <span class="s2">&quot;\Microsoft&quot;</span> <span class="n">at</span> <span class="mh">0x6f2a3a0</span><span class="o">&gt;</span>
<span class="n">Manually</span> <span class="n">opening</span> <span class="n">subfolder</span> <span class="o">&lt;</span>\<span class="n">Microsoft</span>\<span class="n">Windows</span>\<span class="n">AppID</span><span class="o">&gt;</span>
<span class="n">Working</span> <span class="n">into</span> <span class="o">&lt;</span><span class="n">TaskFolder</span> <span class="s2">&quot;\Microsoft\Windows\AppID&quot;</span> <span class="n">at</span> <span class="mh">0x6f2a3f0</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">PolicyConverter</span>
<span class="o">*</span> <span class="n">SmartScreenSpecific</span>
<span class="o">*</span> <span class="n">VerifiedPublisherCertStoreCheck</span>
<span class="n">Analysing</span> <span class="n">task</span> <span class="o">&lt;</span><span class="n">Task</span> <span class="s2">&quot;VerifiedPublisherCertStoreCheck&quot;</span> <span class="n">at</span> <span class="mh">0x6f2a300</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">Name</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">VerifiedPublisherCertStoreCheck</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">Path</span><span class="p">:</span> <span class="o">&lt;</span>\<span class="n">Microsoft</span>\<span class="n">Windows</span>\<span class="n">AppID</span>\<span class="n">VerifiedPublisherCertStoreCheck</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">Definition</span><span class="p">:</span> <span class="o">&lt;&lt;</span><span class="n">TaskDefinition</span> <span class="n">at</span> <span class="mh">0x6f2a3a0</span><span class="o">&gt;&gt;</span>
<span class="n">Listing</span> <span class="n">actions</span><span class="p">:</span>
<span class="o">*</span> <span class="n">Action</span><span class="p">:</span> <span class="o">&lt;&lt;</span><span class="n">ExecAction</span> <span class="n">at</span> <span class="mh">0x6f2a350</span><span class="o">&gt;&gt;</span>
<span class="o">*</span> <span class="n">Type</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">TASK_ACTION_EXEC</span><span class="p">(</span><span class="mh">0x0</span><span class="n">L</span><span class="p">)</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">path</span><span class="p">:</span> <span class="o">&lt;%</span><span class="n">windir</span><span class="o">%</span>\<span class="n">system32</span>\<span class="n">appidcertstorecheck</span><span class="o">.</span><span class="n">exe</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">arguments</span><span class="p">:</span> <span class="o">&lt;</span><span class="kc">None</span><span class="o">&gt;</span>
<span class="n">Listing</span> <span class="n">triggers</span><span class="p">:</span>
<span class="o">*</span> <span class="n">Trigger</span> <span class="nb">type</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">TASK_TRIGGER_BOOT</span><span class="p">(</span><span class="mh">0x8</span><span class="n">L</span><span class="p">)</span><span class="o">&gt;</span>
<span class="n">Creating</span> <span class="n">folder</span> <span class="o">&lt;</span><span class="n">PFW_DEMO_FOLDER</span><span class="o">&gt;</span>
<span class="n">Demo</span> <span class="n">folder</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">TaskFolder</span> <span class="s2">&quot;\PFW_DEMO_FOLDER&quot;</span> <span class="n">at</span> <span class="mh">0x6f2a3a0</span><span class="o">&gt;</span>
<span class="n">Creating</span> <span class="n">Task</span> <span class="n">definition</span>
<span class="n">Registering</span> <span class="n">task</span> <span class="n">definition</span> <span class="k">as</span> <span class="o">&lt;</span><span class="n">PFW_DEMO_TASK</span><span class="o">&gt;</span> <span class="ow">in</span> <span class="o">&lt;&lt;</span><span class="n">TaskFolder</span> <span class="s2">&quot;\PFW_DEMO_FOLDER&quot;</span> <span class="n">at</span> <span class="mh">0x6f2a3a0</span><span class="o">&gt;&gt;</span>
<span class="n">Created</span> <span class="n">task</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">Task</span> <span class="s2">&quot;PFW_DEMO_TASK&quot;</span> <span class="n">at</span> <span class="mh">0x6f2a530</span><span class="o">&gt;</span>
<span class="n">Deleting</span> <span class="n">the</span> <span class="n">demo</span> <span class="n">task</span>
<span class="n">Deleting</span> <span class="n">the</span> <span class="n">demo</span> <span class="n">folder</span>
</pre></div>
</div>
</section>
<section id="event-log">
<span id="sample-event-log"></span><h2><span class="section-number">18.8. </span>Event Log<a class="headerlink" href="#event-log" title="Link to this heading"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></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="n">evtlogmgr</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">event_log</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Event log Manager is: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">evtlogmgr</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;They are &lt;</span><span class="si">{0}</span><span class="s2">&gt; channels&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">evtlogmgr</span><span class="o">.</span><span class="n">channels</span><span class="p">))))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;They are &lt;</span><span class="si">{0}</span><span class="s2">&gt; publishers&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">evtlogmgr</span><span class="o">.</span><span class="n">publishers</span><span class="p">))))</span>
<span class="n">FIREWALL_CHANNEL</span> <span class="o">=</span> <span class="s2">&quot;Microsoft-Windows-Windows Firewall With Advanced Security/Firewall&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Openning channel &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">FIREWALL_CHANNEL</span><span class="p">))</span>
<span class="n">evtchan</span> <span class="o">=</span> <span class="n">evtlogmgr</span><span class="p">[</span><span class="n">FIREWALL_CHANNEL</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Channel is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">evtchan</span><span class="p">))</span>
<span class="c1"># Note that `evtchan.events` is an alias for `evtchan.query().all()`</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The channel contains &lt;</span><span class="si">{0}</span><span class="s2">&gt; events&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">evtchan</span><span class="o">.</span><span class="n">events</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">EVT_QUERY</span> <span class="o">=</span> <span class="s2">&quot;Event/EventData[Data=&#39;C:</span><span class="se">\\</span><span class="s2">WINDOWS</span><span class="se">\\</span><span class="s2">System32</span><span class="se">\\</span><span class="s2">svchost.exe&#39;] and Event/System[EventID=2006]&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;Querying &quot;</span><span class="si">{0}</span><span class="s2">&quot;&gt;&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">EVT_QUERY</span><span class="p">))</span>
<span class="n">query</span> <span class="o">=</span> <span class="n">evtchan</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">EVT_QUERY</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Query is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">query</span><span class="p">))</span>
<span class="n">event_list</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;List contains </span><span class="si">{0}</span><span class="s2"> event&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">event_list</span><span class="p">)))</span>
<span class="n">event</span> <span class="o">=</span> <span class="n">event_list</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;First event is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;System values:&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * ID: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">id</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * version: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">version</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * level: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">level</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * opcode: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">opcode</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * time_created: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">time_created</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * ID: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">id</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Event specific values:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">event</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * &lt;</span><span class="si">{0}</span><span class="s2">&gt; -&gt; &lt;</span><span class="si">{1}</span><span class="s2">&gt;&quot;</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="n">value</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">evtmeta</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">metadata</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Event metadata is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">evtmeta</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * id : </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">evtmeta</span><span class="o">.</span><span class="n">id</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * channel_id : </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">evtmeta</span><span class="o">.</span><span class="n">channel_id</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * message_id : </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">evtmeta</span><span class="o">.</span><span class="n">message_id</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * event_data : </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">evtmeta</span><span class="o">.</span><span class="n">event_data</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * EventData template :</span><span class="se">\n</span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">evtmeta</span><span class="o">.</span><span class="n">template</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\r\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Exploring complex Evt types:&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Channel is still </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">evtchan</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Channel config is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">evtchan</span><span class="o">.</span><span class="n">config</span><span class="p">))</span>
<span class="n">publisher</span> <span class="o">=</span> <span class="n">evtchan</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">publisher</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Channel publisher is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">publisher</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Channel publisher metadata is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">publisher</span><span class="o">.</span><span class="n">metadata</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Publisher&#39;s channels are:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">chan</span> <span class="ow">in</span> <span class="n">publisher</span><span class="o">.</span><span class="n">metadata</span><span class="o">.</span><span class="n">channels</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">chan</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Some publisher&#39;s event metadata are:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">evtmeta</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">publisher</span><span class="o">.</span><span class="n">metadata</span><span class="o">.</span><span class="n">events_metadata</span><span class="p">)[:</span><span class="mi">3</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">: id=</span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">evtmeta</span><span class="p">,</span> <span class="n">evtmeta</span><span class="o">.</span><span class="n">id</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">event_log</span>\<span class="n">eventlog</span><span class="o">.</span><span class="n">py</span>
<span class="n">Event</span> <span class="n">log</span> <span class="n">Manager</span> <span class="ow">is</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">windows</span><span class="o">.</span><span class="n">winobject</span><span class="o">.</span><span class="n">event_log</span><span class="o">.</span><span class="n">EvtlogManager</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x0592DB70</span><span class="o">&gt;</span>
<span class="n">They</span> <span class="n">are</span> <span class="o">&lt;</span><span class="mi">1155</span><span class="o">&gt;</span> <span class="n">channels</span>
<span class="n">They</span> <span class="n">are</span> <span class="o">&lt;</span><span class="mi">1179</span><span class="o">&gt;</span> <span class="n">publishers</span>
<span class="n">Openning</span> <span class="n">channel</span> <span class="o">&lt;</span><span class="n">Microsoft</span><span class="o">-</span><span class="n">Windows</span><span class="o">-</span><span class="n">Windows</span> <span class="n">Firewall</span> <span class="n">With</span> <span class="n">Advanced</span> <span class="n">Security</span><span class="o">/</span><span class="n">Firewall</span><span class="o">&gt;</span>
<span class="n">Channel</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">EvtChannel</span> <span class="s2">&quot;Microsoft-Windows-Windows Firewall With Advanced Security/Firewall&quot;</span><span class="o">&gt;</span>
<span class="n">The</span> <span class="n">channel</span> <span class="n">contains</span> <span class="o">&lt;</span><span class="mi">1037</span><span class="o">&gt;</span> <span class="n">events</span>
<span class="n">Querying</span> <span class="s2">&quot;Event/EventData[Data=&#39;C:\WINDOWS\System32\svchost.exe&#39;] and Event/System[EventID=2006]&quot;</span><span class="o">&gt;</span>
<span class="n">Query</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">EvtQuery</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x06E9F440</span><span class="o">&gt;</span>
<span class="n">List</span> <span class="n">contains</span> <span class="mi">304</span> <span class="n">event</span>
<span class="n">First</span> <span class="n">event</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">EvtEvent</span> <span class="nb">id</span><span class="o">=</span><span class="s2">&quot;2006&quot;</span> <span class="n">time</span><span class="o">=</span><span class="s2">&quot;2018-05-06 08:03:06.210109&quot;</span><span class="o">&gt;</span>
<span class="n">System</span> <span class="n">values</span><span class="p">:</span>
<span class="o">*</span> <span class="n">ID</span><span class="p">:</span> <span class="mi">2006</span>
<span class="o">*</span> <span class="n">version</span><span class="p">:</span> <span class="mi">0</span>
<span class="o">*</span> <span class="n">level</span><span class="p">:</span> <span class="mi">4</span>
<span class="o">*</span> <span class="n">opcode</span><span class="p">:</span> <span class="mi">0</span>
<span class="o">*</span> <span class="n">time_created</span><span class="p">:</span> <span class="mi">131700673862101088</span>
<span class="o">*</span> <span class="n">ID</span><span class="p">:</span> <span class="mi">2006</span>
<span class="n">Event</span> <span class="n">specific</span> <span class="n">values</span><span class="p">:</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">ModifyingUser</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="o">&lt;</span><span class="mi">108703760</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">RuleName</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="o">&lt;</span><span class="n">ByteCodeGeneration</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">ModifyingApplication</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">WINDOWS</span>\<span class="n">System32</span>\<span class="n">svchost</span><span class="o">.</span><span class="n">exe</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">RuleId</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="o">&lt;</span><span class="p">{</span><span class="mi">318</span><span class="n">EF1CF</span><span class="o">-</span><span class="n">A3FA</span><span class="o">-</span><span class="mi">4</span><span class="n">B04</span><span class="o">-</span><span class="mi">8</span><span class="n">AAC</span><span class="o">-</span><span class="mi">712276661117</span><span class="p">}</span><span class="o">&gt;</span>
<span class="n">Event</span> <span class="n">metadata</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">EventMetadata</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x06EB96C0</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="nb">id</span> <span class="p">:</span> <span class="mi">2006</span>
<span class="o">*</span> <span class="n">channel_id</span> <span class="p">:</span> <span class="mi">16</span>
<span class="o">*</span> <span class="n">message_id</span> <span class="p">:</span> <span class="mi">2986346454</span>
<span class="o">*</span> <span class="n">event_data</span> <span class="p">:</span> <span class="p">[</span><span class="sa">u</span><span class="s1">&#39;RuleId&#39;</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;RuleName&#39;</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;ModifyingUser&#39;</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;ModifyingApplication&#39;</span><span class="p">]</span>
<span class="o">*</span> <span class="n">EventData</span> <span class="n">template</span> <span class="p">:</span>
<span class="o">&lt;</span><span class="n">template</span> <span class="n">xmlns</span><span class="o">=</span><span class="s2">&quot;http://schemas.microsoft.com/win/2004/08/events&quot;</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="n">data</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;RuleId&quot;</span> <span class="n">inType</span><span class="o">=</span><span class="s2">&quot;win:UnicodeString&quot;</span> <span class="n">outType</span><span class="o">=</span><span class="s2">&quot;xs:string&quot;</span><span class="o">/&gt;</span>
<span class="o">&lt;</span><span class="n">data</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;RuleName&quot;</span> <span class="n">inType</span><span class="o">=</span><span class="s2">&quot;win:UnicodeString&quot;</span> <span class="n">outType</span><span class="o">=</span><span class="s2">&quot;xs:string&quot;</span><span class="o">/&gt;</span>
<span class="o">&lt;</span><span class="n">data</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;ModifyingUser&quot;</span> <span class="n">inType</span><span class="o">=</span><span class="s2">&quot;win:SID&quot;</span> <span class="n">outType</span><span class="o">=</span><span class="s2">&quot;xs:string&quot;</span><span class="o">/&gt;</span>
<span class="o">&lt;</span><span class="n">data</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;ModifyingApplication&quot;</span> <span class="n">inType</span><span class="o">=</span><span class="s2">&quot;win:UnicodeString&quot;</span> <span class="n">outType</span><span class="o">=</span><span class="s2">&quot;xs:string&quot;</span><span class="o">/&gt;</span>
<span class="o">&lt;/</span><span class="n">template</span><span class="o">&gt;</span>
<span class="n">Exploring</span> <span class="nb">complex</span> <span class="n">Evt</span> <span class="n">types</span><span class="p">:</span>
<span class="n">Channel</span> <span class="ow">is</span> <span class="n">still</span> <span class="o">&lt;</span><span class="n">EvtChannel</span> <span class="s2">&quot;Microsoft-Windows-Windows Firewall With Advanced Security/Firewall&quot;</span><span class="o">&gt;</span>
<span class="n">Channel</span> <span class="n">config</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">ChannelConfig</span> <span class="s2">&quot;Microsoft-Windows-Windows Firewall With Advanced Security/Firewall&quot;</span><span class="o">&gt;</span>
<span class="n">Channel</span> <span class="n">publisher</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">EvtPublisher</span> <span class="s2">&quot;Microsoft-Windows-Windows Firewall With Advanced Security&quot;</span><span class="o">&gt;</span>
<span class="n">Channel</span> <span class="n">publisher</span> <span class="n">metadata</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">PublisherMetadata</span> <span class="s2">&quot;Microsoft-Windows-Windows Firewall With Advanced Security&quot;</span><span class="o">&gt;</span>
<span class="n">Publisher</span><span class="s1">&#39;s channels are:</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">EvtChannel</span> <span class="s2">&quot;Microsoft-Windows-Windows Firewall With Advanced Security/Firewall&quot;</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">EvtChannel</span> <span class="s2">&quot;Microsoft-Windows-Windows Firewall With Advanced Security/ConnectionSecurity&quot;</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">EvtChannel</span> <span class="s2">&quot;Microsoft-Windows-Windows Firewall With Advanced Security/FirewallVerbose&quot;</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">EvtChannel</span> <span class="s2">&quot;Microsoft-Windows-Windows Firewall With Advanced Security/ConnectionSecurityVerbose&quot;</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">EvtChannel</span> <span class="s2">&quot;Network Isolation Operational&quot;</span><span class="o">&gt;</span>
<span class="n">Some</span> <span class="n">publisher</span><span class="s1">&#39;s event metadata are:</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">EventMetadata</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x06EBE710</span><span class="o">&gt;</span><span class="p">:</span> <span class="nb">id</span><span class="o">=</span><span class="mi">2000</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">EventMetadata</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x06EBE7B0</span><span class="o">&gt;</span><span class="p">:</span> <span class="nb">id</span><span class="o">=</span><span class="mi">2001</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">EventMetadata</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x06EBE3F0</span><span class="o">&gt;</span><span class="p">:</span> <span class="nb">id</span><span class="o">=</span><span class="mi">2002</span>
</pre></div>
</div>
</section>
<section id="object-manager">
<span id="sample-object-manager"></span><h2><span class="section-number">18.9. </span>Object manager<a class="headerlink" href="#object-manager" title="Link to this heading"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</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="n">object_manager</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">object_manager</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Object manager is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">object_manager</span><span class="p">))</span>
<span class="n">root</span> <span class="o">=</span> <span class="n">object_manager</span><span class="o">.</span><span class="n">root</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Root object is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">root</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listing some of root-subobject:&quot;</span><span class="p">)</span>
<span class="c1"># Kernel object of type &#39;Directory&#39; are iterable</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">: </span><span class="si">{1}</span><span class="s2">&quot;</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="n">obj</span><span class="p">))</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
<span class="k">break</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;Retrieving &lt;\Rpc Control\lsasspirpc&gt;:&quot;</span><span class="p">)</span>
<span class="c1"># You can retrieve this value in one request</span>
<span class="n">x1</span> <span class="o">=</span> <span class="n">root</span><span class="p">[</span><span class="sa">r</span><span class="s2">&quot;\Rpc Control\lsasspirpc&quot;</span><span class="p">]</span>
<span class="c1"># Sub-directory also allow __getitem__</span>
<span class="n">x2</span> <span class="o">=</span> <span class="n">root</span><span class="p">[</span><span class="s2">&quot;Rpc Control&quot;</span><span class="p">][</span><span class="s2">&quot;lsasspirpc&quot;</span><span class="p">]</span>
<span class="c1"># You can directly request the object manager that will request `root`</span>
<span class="n">x3</span> <span class="o">=</span> <span class="n">object_manager</span><span class="p">[</span><span class="sa">r</span><span class="s2">&quot;\Rpc Control\lsasspirpc&quot;</span><span class="p">]</span>
<span class="k">assert</span> <span class="n">x1</span><span class="o">.</span><span class="n">fullname</span> <span class="o">==</span> <span class="n">x2</span><span class="o">.</span><span class="n">fullname</span> <span class="o">==</span> <span class="n">x3</span><span class="o">.</span><span class="n">fullname</span>
<span class="n">lsasspirpc</span> <span class="o">=</span> <span class="n">x1</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Object is: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lsasspirpc</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * name: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lsasspirpc</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * path: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lsasspirpc</span><span class="o">.</span><span class="n">path</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * fullname: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lsasspirpc</span><span class="o">.</span><span class="n">fullname</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * type: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lsasspirpc</span><span class="o">.</span><span class="n">type</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * target: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lsasspirpc</span><span class="o">.</span><span class="n">target</span><span class="p">))</span> <span class="c1"># None on non-symlink</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Looking for a SymbolicLink in &lt;ArcName&gt;&quot;</span><span class="p">)</span>
<span class="n">slo</span> <span class="o">=</span> <span class="p">[</span><span class="n">o</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">root</span><span class="p">[</span><span class="s2">&quot;ArcName&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">o</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="s2">&quot;SymbolicLink&quot;</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Object is: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">slo</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * name: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">slo</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * target: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">slo</span><span class="o">.</span><span class="n">target</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">object_manager</span>\<span class="n">object_manager</span><span class="o">.</span><span class="n">py</span>
<span class="n">Object</span> <span class="n">manager</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">windows</span><span class="o">.</span><span class="n">winobject</span><span class="o">.</span><span class="n">object_manager</span><span class="o">.</span><span class="n">ObjectManager</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x0370ED10</span><span class="o">&gt;</span>
<span class="n">Root</span> <span class="nb">object</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;</span><span class="se">\&quot;</span><span class="s2"> (type=&quot;</span><span class="n">Directory</span><span class="s2">&quot;)&gt;</span>
<span class="n">Listing</span> <span class="n">some</span> <span class="n">of</span> <span class="n">root</span><span class="o">-</span><span class="n">subobject</span><span class="p">:</span>
<span class="o">*</span> <span class="n">PendingRenameMutex</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;\PendingRenameMutex&quot;</span> <span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&quot;Mutant&quot;</span><span class="p">)</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">ObjectTypes</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;\ObjectTypes&quot;</span> <span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&quot;Directory&quot;</span><span class="p">)</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">storqosfltport</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;\storqosfltport&quot;</span> <span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&quot;FilterConnectionPort&quot;</span><span class="p">)</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">MicrosoftMalwareProtectionRemoteIoPortWD</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;\MicrosoftMalwareProtectionRemoteIoPortWD&quot;</span> <span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&quot;FilterConnectionPort&quot;</span><span class="p">)</span><span class="o">&gt;</span>
<span class="n">Retrieving</span> <span class="o">&lt;</span>\<span class="n">Rpc</span> <span class="n">Control</span>\<span class="n">lsasspirpc</span><span class="o">&gt;</span><span class="p">:</span>
<span class="n">Object</span> <span class="ow">is</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;\Rpc Control\lsasspirpc&quot;</span> <span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&quot;ALPC Port&quot;</span><span class="p">)</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">name</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">lsasspirpc</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">path</span><span class="p">:</span> <span class="o">&lt;</span>\<span class="n">Rpc</span> <span class="n">Control</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">fullname</span><span class="p">:</span> <span class="o">&lt;</span>\<span class="n">Rpc</span> <span class="n">Control</span>\<span class="n">lsasspirpc</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="nb">type</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">ALPC</span> <span class="n">Port</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">target</span><span class="p">:</span> <span class="o">&lt;</span><span class="kc">None</span><span class="o">&gt;</span>
<span class="n">Looking</span> <span class="k">for</span> <span class="n">a</span> <span class="n">SymbolicLink</span> <span class="ow">in</span> <span class="o">&lt;</span><span class="n">ArcName</span><span class="o">&gt;</span>
<span class="n">Object</span> <span class="ow">is</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;\ArcName\multi(0)disk(0)rdisk(0)&quot;</span> <span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&quot;SymbolicLink&quot;</span><span class="p">)</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">name</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">multi</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="n">disk</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="n">rdisk</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">target</span><span class="p">:</span> <span class="o">&lt;</span>\<span class="n">Device</span>\<span class="n">Harddisk0</span>\<span class="n">Partition0</span><span class="o">&gt;</span>
</pre></div>
</div>
<section id="find-objects">
<h3><span class="section-number">18.9.1. </span>find objects<a class="headerlink" href="#find-objects" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">argparse</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="k">def</span> <span class="nf">obj_with_link</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="n">target</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">target</span>
<span class="k">if</span> <span class="n">target</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">{0}</span><span class="s2"> -&gt; &lt;</span><span class="si">{1}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">find_name</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">findname</span><span class="p">):</span>
<span class="n">TODO</span> <span class="o">=</span> <span class="p">[</span><span class="n">root</span><span class="p">]</span>
<span class="k">while</span> <span class="n">TODO</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">TODO</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">findname</span> <span class="ow">in</span> <span class="n">name</span> <span class="ow">or</span> <span class="n">findname</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">type</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;* </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">obj_with_link</span><span class="p">(</span><span class="n">obj</span><span class="p">)))</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="s2">&quot;Directory&quot;</span><span class="p">:</span>
<span class="n">TODO</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">except</span> <span class="n">gdef</span><span class="o">.</span><span class="n">NtStatusException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&lt;</span><span class="si">{0}</span><span class="s2">&gt; -&gt; </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">fullname</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="vm">__file__</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s1">&#39;?&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">&quot;ls&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;The name of the object to find&#39;</span><span class="p">)</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
<span class="n">objmanag</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">object_manager</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Looking for object name containing &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">res</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="n">find_name</span><span class="p">(</span><span class="n">objmanag</span><span class="o">.</span><span class="n">root</span><span class="p">,</span> <span class="n">res</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">object_manager</span>\<span class="n">findobj</span><span class="o">.</span><span class="n">py</span>
<span class="n">Looking</span> <span class="k">for</span> <span class="nb">object</span> <span class="n">name</span> <span class="n">containing</span> <span class="o">&lt;</span><span class="n">ls</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;\KnownDlls32&quot;</span> <span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&quot;Directory&quot;</span><span class="p">)</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;\Win32kCrossSessionGlobals&quot;</span> <span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&quot;Section&quot;</span><span class="p">)</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;\KnownDlls&quot;</span> <span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&quot;Directory&quot;</span><span class="p">)</span><span class="o">&gt;</span>
<span class="o">&lt;</span>\<span class="n">DriverStores</span>\<span class="n">SYSTEM</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">STATUS_ACCESS_DENIED</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;\Device\MailslotRedirector&quot;</span> <span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&quot;SymbolicLink&quot;</span><span class="p">)</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="o">&lt;</span>\<span class="n">Device</span>\<span class="n">Mup</span>\<span class="p">;</span><span class="n">MailslotRedirector</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;\Device\Mailslot&quot;</span> <span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&quot;Device&quot;</span><span class="p">)</span><span class="o">&gt;</span>
<span class="o">&lt;</span>\<span class="n">Device</span>\<span class="mi">00000020</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">STATUS_ACCESS_DENIED</span>
<span class="o">&lt;</span>\<span class="n">Device</span>\<span class="mi">00000020</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">STATUS_ACCESS_DENIED</span>
<span class="o">&lt;</span>\<span class="n">Device</span>\<span class="mi">00000020</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">STATUS_ACCESS_DENIED</span>
<span class="o">&lt;</span>\<span class="n">Device</span>\<span class="mi">00000020</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">STATUS_ACCESS_DENIED</span>
<span class="o">&lt;</span>\<span class="n">Device</span>\<span class="mi">00000020</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">STATUS_ACCESS_DENIED</span>
<span class="o">&lt;</span>\<span class="n">KernelObjects</span>\<span class="n">PrefetchTracesReady</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">STATUS_ACCESS_DENIED</span>
<span class="o">&lt;</span>\<span class="n">KnownDlls</span>\<span class="n">powrprof</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">STATUS_ACCESS_DENIED</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;\RPC Control\lsapolicylookup&quot;</span> <span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&quot;ALPC Port&quot;</span><span class="p">)</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;\RPC Control\lsacap&quot;</span> <span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&quot;ALPC Port&quot;</span><span class="p">)</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">KernelObject</span> <span class="s2">&quot;\RPC Control\lsasspirpc&quot;</span> <span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&quot;ALPC Port&quot;</span><span class="p">)</span><span class="o">&gt;</span>
<span class="o">&lt;</span>\<span class="n">Windows</span>\<span class="n">SbApiPort</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">STATUS_ACCESS_DENIED</span>
<span class="o">&lt;</span>\<span class="n">Windows</span>\<span class="n">SbApiPort</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">STATUS_ACCESS_DENIED</span>
<span class="o">&lt;</span>\<span class="n">Sessions</span>\<span class="n">BNOLINKS</span>\<span class="mi">1</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">STATUS_ACCESS_DENIED</span>
<span class="o">&lt;</span>\<span class="n">Sessions</span>\<span class="n">BNOLINKS</span>\<span class="mi">1</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">STATUS_ACCESS_DENIED</span>
<span class="o">&lt;</span>\<span class="n">Sessions</span>\<span class="n">BNOLINKS</span>\<span class="mi">1</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">STATUS_ACCESS_DENIED</span>
</pre></div>
</div>
</section>
</section>
<section id="device-manager">
<span id="sample-device-manager"></span><h2><span class="section-number">18.10. </span>Device manager<a class="headerlink" href="#device-manager" title="Link to this heading"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.pipe</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="n">devmgr</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">device_manager</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Device manager is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">devmgr</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Enumerating the first 3 device classes&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="bp">cls</span> <span class="ow">in</span> <span class="n">devmgr</span><span class="o">.</span><span class="n">classes</span><span class="p">[:</span><span class="mi">3</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">cls</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Finding device class &#39;System&#39;&quot;</span><span class="p">)</span>
<span class="c1"># Allow devmgr.classes[&quot;name&quot;] ?</span>
<span class="n">system_cls</span> <span class="o">=</span> <span class="p">[</span><span class="bp">cls</span> <span class="k">for</span> <span class="bp">cls</span> <span class="ow">in</span> <span class="n">devmgr</span><span class="o">.</span><span class="n">classes</span> <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;System&quot;</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">system_cls</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; Enumerating some devices of &#39;System&#39;&quot;</span><span class="p">)</span>
<span class="n">devices</span> <span class="o">=</span> <span class="n">system_cls</span><span class="o">.</span><span class="n">devices</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="k">for</span> <span class="n">devinst</span> <span class="ow">in</span> <span class="p">(</span><span class="n">devices</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">devices</span><span class="p">[</span><span class="mi">25</span><span class="p">],</span> <span class="n">devices</span><span class="p">[</span><span class="mi">35</span><span class="p">]):</span> <span class="c1"># Some &quot;random&quot; devices to have interesting ones</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">devinst</span><span class="p">))</span>
<span class="n">devconf</span> <span class="o">=</span> <span class="n">devinst</span><span class="o">.</span><span class="n">allocated_configuration</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">devconf</span><span class="p">:</span>
<span class="k">continue</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; Enumerating allocated resources:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">resource</span> <span class="ow">in</span> <span class="n">devconf</span><span class="o">.</span><span class="n">resources</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">resource</span><span class="p">))</span>
<span class="c1"># python64 samples\device\device_manager.py</span>
<span class="c1"># Device manager is &lt;windows.winobject.device_manager.DeviceManager object at 0x0000000003669908&gt;</span>
<span class="c1"># Enumerating the first 3 device classes</span>
<span class="c1"># * &lt;DeviceClass name=&quot;XboxComposite&quot; guid=05F5CFE2-4733-4950-A6BB-07AAD01A3A84&gt;</span>
<span class="c1"># * &lt;DeviceClass name=&quot;DXGKrnl&quot; guid=1264760F-A5C8-4BFE-B314-D56A7B44A362&gt;</span>
<span class="c1"># * &lt;DeviceClass name=&quot;RemotePosDevice&quot; guid=13E42DFA-85D9-424D-8646-28A70F864F9C&gt;</span>
<span class="c1"># Finding device class &#39;System&#39;</span>
<span class="c1"># * &lt;DeviceClass name=&quot;System&quot; guid=4D36E97D-E325-11CE-BFC1-08002BE10318&gt;</span>
<span class="c1"># Enumerating some devices of &#39;System&#39;</span>
<span class="c1"># * &lt;DeviceInstance &quot;Motherboard resources&quot; (id=1)&gt;</span>
<span class="c1"># * &lt;DeviceInstance &quot;Microsoft ACPI-Compliant Embedded Controller&quot; (id=26)&gt;</span>
<span class="c1"># Enumerating allocated resources:</span>
<span class="c1"># * &lt;IoResource : [0x00000000000062-0x00000000000062]&gt;</span>
<span class="c1"># * &lt;IoResource : [0x00000000000066-0x00000000000066]&gt;</span>
<span class="c1"># * &lt;DeviceInstance &quot;High Definition Audio Controller&quot; (id=36)&gt;</span>
<span class="c1"># Enumerating allocated resources:</span>
<span class="c1"># * &lt;MemoryResource : [0x000000f7080000-0x000000f7083fff]&gt;</span>
<span class="c1"># * &lt;DevicePrivateResource type=ResType_DevicePrivate(0x8001)&gt;</span>
<span class="c1"># * &lt;IrqResource : [0x00000000000011]&gt;</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python device_manager\device_manager.py
Device manager is &lt;windows.winobject.device_manager.DeviceManager object at 0x00000000033442E8&gt;
Enumerating the first 3 device classes
* &lt;DeviceClass name=&quot;XboxComposite&quot; guid=05F5CFE2-4733-4950-A6BB-07AAD01A3A84&gt;
* &lt;DeviceClass name=&quot;DXGKrnl&quot; guid=1264760F-A5C8-4BFE-B314-D56A7B44A362&gt;
* &lt;DeviceClass name=&quot;RemotePosDevice&quot; guid=13E42DFA-85D9-424D-8646-28A70F864F9C&gt;
Finding device class &#39;System&#39;
* &lt;DeviceClass name=&quot;System&quot; guid=4D36E97D-E325-11CE-BFC1-08002BE10318&gt;
Enumerating some devices of &#39;System&#39;
* &lt;DeviceInstance &quot;Motherboard resources&quot; (id=1)&gt;
* &lt;DeviceInstance &quot;Microsoft ACPI-Compliant Embedded Controller&quot; (id=26)&gt;
Enumerating allocated resources:
* &lt;IoResource : [0x00000000000062-0x00000000000062]&gt;
* &lt;IoResource : [0x00000000000066-0x00000000000066]&gt;
* &lt;DeviceInstance &quot;High Definition Audio Controller&quot; (id=36)&gt;
Enumerating allocated resources:
* &lt;MemoryResource : [0x000000f7080000-0x000000f7083fff]&gt;
* &lt;DevicePrivateResource type=ResType_DevicePrivate(0x8001)&gt;
* &lt;IrqResource : [0x00000000000011]&gt;
</pre></div>
</div>
<section id="enumerate-devices">
<h3><span class="section-number">18.10.1. </span>Enumerate devices<a class="headerlink" href="#enumerate-devices" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">argparse</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="n">devmgr</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">device_manager</span>
<span class="k">def</span> <span class="nf">class_generator</span><span class="p">(</span><span class="nb">filter</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">for</span> <span class="bp">cls</span> <span class="ow">in</span> <span class="n">devmgr</span><span class="o">.</span><span class="n">classes</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">filter</span> <span class="ow">and</span> <span class="bp">cls</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="nb">filter</span><span class="o">.</span><span class="n">encode</span><span class="p">():</span>
<span class="k">continue</span>
<span class="k">yield</span> <span class="bp">cls</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">clsfilter</span><span class="p">,</span> <span class="n">enumerate_devices</span><span class="p">,</span> <span class="n">print_devinst_resources</span><span class="p">,</span> <span class="n">attributes</span><span class="p">):</span>
<span class="k">for</span> <span class="n">devcls</span> <span class="ow">in</span> <span class="n">class_generator</span><span class="p">(</span><span class="n">clsfilter</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">devcls</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">enumerate_devices</span><span class="p">:</span>
<span class="k">continue</span>
<span class="c1"># Enumerate devices</span>
<span class="k">for</span> <span class="n">devinst</span> <span class="ow">in</span> <span class="n">devcls</span><span class="o">.</span><span class="n">devices</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">devinst</span><span class="p">))</span>
<span class="c1"># Print attributes</span>
<span class="k">if</span> <span class="n">attributes</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; Attributes:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">attributes</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">devinst</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">=</span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">print_devinst_resources</span><span class="p">:</span>
<span class="k">continue</span>
<span class="c1"># Device resources</span>
<span class="n">devconf</span> <span class="o">=</span> <span class="n">devinst</span><span class="o">.</span><span class="n">allocated_configuration</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">devconf</span><span class="p">:</span>
<span class="c1"># No allocated configuration</span>
<span class="c1"># Check boot conf ?</span>
<span class="k">continue</span>
<span class="k">for</span> <span class="n">resource</span> <span class="ow">in</span> <span class="n">devconf</span><span class="o">.</span><span class="n">resources</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">resource</span><span class="p">))</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="vm">__file__</span><span class="p">,</span> <span class="n">formatter_class</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentDefaultsHelpFormatter</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--class&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;clsfilter&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;The classe to list: default all&quot;</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--no-print-devices&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store_true&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Prevent the listing of devices in the matching classes&quot;</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--print-resources&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store_true&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Print the resources allocated to the device instance&quot;</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--attributes&quot;</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s2">&quot;+&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;The list of attributes to print for each discovered device instance&quot;</span><span class="p">)</span>
<span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="n">main</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">clsfilter</span><span class="p">,</span>
<span class="n">enumerate_devices</span><span class="o">=</span><span class="ow">not</span> <span class="n">args</span><span class="o">.</span><span class="n">no_print_devices</span><span class="p">,</span>
<span class="n">print_devinst_resources</span><span class="o">=</span><span class="n">args</span><span class="o">.</span><span class="n">print_resources</span><span class="p">,</span>
<span class="n">attributes</span><span class="o">=</span><span class="n">args</span><span class="o">.</span><span class="n">attributes</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ python64 device_manager\enum_devices.py --no-print-devices
Namespace(clsfilter=None, no_print_devices=True, print_resources=False)
&lt;DeviceClass name=&quot;XboxComposite&quot; guid=05F5CFE2-4733-4950-A6BB-07AAD01A3A84&gt;
&lt;DeviceClass name=&quot;DXGKrnl&quot; guid=1264760F-A5C8-4BFE-B314-D56A7B44A362&gt;
&lt;DeviceClass name=&quot;RemotePosDevice&quot; guid=13E42DFA-85D9-424D-8646-28A70F864F9C&gt;
&lt;DeviceClass name=&quot;DigitalMediaDevices&quot; guid=14B62F50-3F15-11DD-AE16-0800200C9A66&gt;
&lt;DeviceClass name=&quot;PrintQueue&quot; guid=1ED2BBF9-11F0-4084-B21F-AD83A8E6DCDC&gt;
&lt;DeviceClass name=&quot;WCEUSBS&quot; guid=25DBCE51-6C8F-4A72-8A6D-B54C2B4FC835&gt;
&lt;DeviceClass name=&quot;SecurityAccelerator&quot; guid=268C95A1-EDFE-11D3-95C3-0010DC4050A5&gt;
&lt;DeviceClass name=&quot;HidMsr&quot; guid=2A9FE532-0CDC-44F9-9827-76192F2CA2FB&gt;
&lt;DeviceClass name=&quot;SystemRecovery&quot; guid=2DB15374-706E-4131-A0C7-D7C78EB0289A&gt;
....
$ python64 device_manager\enum_devices.py --class Processor --attributes name manufacturer device_object_name location_paths
Namespace(attributes=[&#39;name&#39;, &#39;manufacturer&#39;, &#39;device_object_name&#39;, &#39;location_paths&#39;], clsfilter=&#39;Processor&#39;, no_print_devices=False, print_resources=False)
&lt;DeviceClass name=&quot;Processor&quot; guid=50127DC3-0F36-415E-A6CC-4CB3BE910B65&gt;
* &lt;DeviceInstance &quot;Intel Processor&quot; (id=1)&gt;
Attributes:
* name=Intel(R) Core(TM) i5-6600 CPU @ 3.30GHz
* manufacturer=Intel
* device_object_name=\Device\00000017
* location_paths=[u&#39;ACPI(_SB_)#ACPI(CPU0)&#39;]
* &lt;DeviceInstance &quot;Intel Processor&quot; (id=2)&gt;
Attributes:
* name=Intel(R) Core(TM) i5-6600 CPU @ 3.30GHz
* manufacturer=Intel
* device_object_name=\Device\00000018
* location_paths=[u&#39;ACPI(_SB_)#ACPI(CPU1)&#39;]
* &lt;DeviceInstance &quot;Intel Processor&quot; (id=3)&gt;
Attributes:
* name=Intel(R) Core(TM) i5-6600 CPU @ 3.30GHz
* manufacturer=Intel
* device_object_name=\Device\00000019
* location_paths=[u&#39;ACPI(_SB_)#ACPI(CPU2)&#39;]
* &lt;DeviceInstance &quot;Intel Processor&quot; (id=4)&gt;
Attributes:
* name=Intel(R) Core(TM) i5-6600 CPU @ 3.30GHz
* manufacturer=Intel
* device_object_name=\Device\0000001a
* location_paths=[u&#39;ACPI(_SB_)#ACPI(CPU3)&#39;]
$ python64 device_manager\enum_devices.py --class Display --print-resources
Namespace(clsfilter=&#39;Display&#39;, no_print_devices=False, print_resources=True)
&lt;DeviceClass name=&quot;Display&quot; guid=4D36E968-E325-11CE-BFC1-08002BE10318&gt;
* &lt;DeviceInstance &quot;NVIDIA GeForce GTX 1070&quot; (id=1)&gt;
* &lt;MemoryResource : [0x000000f6000000-0x000000f6ffffff]&gt;
* &lt;DevicePrivateResource type=ResType_DevicePrivate(0x8001)&gt;
* &lt;MemoryResource : [0x000000e0000000-0x000000efffffff]&gt;
* &lt;DevicePrivateResource type=ResType_DevicePrivate(0x8001)&gt;
* &lt;MemoryResource : [0x000000f0000000-0x000000f1ffffff]&gt;
* &lt;DevicePrivateResource type=ResType_DevicePrivate(0x8001)&gt;
* &lt;IoResource : [0x0000000000e000-0x0000000000e07f]&gt;
...
</pre></div>
</div>
</section>
</section>
<section id="windows-wintrust">
<span id="sample-wintrust"></span><h2><span class="section-number">18.11. </span><code class="docutils literal notranslate"><span class="pre">windows.wintrust</span></code><a class="headerlink" href="#windows-wintrust" title="Link to this heading"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows.wintrust</span>
<span class="n">TARGET_FILE</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;C:\windows\system32\ntdll.dll&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Checking signature of &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">TARGET_FILE</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; is_signed: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">wintrust</span><span class="o">.</span><span class="n">is_signed</span><span class="p">(</span><span class="n">TARGET_FILE</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; check_signature: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">wintrust</span><span class="o">.</span><span class="n">check_signature</span><span class="p">(</span><span class="n">TARGET_FILE</span><span class="p">)))</span>
<span class="n">sign_info</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">wintrust</span><span class="o">.</span><span class="n">full_signature_information</span><span class="p">(</span><span class="n">TARGET_FILE</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; full_signature_information:&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * signed &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sign_info</span><span class="o">.</span><span class="n">signed</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * catalog &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sign_info</span><span class="o">.</span><span class="n">catalog</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * catalogsigned &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sign_info</span><span class="o">.</span><span class="n">catalogsigned</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * additionalinfo &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sign_info</span><span class="o">.</span><span class="n">additionalinfo</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Checking signature of some loaded DLL&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">module</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="mi">5</span><span class="p">]:</span>
<span class="n">path</span> <span class="o">=</span> <span class="n">module</span><span class="o">.</span><span class="n">fullname</span>
<span class="n">is_signed</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">wintrust</span><span class="o">.</span><span class="n">is_signed</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
<span class="k">if</span> <span class="n">is_signed</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&lt;</span><span class="si">{0}</span><span class="s2">&gt; : </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">is_signed</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">sign_info</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">wintrust</span><span class="o">.</span><span class="n">full_signature_information</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&lt;</span><span class="si">{0}</span><span class="s2">&gt; : </span><span class="si">{1}</span><span class="s2"> (</span><span class="si">{2}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">is_signed</span><span class="p">,</span> <span class="n">sign_info</span><span class="p">[</span><span class="mi">3</span><span class="p">]))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">crypto</span>\<span class="n">wintrust</span><span class="o">.</span><span class="n">py</span>
<span class="n">Checking</span> <span class="n">signature</span> <span class="n">of</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">system32</span>\<span class="n">ntdll</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">is_signed</span><span class="p">:</span> <span class="o">&lt;</span><span class="kc">True</span><span class="o">&gt;</span>
<span class="n">check_signature</span><span class="p">:</span> <span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span>
<span class="n">full_signature_information</span><span class="p">:</span>
<span class="o">*</span> <span class="n">signed</span> <span class="o">&lt;</span><span class="kc">True</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">catalog</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">Windows</span>\<span class="n">system32</span>\<span class="n">CatRoot</span>\<span class="p">{</span><span class="n">F750E6C3</span><span class="o">-</span><span class="mi">38</span><span class="n">EE</span><span class="o">-</span><span class="mi">11</span><span class="n">D1</span><span class="o">-</span><span class="mf">85E5</span><span class="o">-</span><span class="mi">00</span><span class="n">C04FC295EE</span><span class="p">}</span>\<span class="n">Microsoft</span><span class="o">-</span><span class="n">Windows</span><span class="o">-</span><span class="n">Client</span><span class="o">-</span><span class="n">Desktop</span><span class="o">-</span><span class="n">Required</span><span class="o">-</span><span class="n">Package051420</span><span class="o">~</span><span class="mi">31</span><span class="n">bf3856ad364e35</span><span class="o">~</span><span class="n">amd64</span><span class="o">~~</span><span class="mf">10.0.22621.3593</span><span class="o">.</span><span class="n">cat</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">catalogsigned</span> <span class="o">&lt;</span><span class="kc">True</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">additionalinfo</span> <span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span>
<span class="n">Checking</span> <span class="n">signature</span> <span class="n">of</span> <span class="n">some</span> <span class="n">loaded</span> <span class="n">DLL</span>
<span class="o">&lt;</span><span class="n">c</span><span class="p">:</span>\<span class="n">users</span>\<span class="n">cleme</span>\<span class="n">appdata</span>\<span class="n">local</span>\<span class="n">programs</span>\<span class="n">python</span>\<span class="n">python311</span>\<span class="n">python</span><span class="o">.</span><span class="n">exe</span><span class="o">&gt;</span> <span class="p">:</span> <span class="kc">True</span>
<span class="o">&lt;</span><span class="n">c</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">system32</span>\<span class="n">ntdll</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span> <span class="p">:</span> <span class="kc">True</span>
<span class="o">&lt;</span><span class="n">c</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">system32</span>\<span class="n">kernel32</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span> <span class="p">:</span> <span class="kc">True</span>
<span class="o">&lt;</span><span class="n">c</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">system32</span>\<span class="n">kernelbase</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span> <span class="p">:</span> <span class="kc">True</span>
<span class="o">&lt;</span><span class="n">c</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">system32</span>\<span class="n">ucrtbase</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span> <span class="p">:</span> <span class="kc">True</span>
</pre></div>
</div>
</section>
<section id="vectoredexception">
<span id="sample-vectoredexception"></span><h2><span class="section-number">18.12. </span><code class="xref py py-func docutils literal notranslate"><span class="pre">VectoredException()</span></code><a class="headerlink" href="#vectoredexception" title="Link to this heading"></a></h2>
<section id="in-local-process">
<h3><span class="section-number">18.12.1. </span>In local process<a class="headerlink" href="#in-local-process" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">ctypes</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">from</span> <span class="nn">windows.winobject.exception</span> <span class="kn">import</span> <span class="n">VectoredException</span>
<span class="kn">import</span> <span class="nn">windows.generated_def.windef</span> <span class="k">as</span> <span class="nn">windef</span>
<span class="kn">from</span> <span class="nn">windows.generated_def.winstructs</span> <span class="kn">import</span> <span class="o">*</span>
<span class="nd">@VectoredException</span>
<span class="k">def</span> <span class="nf">handler</span><span class="p">(</span><span class="n">exc</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;==Entry of VEH handler==&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">exc</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">ExceptionCode</span> <span class="o">==</span> <span class="n">EXCEPTION_ACCESS_VIOLATION</span><span class="p">:</span>
<span class="n">target_addr</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">exc</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">ExceptionInformation</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_void_p</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Instr at </span><span class="si">{0}</span><span class="s2"> accessed to addr </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">exc</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">ExceptionAddress</span><span class="p">),</span> <span class="nb">hex</span><span class="p">(</span><span class="n">target_addr</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Resetting page protection to &lt;PAGE_READWRITE&gt;&quot;</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">VirtualProtect</span><span class="p">(</span><span class="n">target_page</span><span class="p">,</span> <span class="mh">0x1000</span><span class="p">,</span> <span class="n">windef</span><span class="o">.</span><span class="n">PAGE_READWRITE</span><span class="p">)</span>
<span class="n">exc</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">ContextRecord</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">EEFlags</span><span class="o">.</span><span class="n">TF</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="n">windef</span><span class="o">.</span><span class="n">EXCEPTION_CONTINUE_EXECUTION</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Exception of type </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">exc</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">ExceptionCode</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Resetting page protection to &lt;PAGE_NOACCESS&gt;&quot;</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">VirtualProtect</span><span class="p">(</span><span class="n">target_page</span><span class="p">,</span> <span class="mh">0x1000</span><span class="p">,</span> <span class="n">windef</span><span class="o">.</span><span class="n">PAGE_NOACCESS</span><span class="p">)</span>
<span class="k">return</span> <span class="n">windef</span><span class="o">.</span><span class="n">EXCEPTION_CONTINUE_EXECUTION</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">AddVectoredExceptionHandler</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">handler</span><span class="p">)</span>
<span class="n">target_page</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">virtual_alloc</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Protected page is at &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">target_page</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Setting page protection to &lt;PAGE_NOACCESS&gt;&quot;</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">VirtualProtect</span><span class="p">(</span><span class="n">target_page</span><span class="p">,</span> <span class="mh">0x1000</span><span class="p">,</span> <span class="n">windef</span><span class="o">.</span><span class="n">PAGE_NOACCESS</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_uint</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">target_page</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Value 1 read&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_uint</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">target_page</span> <span class="o">+</span> <span class="mh">0x10</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Value 2 read&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">process</span>\<span class="n">veh_segv</span><span class="o">.</span><span class="n">py</span>
<span class="n">Protected</span> <span class="n">page</span> <span class="ow">is</span> <span class="n">at</span> <span class="o">&lt;</span><span class="mh">0x289b6bc0000</span><span class="o">&gt;</span>
<span class="n">Setting</span> <span class="n">page</span> <span class="n">protection</span> <span class="n">to</span> <span class="o">&lt;</span><span class="n">PAGE_NOACCESS</span><span class="o">&gt;</span>
<span class="o">==</span><span class="n">Entry</span> <span class="n">of</span> <span class="n">VEH</span> <span class="n">handler</span><span class="o">==</span>
<span class="n">Instr</span> <span class="n">at</span> <span class="mh">0x7ff8bda3e718</span> <span class="n">accessed</span> <span class="n">to</span> <span class="n">addr</span> <span class="mh">0x289b6bc0000</span>
<span class="n">Resetting</span> <span class="n">page</span> <span class="n">protection</span> <span class="n">to</span> <span class="o">&lt;</span><span class="n">PAGE_READWRITE</span><span class="o">&gt;</span>
<span class="o">==</span><span class="n">Entry</span> <span class="n">of</span> <span class="n">VEH</span> <span class="n">handler</span><span class="o">==</span>
<span class="ne">Exception</span> <span class="n">of</span> <span class="nb">type</span> <span class="n">EXCEPTION_SINGLE_STEP</span><span class="p">(</span><span class="mh">0x80000004</span><span class="p">)</span>
<span class="n">Resetting</span> <span class="n">page</span> <span class="n">protection</span> <span class="n">to</span> <span class="o">&lt;</span><span class="n">PAGE_NOACCESS</span><span class="o">&gt;</span>
<span class="n">Value</span> <span class="mi">1</span> <span class="n">read</span>
<span class="o">==</span><span class="n">Entry</span> <span class="n">of</span> <span class="n">VEH</span> <span class="n">handler</span><span class="o">==</span>
<span class="n">Instr</span> <span class="n">at</span> <span class="mh">0x7ff8bda3e718</span> <span class="n">accessed</span> <span class="n">to</span> <span class="n">addr</span> <span class="mh">0x289b6bc0010</span>
<span class="n">Resetting</span> <span class="n">page</span> <span class="n">protection</span> <span class="n">to</span> <span class="o">&lt;</span><span class="n">PAGE_READWRITE</span><span class="o">&gt;</span>
<span class="o">==</span><span class="n">Entry</span> <span class="n">of</span> <span class="n">VEH</span> <span class="n">handler</span><span class="o">==</span>
<span class="ne">Exception</span> <span class="n">of</span> <span class="nb">type</span> <span class="n">EXCEPTION_SINGLE_STEP</span><span class="p">(</span><span class="mh">0x80000004</span><span class="p">)</span>
<span class="n">Resetting</span> <span class="n">page</span> <span class="n">protection</span> <span class="n">to</span> <span class="o">&lt;</span><span class="n">PAGE_NOACCESS</span><span class="o">&gt;</span>
<span class="n">Value</span> <span class="mi">2</span> <span class="n">read</span>
</pre></div>
</div>
</section>
<section id="in-remote-process">
<h3><span class="section-number">18.12.2. </span>In remote process<a class="headerlink" href="#in-remote-process" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.test</span>
<span class="kn">from</span> <span class="nn">windows.generated_def.winstructs</span> <span class="kn">import</span> <span class="o">*</span>
<span class="n">python_code</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">import windows</span>
<span class="s2">import ctypes</span>
<span class="s2">import windows</span>
<span class="s2">from windows.winobject.exception import VectoredException</span>
<span class="s2">import windows.generated_def.windef as windef</span>
<span class="s2">from windows.generated_def.winstructs import *</span>
<span class="s2">windows.utils.create_console()</span>
<span class="s2">module_to_trace = &quot;gdi32.dll&quot;</span>
<span class="s2">nb_repeat = [5]</span>
<span class="s2">@VectoredException</span>
<span class="s2">def handler(exc):</span>
<span class="s2"> if exc[0].ExceptionRecord[0].ExceptionCode == EXCEPTION_ACCESS_VIOLATION:</span>
<span class="s2"> print(&quot;&quot;)</span>
<span class="s2"> target_addr = ctypes.cast(exc[0].ExceptionRecord[0].ExceptionInformation[1], ctypes.c_void_p).value</span>
<span class="s2"> print(&quot;Instr at </span><span class="si">{0}</span><span class="s2"> accessed to addr </span><span class="si">{1}</span><span class="s2"> (</span><span class="si">{2}</span><span class="s2">)&quot;.format(hex(exc[0].ExceptionRecord[0].ExceptionAddress), hex(target_addr), module_to_trace))</span>
<span class="s2"> windows.winproxy.VirtualProtect(target_page, code_size, windef.PAGE_EXECUTE_READWRITE)</span>
<span class="s2"> nb_repeat[0] -= 1</span>
<span class="s2"> if nb_repeat[0]:</span>
<span class="s2"> exc[0].ContextRecord[0].EEFlags.TF = 1</span>
<span class="s2"> else:</span>
<span class="s2"> print(&quot;No more tracing !&quot;)</span>
<span class="s2"> return windef.EXCEPTION_CONTINUE_EXECUTION</span>
<span class="s2"> else:</span>
<span class="s2"> print(&quot;Exception of type </span><span class="si">{0}</span><span class="s2">&quot;.format(exc[0].ExceptionRecord[0].ExceptionCode))</span>
<span class="s2"> print(&quot;Resetting page protection to &lt;PAGE_READWRITE&gt;&quot;)</span>
<span class="s2"> windows.winproxy.VirtualProtect(target_page, code_size, windef.PAGE_READWRITE)</span>
<span class="s2"> return windef.EXCEPTION_CONTINUE_EXECUTION</span>
<span class="s2">windows.winproxy.AddVectoredExceptionHandler(0, handler)</span>
<span class="s2">print(&quot;Tracing execution in module: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;.format(module_to_trace))</span>
<span class="s2">module = [x for x in windows.current_process.peb.modules if x.name == module_to_trace][0]</span>
<span class="s2">target_page = module.baseaddr</span>
<span class="s2">code_size = module.pe.get_OptionalHeader().SizeOfCode</span>
<span class="s2">print(&quot;Protected page is at </span><span class="si">{0}</span><span class="s2">&quot;.format(hex(target_page)))</span>
<span class="s2">windows.winproxy.VirtualProtect(target_page, code_size, windef.PAGE_READWRITE)</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">pop_proc_64</span><span class="p">(</span><span class="n">dwCreationFlags</span><span class="o">=</span><span class="n">CREATE_SUSPENDED</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">execute_python</span><span class="p">(</span><span class="n">python_code</span><span class="p">)</span>
<span class="n">c</span><span class="o">.</span><span class="n">threads</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">resume</span><span class="p">()</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span>
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">c</span><span class="o">.</span><span class="n">threads</span><span class="p">:</span>
<span class="n">t</span><span class="o">.</span><span class="n">suspend</span><span class="p">()</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">c</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
</pre></div>
</div>
<p>Output:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd λ) python.exe process\remote_veh_segv.py
(In another console)
Tracing execution in module: &lt;gdi32.dll&gt;
Protected page is at 0x7ffa3c700000L
Instr at 0x7ffa3c70f0f0L accessed to addr 0x7ffa3c70f0f0L (gdi32.dll)
Exception of type EXCEPTION_SINGLE_STEP(0x80000004L)
Resetting page protection to &lt;PAGE_READWRITE&gt;
Instr at 0x7ffa3c70f0f5L accessed to addr 0x7ffa3c70f0f5L (gdi32.dll)
Exception of type EXCEPTION_SINGLE_STEP(0x80000004L)
Resetting page protection to &lt;PAGE_READWRITE&gt;
Instr at 0x7ffa3c70f0faL accessed to addr 0x7ffa3c70f0faL (gdi32.dll)
Exception of type EXCEPTION_SINGLE_STEP(0x80000004L)
Resetting page protection to &lt;PAGE_READWRITE&gt;
Instr at 0x7ffa3c70f0ffL accessed to addr 0x7ffa3c70f0ffL (gdi32.dll)
Exception of type EXCEPTION_SINGLE_STEP(0x80000004L)
Resetting page protection to &lt;PAGE_READWRITE&gt;
Instr at 0x7ffa3c70f100L accessed to addr 0x7ffa3c70f100L (gdi32.dll)
No more tracing !
</pre></div>
</div>
</section>
</section>
<section id="debugging">
<span id="sample-debugger"></span><h2><span class="section-number">18.13. </span>Debugging<a class="headerlink" href="#debugging" title="Link to this heading"></a></h2>
<section id="debugger">
<h3><span class="section-number">18.13.1. </span><code class="xref py py-class docutils literal notranslate"><span class="pre">Debugger</span></code><a class="headerlink" href="#debugger" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.test</span>
<span class="kn">import</span> <span class="nn">windows.debug</span>
<span class="kn">from</span> <span class="nn">windows.generated_def.winstructs</span> <span class="kn">import</span> <span class="o">*</span>
<span class="k">class</span> <span class="nc">MyDebugger</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">Debugger</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">on_exception</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exception</span><span class="p">):</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">exception</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionCode</span>
<span class="n">addr</span> <span class="o">=</span> <span class="n">exception</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionAddress</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Got exception </span><span class="si">{0}</span><span class="s2"> at 0x</span><span class="si">{1:x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">addr</span><span class="p">))</span>
<span class="k">class</span> <span class="nc">PrintUnicodeString</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">Breakpoint</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">addr</span><span class="p">,</span> <span class="n">argument_position</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">PrintUnicodeString</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">addr</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">arg_pos</span> <span class="o">=</span> <span class="n">argument_position</span>
<span class="k">def</span> <span class="nf">trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">dbg</span><span class="o">.</span><span class="n">current_process</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">dbg</span><span class="o">.</span><span class="n">current_thread</span>
<span class="n">esp</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">context</span><span class="o">.</span><span class="n">Esp</span>
<span class="n">unicode_string_addr</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">read_ptr</span><span class="p">(</span><span class="n">esp</span> <span class="o">+</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">arg_pos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">4</span><span class="p">)</span>
<span class="n">wstring_addr</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">read_ptr</span><span class="p">(</span><span class="n">unicode_string_addr</span> <span class="o">+</span> <span class="mi">4</span><span class="p">)</span>
<span class="n">dll_loaded</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">read_wstring</span><span class="p">(</span><span class="n">wstring_addr</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Loading &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">dll_loaded</span><span class="p">))</span>
<span class="k">if</span> <span class="n">dll_loaded</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;comctl32.dll&quot;</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Ask to load &lt;comctl32.dll&gt;: exiting process&quot;</span><span class="p">)</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="n">calc</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">pop_proc_32</span><span class="p">(</span><span class="n">dwCreationFlags</span><span class="o">=</span><span class="n">DEBUG_PROCESS</span><span class="p">)</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">MyDebugger</span><span class="p">(</span><span class="n">calc</span><span class="p">)</span>
<span class="n">d</span><span class="o">.</span><span class="n">add_bp</span><span class="p">(</span><span class="n">PrintUnicodeString</span><span class="p">(</span><span class="s2">&quot;ntdll!LdrLoadDll&quot;</span><span class="p">,</span> <span class="n">argument_position</span><span class="o">=</span><span class="mi">2</span><span class="p">))</span>
<span class="n">d</span><span class="o">.</span><span class="n">loop</span><span class="p">()</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">debug</span>\<span class="n">debugger_print_LdrLoaddll</span><span class="o">.</span><span class="n">py</span>
<span class="n">Got</span> <span class="n">exception</span> <span class="n">EXCEPTION_BREAKPOINT</span><span class="p">(</span><span class="mh">0x80000003</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0x7ff8e5aebd44</span>
<span class="n">Loading</span> <span class="o">&lt;</span><span class="n">kernel32</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">Got</span> <span class="n">exception</span> <span class="n">UNKNOW_EXCEPTION</span><span class="p">(</span><span class="mh">0x4000001f</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0x77e58727</span>
<span class="n">Loading</span> <span class="o">&lt;</span><span class="n">api</span><span class="o">-</span><span class="n">ms</span><span class="o">-</span><span class="n">win</span><span class="o">-</span><span class="n">core</span><span class="o">-</span><span class="n">synch</span><span class="o">-</span><span class="n">l1</span><span class="o">-</span><span class="mi">2</span><span class="o">-</span><span class="mi">0</span><span class="o">&gt;</span>
<span class="n">Loading</span> <span class="o">&lt;</span><span class="n">api</span><span class="o">-</span><span class="n">ms</span><span class="o">-</span><span class="n">win</span><span class="o">-</span><span class="n">core</span><span class="o">-</span><span class="n">fibers</span><span class="o">-</span><span class="n">l1</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="mi">1</span><span class="o">&gt;</span>
<span class="n">Loading</span> <span class="o">&lt;</span><span class="n">api</span><span class="o">-</span><span class="n">ms</span><span class="o">-</span><span class="n">win</span><span class="o">-</span><span class="n">core</span><span class="o">-</span><span class="n">fibers</span><span class="o">-</span><span class="n">l1</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="mi">0</span><span class="o">&gt;</span>
<span class="n">Loading</span> <span class="o">&lt;</span><span class="n">api</span><span class="o">-</span><span class="n">ms</span><span class="o">-</span><span class="n">win</span><span class="o">-</span><span class="n">core</span><span class="o">-</span><span class="n">synch</span><span class="o">-</span><span class="n">l1</span><span class="o">-</span><span class="mi">2</span><span class="o">-</span><span class="mi">0</span><span class="o">&gt;</span>
<span class="n">Loading</span> <span class="o">&lt;</span><span class="n">api</span><span class="o">-</span><span class="n">ms</span><span class="o">-</span><span class="n">win</span><span class="o">-</span><span class="n">core</span><span class="o">-</span><span class="n">localization</span><span class="o">-</span><span class="n">l1</span><span class="o">-</span><span class="mi">2</span><span class="o">-</span><span class="mi">1</span><span class="o">&gt;</span>
<span class="n">Loading</span> <span class="o">&lt;</span><span class="n">kernel32</span><span class="o">&gt;</span>
<span class="n">Loading</span> <span class="o">&lt;</span><span class="n">api</span><span class="o">-</span><span class="n">ms</span><span class="o">-</span><span class="n">win</span><span class="o">-</span><span class="n">core</span><span class="o">-</span><span class="n">string</span><span class="o">-</span><span class="n">l1</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="mi">0</span><span class="o">&gt;</span>
<span class="n">Loading</span> <span class="o">&lt;</span><span class="n">api</span><span class="o">-</span><span class="n">ms</span><span class="o">-</span><span class="n">win</span><span class="o">-</span><span class="n">core</span><span class="o">-</span><span class="n">datetime</span><span class="o">-</span><span class="n">l1</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="mi">1</span><span class="o">&gt;</span>
<span class="n">Loading</span> <span class="o">&lt;</span><span class="n">api</span><span class="o">-</span><span class="n">ms</span><span class="o">-</span><span class="n">win</span><span class="o">-</span><span class="n">core</span><span class="o">-</span><span class="n">localization</span><span class="o">-</span><span class="n">obsolete</span><span class="o">-</span><span class="n">l1</span><span class="o">-</span><span class="mi">2</span><span class="o">-</span><span class="mi">0</span><span class="o">&gt;</span>
<span class="n">Loading</span> <span class="o">&lt;</span><span class="n">c</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">system32</span>\<span class="n">imm32</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">Loading</span> <span class="o">&lt;</span><span class="n">comctl32</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">Ask</span> <span class="n">to</span> <span class="n">load</span> <span class="o">&lt;</span><span class="n">comctl32</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span><span class="p">:</span> <span class="n">exiting</span> <span class="n">process</span>
</pre></div>
</div>
<section id="on-setup">
<span id="sample-debugger-on-setup"></span><h4><span class="section-number">18.13.1.1. </span>on_setup<a class="headerlink" href="#on-setup" title="Link to this heading"></a></h4>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">windows.debug</span>
<span class="k">class</span> <span class="nc">MySetupDebugger</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">Debugger</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">on_setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">MySetupDebugger</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">on_setup</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Setup called: </span><span class="si">{0}</span><span class="s2">&quot;</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="n">current_process</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">on_exception</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Exception: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">exc</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionCode</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">on_exit_process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">evt</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Process exit: </span><span class="si">{0}</span><span class="s2">&quot;</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="n">current_process</span><span class="p">))</span>
<span class="k">class</span> <span class="nc">SimpleDebugger</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">Debugger</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">on_exception</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Exception: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">exc</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionCode</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">on_exit_process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">evt</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Process exit: </span><span class="si">{0}</span><span class="s2">&quot;</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="n">current_process</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;== With on_setup ==&quot;</span><span class="p">)</span>
<span class="n">dbg</span> <span class="o">=</span> <span class="n">MySetupDebugger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;c:\windows\system32\whoami.exe&quot;</span><span class="p">)</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">loop</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">== Without on_setup ==&quot;</span><span class="p">)</span>
<span class="n">dbg</span> <span class="o">=</span> <span class="n">SimpleDebugger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;c:\windows\system32\whoami.exe&quot;</span><span class="p">)</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">loop</span><span class="p">()</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">debug</span>\<span class="n">debugger_on_setup</span><span class="o">.</span><span class="n">py</span>
<span class="o">==</span> <span class="n">With</span> <span class="n">on_setup</span> <span class="o">==</span>
<span class="n">Setup</span> <span class="n">called</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">WinProcess</span> <span class="s2">&quot;whoami.exe&quot;</span> <span class="n">pid</span> <span class="mi">29796</span> <span class="n">at</span> <span class="mh">0x4ccb790</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="n">whoami</span> <span class="n">output</span><span class="o">&gt;</span>
<span class="n">Process</span> <span class="n">exit</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">WinProcess</span> <span class="s2">&quot;whoami.exe&quot;</span> <span class="n">pid</span> <span class="mi">29796</span> <span class="p">(</span><span class="n">DEAD</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0x4ccb790</span><span class="o">&gt;</span>
<span class="o">==</span> <span class="n">Without</span> <span class="n">on_setup</span> <span class="o">==</span>
<span class="ne">Exception</span><span class="p">:</span> <span class="n">EXCEPTION_BREAKPOINT</span><span class="p">(</span><span class="mh">0x80000003</span><span class="n">L</span><span class="p">)</span>
<span class="o">&lt;</span><span class="n">whoami</span> <span class="n">output</span><span class="o">&gt;</span>
<span class="n">Process</span> <span class="n">exit</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">WinProcess</span> <span class="s2">&quot;whoami.exe&quot;</span> <span class="n">pid</span> <span class="mi">33328</span> <span class="p">(</span><span class="n">DEAD</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0x4ccbdb0</span><span class="o">&gt;</span>
</pre></div>
</div>
</section>
<section id="single-stepping">
<h4><span class="section-number">18.13.1.2. </span>Single stepping<a class="headerlink" href="#single-stepping" title="Link to this heading"></a></h4>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.test</span>
<span class="kn">import</span> <span class="nn">windows.debug</span>
<span class="kn">import</span> <span class="nn">windows.native_exec.simple_x86</span> <span class="k">as</span> <span class="nn">x86</span>
<span class="kn">from</span> <span class="nn">windows.generated_def.winstructs</span> <span class="kn">import</span> <span class="o">*</span>
<span class="k">class</span> <span class="nc">MyDebugger</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">Debugger</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="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="nb">super</span><span class="p">(</span><span class="n">MyDebugger</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="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">single_step_counter</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">on_exception</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exception</span><span class="p">):</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">exception</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionCode</span>
<span class="n">addr</span> <span class="o">=</span> <span class="n">exception</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionAddress</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Got exception </span><span class="si">{0}</span><span class="s2"> at 0x</span><span class="si">{1:x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">addr</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">on_single_step</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exception</span><span class="p">):</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">exception</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionCode</span>
<span class="n">addr</span> <span class="o">=</span> <span class="n">exception</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionAddress</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Got single_step </span><span class="si">{0}</span><span class="s2"> at 0x</span><span class="si">{1:x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">addr</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">single_step_counter</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">single_step_counter</span> <span class="o">&gt;</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">single_step</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;No more single step: exiting&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">SingleStepOnWrite</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">MemoryBreakpoint</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Check that BP/dbg can trigger single step and that instruction follows&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="n">fault_addr</span> <span class="o">=</span> <span class="n">exc</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionInformation</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">eip</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</span><span class="o">.</span><span class="n">pc</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Instruction at &lt;</span><span class="si">{0:#x}</span><span class="s2">&gt; wrote at &lt;</span><span class="si">{1:#x}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">eip</span><span class="p">,</span> <span class="n">fault_addr</span><span class="p">))</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">single_step_counter</span> <span class="o">=</span> <span class="mi">4</span>
<span class="k">return</span> <span class="n">dbg</span><span class="o">.</span><span class="n">single_step</span><span class="p">()</span>
<span class="n">calc</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">pop_proc_32</span><span class="p">(</span><span class="n">dwCreationFlags</span><span class="o">=</span><span class="n">DEBUG_PROCESS</span><span class="p">)</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">MyDebugger</span><span class="p">(</span><span class="n">calc</span><span class="p">)</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">calc</span><span class="o">.</span><span class="n">virtual_alloc</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">calc</span><span class="o">.</span><span class="n">virtual_alloc</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">)</span>
<span class="n">injected</span> <span class="o">=</span> <span class="n">x86</span><span class="o">.</span><span class="n">MultipleInstr</span><span class="p">()</span>
<span class="n">injected</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Mov</span><span class="p">(</span><span class="s2">&quot;EAX&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">injected</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Mov</span><span class="p">(</span><span class="n">x86</span><span class="o">.</span><span class="n">deref</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="s2">&quot;EAX&quot;</span><span class="p">)</span>
<span class="n">injected</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="s2">&quot;EAX&quot;</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
<span class="n">injected</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Mov</span><span class="p">(</span><span class="n">x86</span><span class="o">.</span><span class="n">deref</span><span class="p">(</span><span class="n">data</span> <span class="o">+</span> <span class="mi">4</span><span class="p">),</span> <span class="s2">&quot;EAX&quot;</span><span class="p">)</span>
<span class="n">injected</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="s2">&quot;EAX&quot;</span><span class="p">,</span> <span class="mi">8</span><span class="p">)</span>
<span class="n">injected</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Mov</span><span class="p">(</span><span class="n">x86</span><span class="o">.</span><span class="n">deref</span><span class="p">(</span><span class="n">data</span> <span class="o">+</span> <span class="mi">8</span><span class="p">),</span> <span class="s2">&quot;EAX&quot;</span><span class="p">)</span>
<span class="n">injected</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Nop</span><span class="p">()</span>
<span class="n">injected</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Nop</span><span class="p">()</span>
<span class="n">injected</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Ret</span><span class="p">()</span>
<span class="n">calc</span><span class="o">.</span><span class="n">write_memory</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">injected</span><span class="o">.</span><span class="n">get_code</span><span class="p">())</span>
<span class="n">d</span><span class="o">.</span><span class="n">add_bp</span><span class="p">(</span><span class="n">SingleStepOnWrite</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">events</span><span class="o">=</span><span class="s2">&quot;W&quot;</span><span class="p">))</span>
<span class="n">calc</span><span class="o">.</span><span class="n">create_thread</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">d</span><span class="o">.</span><span class="n">loop</span><span class="p">()</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">debug</span>\<span class="n">debugger_membp_singlestep</span><span class="o">.</span><span class="n">py</span>
<span class="n">Got</span> <span class="n">exception</span> <span class="n">EXCEPTION_BREAKPOINT</span><span class="p">(</span><span class="mh">0x80000003</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0x7ff8e5aebd44</span>
<span class="n">Got</span> <span class="n">exception</span> <span class="n">UNKNOW_EXCEPTION</span><span class="p">(</span><span class="mh">0x4000001f</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0x77e58727</span>
<span class="n">Instruction</span> <span class="n">at</span> <span class="o">&lt;</span><span class="mh">0xa50006</span><span class="o">&gt;</span> <span class="n">wrote</span> <span class="n">at</span> <span class="o">&lt;</span><span class="mh">0xa60000</span><span class="o">&gt;</span>
<span class="n">Got</span> <span class="n">single_step</span> <span class="n">UNKNOW_EXCEPTION</span><span class="p">(</span><span class="mh">0x4000001e</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0xa5000c</span>
<span class="n">Got</span> <span class="n">single_step</span> <span class="n">UNKNOW_EXCEPTION</span><span class="p">(</span><span class="mh">0x4000001e</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0xa50011</span>
<span class="n">Instruction</span> <span class="n">at</span> <span class="o">&lt;</span><span class="mh">0xa50011</span><span class="o">&gt;</span> <span class="n">wrote</span> <span class="n">at</span> <span class="o">&lt;</span><span class="mh">0xa60004</span><span class="o">&gt;</span>
<span class="n">Got</span> <span class="n">single_step</span> <span class="n">UNKNOW_EXCEPTION</span><span class="p">(</span><span class="mh">0x4000001e</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0xa50017</span>
<span class="n">Got</span> <span class="n">single_step</span> <span class="n">UNKNOW_EXCEPTION</span><span class="p">(</span><span class="mh">0x4000001e</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0xa5001c</span>
<span class="n">Got</span> <span class="n">single_step</span> <span class="n">UNKNOW_EXCEPTION</span><span class="p">(</span><span class="mh">0x4000001e</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0xa50022</span>
<span class="n">Got</span> <span class="n">single_step</span> <span class="n">UNKNOW_EXCEPTION</span><span class="p">(</span><span class="mh">0x4000001e</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0xa50023</span>
<span class="n">No</span> <span class="n">more</span> <span class="n">single</span> <span class="n">step</span><span class="p">:</span> <span class="n">exiting</span>
</pre></div>
</div>
</section>
<section id="windows-debug-functioncallbp">
<span id="sample-debugger-bp-functioncallbp"></span><h4><span class="section-number">18.13.1.3. </span><a class="reference internal" href="debug.html#windows.debug.FunctionCallBP" title="windows.debug.FunctionCallBP"><code class="xref py py-class docutils literal notranslate"><span class="pre">windows.debug.FunctionCallBP</span></code></a><a class="headerlink" href="#windows-debug-functioncallbp" title="Link to this heading"></a></h4>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.test</span>
<span class="kn">import</span> <span class="nn">windows.debug</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="c1"># The debugge python will just print the result of</span>
<span class="c1"># 3 call to IsDebuggerPresent</span>
<span class="n">TARGET_PYTHON_CODE</span> <span class="o">=</span> <span class="s1">&#39;&quot;</span><span class="se">\</span>
<span class="s1">import ctypes;</span><span class="se">\</span>
<span class="s1">import time;</span><span class="se">\</span>
<span class="s1">IsDebuggerPresent = ctypes.windll.kernel32.IsDebuggerPresent;</span><span class="se">\</span>
<span class="s1">print(</span><span class="se">\&#39;</span><span class="s1">[DEBUGGE] IsDebuggerPresent=</span><span class="si">{0}</span><span class="se">\&#39;</span><span class="s1">.format(IsDebuggerPresent()));</span><span class="se">\</span>
<span class="s1">time.sleep(1);</span><span class="se">\</span>
<span class="s1">print(</span><span class="se">\&#39;</span><span class="s1">[DEBUGGE] IsDebuggerPresent=</span><span class="si">{0}</span><span class="se">\&#39;</span><span class="s1">.format(IsDebuggerPresent()));</span><span class="se">\</span>
<span class="s1">time.sleep(1);</span><span class="se">\</span>
<span class="s1">print(</span><span class="se">\&#39;</span><span class="s1">[DEBUGGE] IsDebuggerPresent=</span><span class="si">{0}</span><span class="se">\&#39;</span><span class="s1">.format(IsDebuggerPresent()));</span><span class="se">\</span>
<span class="s1">&quot;&#39;</span>
<span class="c1"># This breakpoint now nothing about its target argument</span>
<span class="c1"># It only now how to break at the return of the function</span>
<span class="c1"># This allow us to change the return value of any function</span>
<span class="k">class</span> <span class="nc">IncrementReturnValue</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">FunctionCallBP</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">addr</span><span class="p">,</span> <span class="n">initialvalue</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">IncrementReturnValue</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">addr</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">initialvalue</span> <span class="o">=</span> <span class="n">initialvalue</span>
<span class="k">def</span> <span class="nf">trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="c1"># Ask to break a the return of the function</span>
<span class="c1"># callback is ret_trigger</span>
<span class="bp">self</span><span class="o">.</span><span class="n">break_on_ret</span><span class="p">(</span><span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">ret_trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="n">ctx</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</span>
<span class="c1"># Func result is an alias to EAX/RAX</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">func_result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">initialvalue</span>
<span class="c1"># Set the new context for the target thread</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">current_thread</span><span class="o">.</span><span class="n">set_context</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">initialvalue</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">Debugger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="p">[</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="s2">&quot;-c&quot;</span><span class="p">,</span> <span class="n">TARGET_PYTHON_CODE</span><span class="p">])</span>
<span class="c1"># We could also give the direct address of the function</span>
<span class="c1"># But it would require to wait for the module to be loaded</span>
<span class="n">d</span><span class="o">.</span><span class="n">add_bp</span><span class="p">(</span><span class="n">IncrementReturnValue</span><span class="p">(</span><span class="s2">&quot;kernelbase!IsDebuggerPresent&quot;</span><span class="p">,</span> <span class="mi">42</span><span class="p">))</span>
<span class="n">d</span><span class="o">.</span><span class="n">loop</span><span class="p">()</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">debug</span>\<span class="n">change_function_ret_value</span><span class="o">.</span><span class="n">py</span>
<span class="p">[</span><span class="n">DEBUGGE</span><span class="p">]</span> <span class="n">IsDebuggerPresent</span><span class="o">=</span><span class="mi">42</span>
<span class="p">[</span><span class="n">DEBUGGE</span><span class="p">]</span> <span class="n">IsDebuggerPresent</span><span class="o">=</span><span class="mi">43</span>
<span class="p">[</span><span class="n">DEBUGGE</span><span class="p">]</span> <span class="n">IsDebuggerPresent</span><span class="o">=</span><span class="mi">44</span>
</pre></div>
</div>
</section>
<section id="windows-debug-functionbp">
<span id="sample-debugger-bp-functionbp"></span><h4><span class="section-number">18.13.1.4. </span><a class="reference internal" href="debug.html#windows.debug.FunctionBP" title="windows.debug.FunctionBP"><code class="xref py py-class docutils literal notranslate"><span class="pre">windows.debug.FunctionBP</span></code></a><a class="headerlink" href="#windows-debug-functionbp" title="Link to this heading"></a></h4>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.test</span>
<span class="kn">import</span> <span class="nn">windows.debug</span>
<span class="kn">from</span> <span class="nn">windows.generated_def.winstructs</span> <span class="kn">import</span> <span class="o">*</span>
<span class="k">class</span> <span class="nc">FollowNtCreateFile</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">FunctionBP</span><span class="p">):</span>
<span class="n">TARGET</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtCreateFile</span>
<span class="n">COUNTER</span> <span class="o">=</span> <span class="mi">3</span>
<span class="k">def</span> <span class="nf">trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">COUNTER</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Exiting process&quot;</span><span class="p">)</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="k">return</span>
<span class="n">params</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">extract_arguments</span><span class="p">(</span><span class="n">dbg</span><span class="o">.</span><span class="n">current_process</span><span class="p">,</span> <span class="n">dbg</span><span class="o">.</span><span class="n">current_thread</span><span class="p">)</span>
<span class="n">filename</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;ObjectAttributes&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">contents</span><span class="o">.</span><span class="n">ObjectName</span><span class="o">.</span><span class="n">contents</span><span class="o">.</span><span class="n">Buffer</span>
<span class="n">handle_addr</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;FileHandle&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">handle_addr</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">break_on_ret</span><span class="p">(</span><span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">ret_trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="n">filename</span><span class="p">,</span> <span class="n">handle_addr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span>
<span class="n">ret_value</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</span><span class="o">.</span><span class="n">func_result</span> <span class="c1"># EAX / RAX depending of bitness</span>
<span class="n">handle_value</span> <span class="o">=</span> <span class="n">dbg</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">read_ptr</span><span class="p">(</span><span class="n">handle_addr</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ret_value</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;NtCreateFile of &lt;</span><span class="si">{0}</span><span class="s2">&gt; FAILED (result=</span><span class="si">{1:#x}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">ret_value</span><span class="p">))</span>
<span class="k">return</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;NtCreateFile of &lt;</span><span class="si">{0}</span><span class="s2">&gt;: handle = </span><span class="si">{1:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">handle_value</span><span class="p">))</span>
<span class="c1"># Manual verification</span>
<span class="n">fhandle</span> <span class="o">=</span> <span class="p">[</span><span class="n">h</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">handles</span> <span class="k">if</span> <span class="n">h</span><span class="o">.</span><span class="n">dwProcessId</span> <span class="o">==</span> <span class="n">dbg</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">pid</span> <span class="ow">and</span> <span class="n">h</span><span class="o">.</span><span class="n">wValue</span> <span class="o">==</span> <span class="n">handle_value</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">fhandle</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;handle not found!&quot;</span><span class="p">)</span>
<span class="n">fhandle</span> <span class="o">=</span> <span class="n">fhandle</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Handle manually found! typename=&lt;</span><span class="si">{0}</span><span class="s2">&gt;, name=&lt;</span><span class="si">{1}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">fhandle</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="n">fhandle</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">COUNTER</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
<span class="n">calc</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">pop_proc_32</span><span class="p">(</span><span class="n">dwCreationFlags</span><span class="o">=</span><span class="n">DEBUG_PROCESS</span><span class="p">)</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">Debugger</span><span class="p">(</span><span class="n">calc</span><span class="p">)</span>
<span class="n">d</span><span class="o">.</span><span class="n">add_bp</span><span class="p">(</span><span class="n">FollowNtCreateFile</span><span class="p">())</span>
<span class="n">d</span><span class="o">.</span><span class="n">loop</span><span class="p">()</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python debug\debug_functionbp.py
NtCreateFile of &lt;50173784&gt;: handle = 0x1c4
Handle manually found! typename=&lt;File&gt;, name=&lt;\Device\HarddiskVolume3\Windows\Globalization\Sorting\SortDefault.nls&gt;
NtCreateFile of &lt;50181528&gt;: handle = 0x1ec
Handle manually found! typename=&lt;File&gt;, name=&lt;\Device\HarddiskVolume3\Windows\Fonts\StaticCache.dat&gt;
NtCreateFile of &lt;50195912&gt;: handle = 0x1fc
Handle manually found! typename=&lt;File&gt;, name=&lt;\Device\HarddiskVolume3\Windows\Branding\Basebrd\basebrd.dll&gt;
Exiting process
</pre></div>
</div>
</section>
<section id="debugger-attach">
<span id="sample-debugger-attach"></span><h4><span class="section-number">18.13.1.5. </span><a class="reference internal" href="debug.html#windows.debug.Debugger.attach" title="windows.debug.Debugger.attach"><code class="xref py py-func docutils literal notranslate"><span class="pre">Debugger.attach</span></code></a><a class="headerlink" href="#debugger-attach" title="Link to this heading"></a></h4>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.test</span>
<span class="kn">import</span> <span class="nn">windows.debug</span>
<span class="kn">from</span> <span class="nn">windows.generated_def.winstructs</span> <span class="kn">import</span> <span class="o">*</span>
<span class="c1"># Just a debugger that follow NtCreateFile and print filename &amp; handler</span>
<span class="kn">from</span> <span class="nn">debug_functionbp</span> <span class="kn">import</span> <span class="n">FollowNtCreateFile</span>
<span class="k">def</span> <span class="nf">follow_create_file</span><span class="p">(</span><span class="n">pid</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Finding process with pid &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">pid</span><span class="p">))</span>
<span class="n">target</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">processes</span> <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">pid</span> <span class="o">==</span> <span class="n">pid</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Target is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
<span class="n">dbg</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">Debugger</span><span class="o">.</span><span class="n">attach</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Debugger attached: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">dbg</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">add_bp</span><span class="p">(</span><span class="n">FollowNtCreateFile</span><span class="p">())</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">loop</span><span class="p">()</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
<span class="c1"># Create a non-debugged process safe to debug</span>
<span class="n">calc</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">pop_proc_32</span><span class="p">(</span><span class="n">dwCreationFlags</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="c1"># Give ovnly the PID to follow_create_file</span>
<span class="n">follow_create_file</span><span class="p">(</span><span class="n">calc</span><span class="o">.</span><span class="n">pid</span><span class="p">)</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python debug\attach.py
Finding process with pid &lt;27576&gt;
Target is &lt;WinProcess &quot;winver.exe&quot; pid 27576 at 0x223f0862d90&gt;
Debugger attached: &lt;windows.debug.debugger.Debugger object at 0x00000223F084A110&gt;
NtCreateFile of &lt;54203712&gt;: handle = 0x1c8
Handle manually found! typename=&lt;File&gt;, name=&lt;\Device\HarddiskVolume3\Windows\Globalization\Sorting\SortDefault.nls&gt;
NtCreateFile of &lt;54268840&gt;: handle = 0x1f0
Handle manually found! typename=&lt;File&gt;, name=&lt;\Device\HarddiskVolume3\Windows\Fonts\StaticCache.dat&gt;
NtCreateFile of &lt;54280288&gt;: handle = 0x200
Handle manually found! typename=&lt;File&gt;, name=&lt;\Device\HarddiskVolume3\Windows\Branding\Basebrd\basebrd.dll&gt;
Exiting process
</pre></div>
</div>
</section>
<section id="native-code-tester">
<h4><span class="section-number">18.13.1.6. </span>Native code tester<a class="headerlink" href="#native-code-tester" title="Link to this heading"></a></h4>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">argparse</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.test</span>
<span class="kn">import</span> <span class="nn">windows.debug</span> <span class="k">as</span> <span class="nn">dbg</span>
<span class="kn">import</span> <span class="nn">windows.native_exec.simple_x86</span> <span class="k">as</span> <span class="nn">x86</span>
<span class="kn">import</span> <span class="nn">windows.native_exec.simple_x64</span> <span class="k">as</span> <span class="nn">x64</span>
<span class="kn">from</span> <span class="nn">windows.generated_def</span> <span class="kn">import</span> <span class="o">*</span>
<span class="k">def</span> <span class="nf">hexdump</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">start_addr</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">string</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">ascii</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="o">*</span><span class="mi">256</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mh">0x7f</span><span class="p">):</span>
<span class="n">ascii</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="n">ascii</span><span class="p">[</span><span class="mh">0x0</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;.&quot;</span>
<span class="n">ascii</span><span class="p">[</span><span class="mh">0x7</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;.&quot;</span>
<span class="n">ascii</span><span class="p">[</span><span class="mh">0x8</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;.&quot;</span>
<span class="n">ascii</span><span class="p">[</span><span class="mh">0x9</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;.&quot;</span>
<span class="n">ascii</span><span class="p">[</span><span class="mh">0xa</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;.&quot;</span>
<span class="n">ascii</span><span class="p">[</span><span class="mh">0x1b</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;.&quot;</span>
<span class="n">ascii</span><span class="p">[</span><span class="mh">0xd</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;.&quot;</span>
<span class="n">ascii</span><span class="p">[</span><span class="mh">0xff</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\x13</span><span class="s2">&quot;</span>
<span class="n">ascii</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">ascii</span><span class="p">)</span>
<span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="p">(</span><span class="n">offset</span><span class="o">+</span><span class="mh">0x10</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="nb">len</span><span class="p">(</span><span class="n">string</span><span class="p">):</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">string</span><span class="p">[</span><span class="n">offset</span><span class="p">:(</span><span class="n">offset</span><span class="o">+</span><span class="mh">0x10</span><span class="p">)]</span>
<span class="n">linebuf</span> <span class="o">=</span> <span class="s2">&quot; </span><span class="si">%08X</span><span class="s2"> &quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">offset</span> <span class="o">+</span> <span class="n">start_addr</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">16</span><span class="p">):</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">8</span><span class="p">:</span>
<span class="n">linebuf</span> <span class="o">+=</span> <span class="s2">&quot; &quot;</span>
<span class="n">linebuf</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="si">%02X</span><span class="s2"> &quot;</span> <span class="o">%</span> <span class="nb">ord</span><span class="p">(</span><span class="n">line</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
<span class="n">linebuf</span> <span class="o">+=</span> <span class="s2">&quot; &quot;</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">16</span><span class="p">):</span>
<span class="n">linebuf</span> <span class="o">+=</span> <span class="n">ascii</span><span class="p">[</span><span class="nb">ord</span><span class="p">(</span><span class="n">line</span><span class="p">[</span><span class="n">i</span><span class="p">])]</span>
<span class="n">result</span> <span class="o">+=</span> <span class="n">linebuf</span><span class="o">+</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="n">offset</span> <span class="o">+=</span> <span class="mh">0x10</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">string</span><span class="p">)</span> <span class="o">%</span> <span class="mh">0x10</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">linebuf</span> <span class="o">=</span> <span class="s2">&quot; </span><span class="si">%08X</span><span class="s2"> &quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">offset</span> <span class="o">+</span> <span class="n">start_addr</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">string</span><span class="p">)</span><span class="o">-</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">string</span><span class="p">)</span> <span class="o">%</span> <span class="mh">0x10</span><span class="p">)),(</span><span class="nb">len</span><span class="p">(</span><span class="n">string</span><span class="p">))):</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">8</span><span class="p">:</span>
<span class="n">linebuf</span> <span class="o">+=</span> <span class="s2">&quot; &quot;</span>
<span class="n">linebuf</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="si">%02X</span><span class="s2"> &quot;</span> <span class="o">%</span> <span class="nb">ord</span><span class="p">(</span><span class="n">string</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
<span class="n">linebuf</span> <span class="o">+=</span> <span class="s2">&quot; &quot;</span><span class="o">*</span><span class="p">(</span><span class="mh">0x10</span><span class="o">-</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">string</span><span class="p">)</span> <span class="o">%</span> <span class="mh">0x10</span><span class="p">))</span>
<span class="n">linebuf</span> <span class="o">+=</span> <span class="s2">&quot; &quot;</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">string</span><span class="p">)</span><span class="o">-</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">string</span><span class="p">)</span> <span class="o">%</span> <span class="mh">0x10</span><span class="p">)),(</span><span class="nb">len</span><span class="p">(</span><span class="n">string</span><span class="p">))):</span>
<span class="n">linebuf</span> <span class="o">+=</span> <span class="n">ascii</span><span class="p">[</span><span class="nb">ord</span><span class="p">(</span><span class="n">string</span><span class="p">[</span><span class="n">i</span><span class="p">])]</span>
<span class="n">result</span> <span class="o">+=</span> <span class="n">linebuf</span><span class="o">+</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">class</span> <span class="nc">StartStepBP</span><span class="p">(</span><span class="n">dbg</span><span class="o">.</span><span class="n">breakpoints</span><span class="o">.</span><span class="n">HXBreakpoint</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">del_bp</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">on_single_step</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span> <span class="c1"># Trigger single step processing</span>
<span class="k">class</span> <span class="nc">CodeTesteur</span><span class="p">(</span><span class="n">dbg</span><span class="o">.</span><span class="n">Debugger</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">code</span><span class="p">,</span> <span class="n">register_start</span><span class="o">=</span><span class="p">{},</span> <span class="n">steps</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">CodeTesteur</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="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">initial_code</span> <span class="o">=</span> <span class="n">code</span>
<span class="n">code</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\xcc</span><span class="s2">&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">code_addr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_code_in_target</span><span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="n">code</span><span class="p">)</span>
<span class="n">register_start</span><span class="p">[</span><span class="s2">&quot;pc&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">code_addr</span>
<span class="bp">self</span><span class="o">.</span><span class="n">thread_exec</span> <span class="o">=</span> <span class="n">process</span><span class="o">.</span><span class="n">threads</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">context_exec</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">thread_exec</span><span class="o">.</span><span class="n">context</span>
<span class="bp">self</span><span class="o">.</span><span class="n">setup_target_context</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">context_exec</span><span class="p">,</span> <span class="n">register_start</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Startup context is:&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">context_exec</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">context_exec</span><span class="o">.</span><span class="n">EEFlags</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">thread_exec</span><span class="o">.</span><span class="n">suspend</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">thread_exec</span><span class="o">.</span><span class="n">set_context</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">context_exec</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">thread_exec</span><span class="o">.</span><span class="n">resume</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">init_breakpoint</span> <span class="o">=</span> <span class="kc">False</span>
<span class="c1"># Test code</span>
<span class="k">if</span> <span class="n">steps</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">steps</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_bp</span><span class="p">(</span><span class="n">StartStepBP</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">code_addr</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">last_context</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">context_exec</span>
<span class="bp">self</span><span class="o">.</span><span class="n">last_code</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">initial_code</span>
<span class="k">def</span> <span class="nf">write_code_in_target</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">code</span><span class="p">):</span>
<span class="n">addr</span> <span class="o">=</span> <span class="n">process</span><span class="o">.</span><span class="n">virtual_alloc</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">code</span><span class="p">))</span>
<span class="n">process</span><span class="o">.</span><span class="n">write_memory</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">code</span><span class="p">)</span>
<span class="k">return</span> <span class="n">addr</span>
<span class="k">def</span> <span class="nf">setup_target_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">register_start</span><span class="p">):</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">register_start</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unknown register to setup &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</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="nb">setattr</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_single_step</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;* New step !&quot;</span><span class="p">)</span>
<span class="c1"># print(&quot;EIP = {0:#x}&quot;.format(self.current_thread.context.pc))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">report_ctx_diff</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">last_context</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_thread</span><span class="o">.</span><span class="n">context</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">last_context</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_thread</span><span class="o">.</span><span class="n">context</span>
<span class="bp">self</span><span class="o">.</span><span class="n">last_code</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">report_code_diff</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">last_code</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">single_step</span><span class="p">()</span>
<span class="nb">print</span> <span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_exception</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
<span class="n">exc_code</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionCode</span>
<span class="n">exc_addr</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionAddress</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">init_breakpoint</span> <span class="ow">and</span> <span class="n">exc_code</span> <span class="o">==</span> <span class="n">EXCEPTION_BREAKPOINT</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">init_breakpoint</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">return</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_thread</span><span class="o">.</span><span class="n">context</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;==Post-exec context==&quot;</span><span class="p">)</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">EEFlags</span><span class="p">)</span>
<span class="k">if</span> <span class="n">exc_code</span> <span class="o">==</span> <span class="n">EXCEPTION_BREAKPOINT</span> <span class="ow">and</span> <span class="n">exc_addr</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">context_exec</span><span class="o">.</span><span class="n">pc</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">initial_code</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&lt;Normal terminaison&gt;&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&lt;</span><span class="si">{0}</span><span class="s2">&gt; at &lt;</span><span class="si">{1:#x}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">exc_code</span><span class="p">,</span> <span class="n">exc_addr</span><span class="p">))</span>
<span class="k">if</span> <span class="n">exc_code</span> <span class="o">==</span> <span class="n">EXCEPTION_ACCESS_VIOLATION</span><span class="p">:</span>
<span class="n">exc_infos</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionInformation</span>
<span class="n">read_write</span> <span class="o">=</span> <span class="s2">&quot;write&quot;</span> <span class="k">if</span> <span class="n">exc_infos</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">else</span> <span class="s2">&quot;read&quot;</span>
<span class="n">target_addr</span> <span class="o">=</span> <span class="n">exc_infos</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Access of type &lt;</span><span class="si">{0}</span><span class="s2">&gt; at address &lt;</span><span class="si">{1:#x}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">read_write</span><span class="p">,</span> <span class="n">target_addr</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">report_ctx_diff</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">context_exec</span><span class="p">,</span> <span class="n">ctx</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">report_code_diff</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">initial_code</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="k">return</span>
<span class="k">def</span> <span class="nf">report_ctx_diff</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">now</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;== DIFF ==&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">start_value</span> <span class="ow">in</span> <span class="n">start</span><span class="o">.</span><span class="n">regs</span><span class="p">():</span>
<span class="n">now_value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">now</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="k">if</span> <span class="n">start_value</span> <span class="o">!=</span> <span class="n">now_value</span><span class="p">:</span>
<span class="n">diff</span> <span class="o">=</span> <span class="n">now_value</span> <span class="o">-</span> <span class="n">start_value</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{0}</span><span class="s2">: </span><span class="si">{1:#x}</span><span class="s2"> -&gt; </span><span class="si">{2:#x}</span><span class="s2"> (</span><span class="si">{3:+#x}</span><span class="s2">)&quot;</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="n">start_value</span><span class="p">,</span> <span class="n">now_value</span><span class="p">,</span> <span class="n">diff</span><span class="p">))</span>
<span class="k">if</span> <span class="n">start</span><span class="o">.</span><span class="n">sp</span> <span class="o">&gt;</span> <span class="n">now</span><span class="o">.</span><span class="n">sp</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Negative Stack: dumping:&quot;</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="n">now</span><span class="o">.</span><span class="n">sp</span><span class="p">,</span> <span class="n">start</span><span class="o">.</span><span class="n">sp</span> <span class="o">-</span> <span class="n">now</span><span class="o">.</span><span class="n">sp</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">hexdump</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">start</span><span class="o">.</span><span class="n">sp</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">report_code_diff</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">initial_code</span><span class="p">):</span>
<span class="n">code_size</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">initial_code</span><span class="p">)</span>
<span class="n">final_code</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">code_addr</span><span class="p">,</span> <span class="n">code_size</span><span class="p">)</span>
<span class="k">if</span> <span class="n">final_code</span> <span class="o">==</span> <span class="n">initial_code</span><span class="p">:</span>
<span class="k">return</span> <span class="n">initial_code</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;== Executable code DIFF == &quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Before:&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">hexdump</span><span class="p">(</span><span class="n">initial_code</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">code_addr</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;After:&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">hexdump</span><span class="p">(</span><span class="n">final_code</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">code_addr</span><span class="p">))</span>
<span class="k">return</span> <span class="n">final_code</span>
<span class="k">def</span> <span class="nf">test_code_x86</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">regs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">raw</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">steps</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Testing x86 code&quot;</span><span class="p">)</span>
<span class="n">process</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">pop_proc_32</span><span class="p">(</span><span class="n">dwCreationFlags</span><span class="o">=</span><span class="n">DEBUG_PROCESS</span><span class="p">)</span>
<span class="k">if</span> <span class="n">raw</span><span class="p">:</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">code</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;hex&#39;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">x86</span><span class="o">.</span><span class="n">assemble</span><span class="p">(</span><span class="n">code</span><span class="p">)</span>
<span class="n">start_register</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="n">regs</span><span class="p">:</span>
<span class="k">for</span> <span class="n">name_value</span> <span class="ow">in</span> <span class="n">regs</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;;&quot;</span><span class="p">):</span>
<span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">name_value</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="p">)</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;Eflags&quot;</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;EFlags&quot;</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">start_register</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">CodeTesteur</span><span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">start_register</span><span class="p">,</span> <span class="n">steps</span><span class="p">)</span>
<span class="n">x</span><span class="o">.</span><span class="n">loop</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">test_code_x64</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">regs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">raw</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Testing x64 code&quot;</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="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Cannot debug a 64b process from 32b python&quot;</span><span class="p">)</span>
<span class="n">process</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">pop_proc_64</span><span class="p">(</span><span class="n">dwCreationFlags</span><span class="o">=</span><span class="n">DEBUG_PROCESS</span><span class="p">)</span>
<span class="k">if</span> <span class="n">raw</span><span class="p">:</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">code</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;hex&#39;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">x64</span><span class="o">.</span><span class="n">assemble</span><span class="p">(</span><span class="n">code</span><span class="p">)</span>
<span class="n">start_register</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="n">regs</span><span class="p">:</span>
<span class="k">for</span> <span class="n">name_value</span> <span class="ow">in</span> <span class="n">regs</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;;&quot;</span><span class="p">):</span>
<span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">name_value</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="p">)</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;Eflags&quot;</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;EFlags&quot;</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">start_register</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">CodeTesteur</span><span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">start_register</span><span class="p">)</span>
<span class="n">x</span><span class="o">.</span><span class="n">loop</span><span class="p">()</span>
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="vm">__file__</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--x64&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">&#39;store_const&#39;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;func&quot;</span><span class="p">,</span> <span class="n">const</span><span class="o">=</span><span class="n">test_code_x64</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">test_code_x86</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Code is x64&#39;</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--raw&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">&#39;store_true&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;argument is raw assembled code (in hex)&#39;</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--steps&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">&#39;store_true&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Get all step info&#39;</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;code&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;The code to execute&#39;</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;regs&#39;</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s2">&quot;?&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;The default values of the registers&#39;</span><span class="p">)</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
<span class="n">res</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="o">**</span><span class="n">res</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span>
</pre></div>
</div>
<p>Ouput</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span><span class="o">.</span><span class="n">exe</span> <span class="n">test_code</span><span class="o">.</span><span class="n">py</span> <span class="s2">&quot;mov eax, 0x42424242&quot;</span> <span class="s2">&quot;eax=0x11223344&quot;</span>
<span class="n">Testing</span> <span class="n">x86</span> <span class="n">code</span>
<span class="n">Startup</span> <span class="n">context</span> <span class="ow">is</span><span class="p">:</span>
<span class="n">Eip</span> <span class="o">-&gt;</span> <span class="mh">0x3f0000</span><span class="n">L</span>
<span class="n">Esp</span> <span class="o">-&gt;</span> <span class="mh">0x3bfae4</span><span class="n">L</span>
<span class="n">Eax</span> <span class="o">-&gt;</span> <span class="mh">0x11223344</span><span class="n">L</span>
<span class="n">Ebx</span> <span class="o">-&gt;</span> <span class="mh">0x5a6000</span><span class="n">L</span>
<span class="n">Ecx</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Edx</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Ebp</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Edi</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Esi</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">EFlags</span> <span class="o">-&gt;</span> <span class="mh">0x202</span><span class="n">L</span>
<span class="n">EEflags</span><span class="p">(</span><span class="mh">0x202</span><span class="n">L</span><span class="p">:</span><span class="n">IF</span><span class="p">)</span>
<span class="o">==</span><span class="n">Post</span><span class="o">-</span><span class="n">exec</span> <span class="n">context</span><span class="o">==</span>
<span class="n">Eip</span> <span class="o">-&gt;</span> <span class="mh">0x3f0007</span><span class="n">L</span>
<span class="n">Esp</span> <span class="o">-&gt;</span> <span class="mh">0x3bfae4</span><span class="n">L</span>
<span class="n">Eax</span> <span class="o">-&gt;</span> <span class="mh">0x42424242</span><span class="n">L</span>
<span class="n">Ebx</span> <span class="o">-&gt;</span> <span class="mh">0x5a6000</span><span class="n">L</span>
<span class="n">Ecx</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Edx</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Ebp</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Edi</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Esi</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">EFlags</span> <span class="o">-&gt;</span> <span class="mh">0x202</span><span class="n">L</span>
<span class="n">EEflags</span><span class="p">(</span><span class="mh">0x202</span><span class="n">L</span><span class="p">:</span><span class="n">IF</span><span class="p">)</span>
<span class="o">&lt;</span><span class="n">Normal</span> <span class="n">terminaison</span><span class="o">&gt;</span>
<span class="o">==</span><span class="n">DIFF</span><span class="o">==</span>
<span class="n">Eip</span><span class="p">:</span> <span class="mh">0x3f0000</span> <span class="o">-&gt;</span> <span class="mh">0x3f0007</span> <span class="p">(</span><span class="o">+</span><span class="mh">0x7</span><span class="p">)</span>
<span class="n">Eax</span><span class="p">:</span> <span class="mh">0x11223344</span> <span class="o">-&gt;</span> <span class="mh">0x42424242</span> <span class="p">(</span><span class="o">+</span><span class="mh">0x31200efe</span><span class="p">)</span>
<span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python64</span> <span class="n">test_code</span><span class="o">.</span><span class="n">py</span> <span class="o">--</span><span class="n">x64</span> <span class="s2">&quot;mov r15, 0x11223344; push r14; call r15&quot;</span> <span class="s2">&quot;rcx=1; r14=0x4242424243434343&quot;</span>
<span class="n">Testing</span> <span class="n">x64</span> <span class="n">code</span>
<span class="n">Startup</span> <span class="n">context</span> <span class="ow">is</span><span class="p">:</span>
<span class="n">Rip</span> <span class="o">-&gt;</span> <span class="mh">0x205a1d60000</span><span class="n">L</span>
<span class="n">Rsp</span> <span class="o">-&gt;</span> <span class="mh">0xe24a88fa88</span><span class="n">L</span>
<span class="n">Rax</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Rbx</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Rcx</span> <span class="o">-&gt;</span> <span class="mh">0x1</span><span class="n">L</span>
<span class="n">Rdx</span> <span class="o">-&gt;</span> <span class="mh">0xe24aaf9000</span><span class="n">L</span>
<span class="n">Rbp</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Rdi</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Rsi</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">R8</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">R9</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">R10</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">R11</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">R12</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">R13</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">R14</span> <span class="o">-&gt;</span> <span class="mh">0x4242424243434343</span><span class="n">L</span>
<span class="n">R15</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">EFlags</span> <span class="o">-&gt;</span> <span class="mh">0x200</span><span class="n">L</span>
<span class="n">EEflags</span><span class="p">(</span><span class="mh">0x200</span><span class="n">L</span><span class="p">:</span><span class="n">IF</span><span class="p">)</span>
<span class="o">==</span><span class="n">Post</span><span class="o">-</span><span class="n">exec</span> <span class="n">context</span><span class="o">==</span>
<span class="n">Rip</span> <span class="o">-&gt;</span> <span class="mh">0x11223344</span><span class="n">L</span>
<span class="n">Rsp</span> <span class="o">-&gt;</span> <span class="mh">0xe24a88fa78</span><span class="n">L</span>
<span class="n">Rax</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Rbx</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Rcx</span> <span class="o">-&gt;</span> <span class="mh">0x1</span><span class="n">L</span>
<span class="n">Rdx</span> <span class="o">-&gt;</span> <span class="mh">0xe24aaf9000</span><span class="n">L</span>
<span class="n">Rbp</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Rdi</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">Rsi</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">R8</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">R9</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">R10</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">R11</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">R12</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">R13</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="n">R14</span> <span class="o">-&gt;</span> <span class="mh">0x4242424243434343</span><span class="n">L</span>
<span class="n">R15</span> <span class="o">-&gt;</span> <span class="mh">0x11223344</span><span class="n">L</span>
<span class="n">EFlags</span> <span class="o">-&gt;</span> <span class="mh">0x10202</span><span class="n">L</span>
<span class="n">EEflags</span><span class="p">(</span><span class="mh">0x10202</span><span class="n">L</span><span class="p">:</span><span class="n">IF</span><span class="o">|</span><span class="n">RF</span><span class="p">)</span>
<span class="o">&lt;</span><span class="n">EXCEPTION_ACCESS_VIOLATION</span><span class="p">(</span><span class="mh">0xc0000005</span><span class="n">L</span><span class="p">)</span><span class="o">&gt;</span> <span class="n">at</span> <span class="o">&lt;</span><span class="mh">0x11223344</span><span class="o">&gt;</span>
<span class="o">==</span><span class="n">DIFF</span><span class="o">==</span>
<span class="n">Rip</span><span class="p">:</span> <span class="mh">0x205a1d60000</span> <span class="o">-&gt;</span> <span class="mh">0x11223344</span> <span class="p">(</span><span class="o">-</span><span class="mh">0x20590b3ccbc</span><span class="p">)</span>
<span class="n">Rsp</span><span class="p">:</span> <span class="mh">0xe24a88fa88</span> <span class="o">-&gt;</span> <span class="mh">0xe24a88fa78</span> <span class="p">(</span><span class="o">-</span><span class="mh">0x10</span><span class="p">)</span>
<span class="n">R15</span><span class="p">:</span> <span class="mh">0x0</span> <span class="o">-&gt;</span> <span class="mh">0x11223344</span> <span class="p">(</span><span class="o">+</span><span class="mh">0x11223344</span><span class="p">)</span>
<span class="n">EFlags</span><span class="p">:</span> <span class="mh">0x200</span> <span class="o">-&gt;</span> <span class="mh">0x10202</span> <span class="p">(</span><span class="o">+</span><span class="mh">0x10002</span><span class="p">)</span>
<span class="n">Negative</span> <span class="n">Stack</span><span class="p">:</span> <span class="n">dumping</span><span class="p">:</span>
<span class="n">E24A88FA88</span> <span class="mi">0</span><span class="n">C</span> <span class="mi">00</span> <span class="n">D6</span> <span class="n">A1</span> <span class="mi">05</span> <span class="mi">02</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">43</span> <span class="mi">43</span> <span class="mi">43</span> <span class="mi">43</span> <span class="mi">42</span> <span class="mi">42</span> <span class="mi">42</span> <span class="mi">42</span> <span class="o">........</span><span class="n">CCCCBBBB</span>
</pre></div>
</div>
</section>
</section>
<section id="symboldebugger">
<span id="sample-symbol-debugger"></span><h3><span class="section-number">18.13.2. </span><code class="xref py py-class docutils literal notranslate"><span class="pre">SymbolDebugger</span></code><a class="headerlink" href="#symboldebugger" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">argparse</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.debug</span>
<span class="kn">import</span> <span class="nn">windows.test</span>
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="vm">__file__</span><span class="p">,</span> <span class="n">formatter_class</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentDefaultsHelpFormatter</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--dbghelp&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;The path of DBG help to use (default use env:PFW_DBGHELP_PATH)&#39;</span><span class="p">)</span>
<span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">dbghelp</span><span class="p">:</span>
<span class="n">symbols</span><span class="o">.</span><span class="n">set_dbghelp_path</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">dbghelp</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="s2">&quot;PFW_DBGHELP_PATH&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Not dbghelp path given and no environ var &#39;PFW_DBGHELP_PATH&#39; sample may fail&quot;</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">MyInfoBP</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">Breakpoint</span><span class="p">):</span>
<span class="n">COUNT</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="n">cursym</span> <span class="o">=</span> <span class="n">dbg</span><span class="o">.</span><span class="n">current_resolver</span><span class="p">[</span><span class="n">exc</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionAddress</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Breakpoint triggered at: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cursym</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">cursym</span><span class="p">))</span>
<span class="n">MyInfoBP</span><span class="o">.</span><span class="n">COUNT</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">MyInfoBP</span><span class="o">.</span><span class="n">COUNT</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Quitting&quot;</span><span class="p">)</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">dbg</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">SymbolDebugger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;C:</span><span class="se">\\</span><span class="s2">windows</span><span class="se">\\</span><span class="s2">system32</span><span class="se">\\</span><span class="s2">notepad.exe&quot;</span><span class="p">)</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">add_bp</span><span class="p">(</span><span class="n">MyInfoBP</span><span class="p">(</span><span class="s2">&quot;kernelbase!CreateFileInternal&quot;</span><span class="p">))</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">add_bp</span><span class="p">(</span><span class="n">MyInfoBP</span><span class="p">(</span><span class="s2">&quot;ntdll!LdrpInitializeProcess&quot;</span><span class="p">))</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">loop</span><span class="p">()</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python debug\symbol_debugger.py
Namespace(dbghelp=None)
Breakpoint triggered at: ntdll!LdrpInitializeProcess
&lt;SymbolInfoW name=&quot;LdrpInitializeProcess&quot; start=0x7ff8e5aecca0 tag=SymTagPublicSymbol&gt;
Breakpoint triggered at: KERNELBASE!CreateFileInternal
&lt;SymbolInfoW name=&quot;CreateFileInternal&quot; start=0x7ff8e33b4b70 tag=SymTagPublicSymbol&gt;
Breakpoint triggered at: KERNELBASE!CreateFileInternal
&lt;SymbolInfoW name=&quot;CreateFileInternal&quot; start=0x7ff8e33b4b70 tag=SymTagPublicSymbol&gt;
Breakpoint triggered at: KERNELBASE!CreateFileInternal
&lt;SymbolInfoW name=&quot;CreateFileInternal&quot; start=0x7ff8e33b4b70 tag=SymTagPublicSymbol&gt;
Quitting
</pre></div>
</div>
</section>
<section id="localdebugger">
<span id="sample-local-debugger"></span><h3><span class="section-number">18.13.3. </span><code class="xref py py-class docutils literal notranslate"><span class="pre">LocalDebugger</span></code><a class="headerlink" href="#localdebugger" title="Link to this heading"></a></h3>
<section id="in-current-process">
<h4><span class="section-number">18.13.3.1. </span>In current process<a class="headerlink" href="#in-current-process" title="Link to this heading"></a></h4>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.debug</span>
<span class="kn">from</span> <span class="nn">windows.generated_def.winstructs</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">import</span> <span class="nn">windows.native_exec.simple_x86</span> <span class="k">as</span> <span class="nn">x86</span>
<span class="k">class</span> <span class="nc">SingleSteppingDebugger</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">LocalDebugger</span><span class="p">):</span>
<span class="n">SINGLE_STEP_COUNT</span> <span class="o">=</span> <span class="mi">4</span>
<span class="k">def</span> <span class="nf">on_exception</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="n">code</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_exception_code</span><span class="p">()</span>
<span class="n">context</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_exception_context</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;EXCEPTION !!!! Got a </span><span class="si">{0!r}</span><span class="s2"> at 0x</span><span class="si">{1:x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">context</span><span class="o">.</span><span class="n">pc</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">SINGLE_STEP_COUNT</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">SINGLE_STEP_COUNT</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">single_step</span><span class="p">()</span>
<span class="k">return</span> <span class="n">EXCEPTION_CONTINUE_EXECUTION</span>
<span class="k">class</span> <span class="nc">RewriteBreakpoint</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">HXBreakpoint</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="n">context</span> <span class="o">=</span> <span class="n">dbg</span><span class="o">.</span><span class="n">get_exception_context</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GOT AN HXBP at 0x</span><span class="si">{0:x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">context</span><span class="o">.</span><span class="n">pc</span><span class="p">))</span>
<span class="c1"># Rewrite the infinite loop with 2 nop</span>
<span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">write_memory</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">addr</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x90\x90</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="c1"># Ask for a single stepping</span>
<span class="k">return</span> <span class="n">dbg</span><span class="o">.</span><span class="n">single_step</span><span class="p">()</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">SingleSteppingDebugger</span><span class="p">()</span>
<span class="c1"># Infinite loop + nop + ret</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">x86</span><span class="o">.</span><span class="n">assemble</span><span class="p">(</span><span class="s2">&quot;label :begin; jmp :begin; nop; ret&quot;</span><span class="p">)</span>
<span class="n">func</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">native_exec</span><span class="o">.</span><span class="n">create_function</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="p">[</span><span class="n">PVOID</span><span class="p">])</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Code addr = 0x</span><span class="si">{0:x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">func</span><span class="o">.</span><span class="n">code_addr</span><span class="p">))</span>
<span class="c1"># Create a thread that will infinite loop</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">create_thread</span><span class="p">(</span><span class="n">func</span><span class="o">.</span><span class="n">code_addr</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="c1"># Add a breakpoint on the infitine loop</span>
<span class="n">d</span><span class="o">.</span><span class="n">add_bp</span><span class="p">(</span><span class="n">RewriteBreakpoint</span><span class="p">(</span><span class="n">func</span><span class="o">.</span><span class="n">code_addr</span><span class="p">))</span>
<span class="n">t</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Done!&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python debug\local_debugger.py
Code addr = 0x25f8532000e
GOT AN HXBP at 0x25f8532000e
EXCEPTION !!!! Got a EXCEPTION_SINGLE_STEP(0x80000004) at 0x7ff8e377257d
EXCEPTION !!!! Got a EXCEPTION_SINGLE_STEP(0x80000004) at 0x7ff8e5a6aa80
EXCEPTION !!!! Got a EXCEPTION_SINGLE_STEP(0x80000004) at 0x7ff8e5aafde0
EXCEPTION !!!! Got a EXCEPTION_SINGLE_STEP(0x80000004) at 0x7ff8e5aafdf4
Done!
</pre></div>
</div>
</section>
<section id="id1">
<h4><span class="section-number">18.13.3.2. </span>In remote process<a class="headerlink" href="#id1" title="Link to this heading"></a></h4>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">ctypes</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.test</span>
<span class="kn">from</span> <span class="nn">windows.generated_def.winstructs</span> <span class="kn">import</span> <span class="o">*</span>
<span class="n">remote_code</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">import windows</span>
<span class="s2">from windows.generated_def.winstructs import *</span>
<span class="s2">windows.utils.create_console()</span>
<span class="s2">class YOLOHXBP(windows.debug.HXBreakpoint):</span>
<span class="s2"> def trigger(self, dbg, exc):</span>
<span class="s2"> p = windows.current_process</span>
<span class="s2"> arg_pos = 2</span>
<span class="s2"> context = dbg.get_exception_context()</span>
<span class="s2"> esp = context.Esp</span>
<span class="s2"> unicode_string_addr = p.read_ptr(esp + (arg_pos + 1) * 4)</span>
<span class="s2"> wstring_addr = p.read_ptr(unicode_string_addr + 4)</span>
<span class="s2"> dll_loaded = p.read_wstring(wstring_addr)</span>
<span class="s2"> print(&quot;I AM LOADING &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;.format(dll_loaded))</span>
<span class="s2">d = windows.debug.LocalDebugger()</span>
<span class="s2">exp = windows.current_process.peb.modules[1].pe.exports</span>
<span class="s2">#windows.utils.FixedInteractiveConsole(locals()).interact()</span>
<span class="s2">ldr = exp[&quot;LdrLoadDll&quot;]</span>
<span class="s2">d.add_bp(YOLOHXBP(ldr))</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">pop_proc_32</span><span class="p">(</span><span class="n">dwCreationFlags</span><span class="o">=</span><span class="n">CREATE_SUSPENDED</span><span class="p">)</span>
<span class="n">c</span><span class="o">.</span><span class="n">execute_python</span><span class="p">(</span><span class="n">remote_code</span><span class="p">)</span>
<span class="n">c</span><span class="o">.</span><span class="n">threads</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">resume</span><span class="p">()</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">c</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
</pre></div>
</div>
<p>Ouput:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span> <span class="n">λ</span><span class="p">)</span> <span class="n">python</span><span class="o">.</span><span class="n">exe</span> <span class="n">debug</span>\<span class="n">local_debugger_remote_process</span><span class="o">.</span><span class="n">py</span>
<span class="p">(</span><span class="n">In</span> <span class="n">another</span> <span class="n">console</span><span class="p">)</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">Windows</span>\<span class="n">system32</span>\<span class="n">uxtheme</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">Windows</span>\<span class="n">system32</span>\<span class="n">uxtheme</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">Windows</span>\<span class="n">system32</span>\<span class="n">uxtheme</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">Windows</span>\<span class="n">system32</span>\<span class="n">uxtheme</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">kernel32</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">Windows</span>\<span class="n">WinSxS</span>\<span class="n">x86_microsoft</span><span class="o">.</span><span class="n">windows</span><span class="o">.</span><span class="n">gdiplus_6595b64144ccf1df_1</span><span class="mf">.1.9600.17415</span><span class="n">_none_dad8722c5bcc2d8f</span>\<span class="n">gdiplus</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">comctl32</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">comctl32</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">comctl32</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">comctl32</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">comctl32</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">comctl32</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">Windows</span>\<span class="n">SysWOW64</span>\<span class="n">oleacc</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">OLEAUT32</span><span class="o">.</span><span class="n">DLL</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">Windows</span>\<span class="n">system32</span>\<span class="n">ole32</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">Windows</span>\<span class="n">system32</span>\<span class="n">MSCTF</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">Windows</span>\<span class="n">SysWOW64</span>\<span class="n">msxml6</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">Windows</span>\<span class="n">system32</span>\<span class="n">shell32</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">Windows</span>\<span class="n">SYSTEM32</span>\<span class="n">WINMM</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
<span class="n">I</span> <span class="n">AM</span> <span class="n">LOADING</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">Windows</span>\<span class="n">system32</span>\<span class="n">ole32</span><span class="o">.</span><span class="n">dll</span><span class="o">&gt;</span>
</pre></div>
</div>
</section>
</section>
</section>
<section id="symbols">
<span id="sample-symbols"></span><h2><span class="section-number">18.14. </span>Symbols<a class="headerlink" href="#symbols" title="Link to this heading"></a></h2>
<section id="virtualsymbolhandler">
<h3><span class="section-number">18.14.1. </span>VirtualSymbolHandler<a class="headerlink" href="#virtualsymbolhandler" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</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.debug</span> <span class="kn">import</span> <span class="n">symbols</span>
<span class="kn">import</span> <span class="nn">argparse</span>
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="vm">__file__</span><span class="p">,</span> <span class="n">formatter_class</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentDefaultsHelpFormatter</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--dbghelp&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;The path of DBG help to use (default use env:PFW_DBGHELP_PATH)&#39;</span><span class="p">)</span>
<span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">dbghelp</span><span class="p">:</span>
<span class="n">symbols</span><span class="o">.</span><span class="n">set_dbghelp_path</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">dbghelp</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="s2">&quot;PFW_DBGHELP_PATH&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Not dbghelp path given and no environ var &#39;PFW_DBGHELP_PATH&#39; sample may fail&quot;</span><span class="p">)</span>
<span class="n">symbols</span><span class="o">.</span><span class="n">engine</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># Disable defered load</span>
<span class="n">sh</span> <span class="o">=</span> <span class="n">symbols</span><span class="o">.</span><span class="n">VirtualSymbolHandler</span><span class="p">()</span>
<span class="n">ntmod</span> <span class="o">=</span> <span class="n">sh</span><span class="o">.</span><span class="n">load_file</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;c:\windows\system32\ntdll.dll&quot;</span><span class="p">,</span> <span class="n">addr</span><span class="o">=</span><span class="mh">0x420000</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Ntdll module is: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ntmod</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * name = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ntmod</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * addr = </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ntmod</span><span class="o">.</span><span class="n">addr</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * path = </span><span class="si">{0:}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ntmod</span><span class="o">.</span><span class="n">path</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * type = </span><span class="si">{0:}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ntmod</span><span class="o">.</span><span class="n">type</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * pdb = </span><span class="si">{0:}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ntmod</span><span class="o">.</span><span class="n">pdb</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">TEST_FUNCTION</span> <span class="o">=</span> <span class="s2">&quot;LdrLoadDll&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Resolving function &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">TEST_FUNCTION</span><span class="p">))</span>
<span class="n">loaddll</span> <span class="o">=</span> <span class="n">sh</span><span class="p">[</span><span class="s2">&quot;ntdll!&quot;</span> <span class="o">+</span> <span class="n">TEST_FUNCTION</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Symbol found !&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * __repr__: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">loaddll</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * __str__: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">loaddll</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * addr: </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">loaddll</span><span class="o">.</span><span class="n">addr</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * name: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">loaddll</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * fullname: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">loaddll</span><span class="o">.</span><span class="n">fullname</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * module: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">loaddll</span><span class="o">.</span><span class="n">module</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Loading kernelbase&quot;</span><span class="p">)</span>
<span class="n">kbasemod</span> <span class="o">=</span> <span class="n">sh</span><span class="o">.</span><span class="n">load_file</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;c:\windows\system32\kernelbase.dll&quot;</span><span class="p">,</span> <span class="n">addr</span><span class="o">=</span><span class="mh">0x1230000</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Loaded modules are: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sh</span><span class="o">.</span><span class="n">modules</span><span class="p">))</span>
<span class="n">LOOKUP_ADDR</span> <span class="o">=</span> <span class="mh">0x1231242</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Looking up address: </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">LOOKUP_ADDR</span><span class="p">))</span>
<span class="n">lookupsym</span> <span class="o">=</span> <span class="n">sh</span><span class="p">[</span><span class="n">LOOKUP_ADDR</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Symbol resolved !&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * __repr__: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lookupsym</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * __str__: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lookupsym</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * start: </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lookupsym</span><span class="o">.</span><span class="n">start</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * addr: </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lookupsym</span><span class="o">.</span><span class="n">addr</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * displacement: </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lookupsym</span><span class="o">.</span><span class="n">displacement</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * name: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lookupsym</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * fullname: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lookupsym</span><span class="o">.</span><span class="n">fullname</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * module: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lookupsym</span><span class="o">.</span><span class="n">module</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python debug\symbols\virtsymdemo.py
Namespace(dbghelp=None)
Ntdll module is: &lt;SymbolModule name=&quot;ntdll&quot; type=SymPdb pdb=&quot;ntdll.pdb&quot; addr=0x420000&gt;
* name = ntdll
* addr = 0x420000
* path = c:\windows\system32\ntdll.dll
* type = &lt;SYM_TYPE SymPdb(0x3)&gt;
* pdb = c:\Symbols\ntdll.pdb\8D5D5ED5D5B8AA609A82600C14E3004D1\ntdll.pdb
Resolving function &lt;LdrLoadDll&gt;
Symbol found !
* __repr__: &lt;SymbolInfoW name=&quot;LdrLoadDll&quot; start=0x44a160 tag=SymTagFunction&gt;
* __str__: ntdll!LdrLoadDll
* addr: 0x44a160
* name: LdrLoadDll
* fullname: ntdll!LdrLoadDll
* module: &lt;SymbolModule name=&quot;ntdll&quot; type=SymPdb pdb=&quot;ntdll.pdb&quot; addr=0x420000&gt;
Loading kernelbase
Loaded modules are: [&lt;SymbolModule name=&quot;ntdll&quot; type=SymPdb pdb=&quot;ntdll.pdb&quot; addr=0x420000&gt;, &lt;SymbolModule name=&quot;kernelbase&quot; type=SymPdb pdb=&quot;kernelbase.pdb&quot; addr=0x1230000&gt;]
Looking up address: 0x1231242
Symbol resolved !
* __repr__: &lt;SymbolInfoW name=&quot;PsspThunkWin32Nt_HANDLE_ENTRY&quot; start=0x1231240 displacement=0x2 tag=SymTagPublicSymbol&gt;
* __str__: kernelbase!PsspThunkWin32Nt_HANDLE_ENTRY+0x2
* start: 0x1231240
* addr: 0x1231242
* displacement: 0x2
* name: PsspThunkWin32Nt_HANDLE_ENTRY
* fullname: kernelbase!PsspThunkWin32Nt_HANDLE_ENTRY+0x2
* module: &lt;SymbolModule name=&quot;kernelbase&quot; type=SymPdb pdb=&quot;kernelbase.pdb&quot; addr=0x1230000&gt;
</pre></div>
</div>
</section>
<section id="processsymbolhandler">
<h3><span class="section-number">18.14.2. </span>ProcessSymbolHandler<a class="headerlink" href="#processsymbolhandler" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">argparse</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.test</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.debug</span> <span class="kn">import</span> <span class="n">symbols</span>
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="vm">__file__</span><span class="p">,</span> <span class="n">formatter_class</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentDefaultsHelpFormatter</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--dbghelp&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;The path of DBG help to use (default use env:PFW_DBGHELP_PATH)&#39;</span><span class="p">)</span>
<span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">dbghelp</span><span class="p">:</span>
<span class="n">symbols</span><span class="o">.</span><span class="n">set_dbghelp_path</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">dbghelp</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="s2">&quot;PFW_DBGHELP_PATH&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Not dbghelp path given and no environ var &#39;PFW_DBGHELP_PATH&#39; sample may fail&quot;</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="n">target</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">pop_proc_32</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">target</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">pop_proc_64</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Target is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
<span class="n">sh</span> <span class="o">=</span> <span class="n">symbols</span><span class="o">.</span><span class="n">ProcessSymbolHandler</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
<span class="kn">import</span> <span class="nn">time</span><span class="p">;</span><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span> <span class="c1"># Just wait for the process initialisation</span>
<span class="n">sh</span><span class="o">.</span><span class="n">refresh</span><span class="p">()</span> <span class="c1"># Refresh symbol list (Only meaningful for ProcessSymbolHandler)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Some loaded modules are:&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">())</span>
<span class="k">for</span> <span class="n">sm</span> <span class="ow">in</span> <span class="n">sh</span><span class="o">.</span><span class="n">modules</span><span class="p">[:</span><span class="mi">3</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sm</span><span class="p">))</span>
<span class="n">createserv</span> <span class="o">=</span> <span class="n">sh</span><span class="p">[</span><span class="s2">&quot;advapi32!CreateServiceEx&quot;</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">TEST_FUNCTION</span> <span class="o">=</span> <span class="s2">&quot;advapi32!CreateServiceEx&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Resolving function &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">TEST_FUNCTION</span><span class="p">))</span>
<span class="n">createserv</span> <span class="o">=</span> <span class="n">sh</span><span class="p">[</span><span class="n">TEST_FUNCTION</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Symbol found !&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * __repr__: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">createserv</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * __str__: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">createserv</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * addr: </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">createserv</span><span class="o">.</span><span class="n">addr</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * name: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">createserv</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * fullname: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">createserv</span><span class="o">.</span><span class="n">fullname</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * module: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">createserv</span><span class="o">.</span><span class="n">module</span><span class="p">))</span>
<span class="n">target</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python debug\symbols\processsymdemo.py
Namespace(dbghelp=None)
Target is &lt;WinProcess &quot;winver.exe&quot; pid 18600 at 0x23a15d4cdd0&gt;
Some loaded modules are:
* &lt;SymbolModule name=&quot;winver&quot; type=SymDeferred pdb=&quot;&quot; addr=0x7ff658a30000&gt;
* &lt;SymbolModule name=&quot;ntdll&quot; type=SymDeferred pdb=&quot;&quot; addr=0x7ff8e5a10000&gt;
* &lt;SymbolModule name=&quot;KERNEL32&quot; type=SymDeferred pdb=&quot;&quot; addr=0x7ff8e3760000&gt;
Resolving function &lt;advapi32!CreateServiceEx&gt;
Symbol found !
* __repr__: &lt;SymbolInfoW name=&quot;CreateServiceEx&quot; start=0x7ff8e4b2d2e0 tag=SymTagPublicSymbol&gt;
* __str__: advapi32!CreateServiceEx
* addr: 0x7ff8e4b2d2e0
* name: CreateServiceEx
* fullname: advapi32!CreateServiceEx
* module: &lt;SymbolModule name=&quot;advapi32&quot; type=SymPdb pdb=&quot;advapi32.pdb&quot; addr=0x7ff8e4b10000&gt;
</pre></div>
</div>
</section>
<section id="symbol-search">
<h3><span class="section-number">18.14.3. </span>Symbol search<a class="headerlink" href="#symbol-search" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">argparse</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.debug.symbols</span> <span class="k">as</span> <span class="nn">symbols</span>
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="vm">__file__</span><span class="p">,</span> <span class="n">formatter_class</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentDefaultsHelpFormatter</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;pattern&#39;</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;file&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;The PE file to load&quot;</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--addr&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">default</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;The load address of the PE&quot;</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--tag&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">default</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--dbghelp&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;The path of DBG help to use (default use env:PFW_DBGHELP_PATH)&#39;</span><span class="p">)</span>
<span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
<span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">dbghelp</span><span class="p">:</span>
<span class="n">symbols</span><span class="o">.</span><span class="n">set_dbghelp_path</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">dbghelp</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="s2">&quot;PFW_DBGHELP_PATH&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Not dbghelp path given and no environ var &#39;PFW_DBGHELP_PATH&#39; sample may fail&quot;</span><span class="p">)</span>
<span class="n">sh</span> <span class="o">=</span> <span class="n">symbols</span><span class="o">.</span><span class="n">VirtualSymbolHandler</span><span class="p">()</span>
<span class="n">mod</span> <span class="o">=</span> <span class="n">sh</span><span class="o">.</span><span class="n">load_file</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">args</span><span class="o">.</span><span class="n">file</span><span class="p">,</span> <span class="n">addr</span><span class="o">=</span><span class="n">args</span><span class="o">.</span><span class="n">addr</span><span class="p">)</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">sh</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">pattern</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="n">mod</span><span class="p">,</span> <span class="n">tag</span><span class="o">=</span><span class="n">args</span><span class="o">.</span><span class="n">tag</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{0}</span><span class="s2"> symbols found:&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">res</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="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sym</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ python64 debug\symbols\symsearch.py &quot;CreateFile*&quot; c:\windows\system32\kernelbase.dll
Namespace(addr=0, dbghelp=None, file=&#39;c:\\windows\\system32\\kernelbase.dll&#39;, pattern=&#39;CreateFile*&#39;, tag=0)
16 symbols found:
* &lt;SymbolInfoA name=&quot;CreateFileInternal&quot; start=0x180024250 tag=SymTagFunction&gt;
* &lt;SymbolInfoA name=&quot;CreateFileMappingFromApp&quot; start=0x1800809d0 tag=SymTagFunction&gt;
* &lt;SymbolInfoA name=&quot;CreateFileMoniker&quot; start=0x180087e40 tag=SymTagFunction&gt;
* &lt;SymbolInfoA name=&quot;CreateFile2&quot; start=0x180074550 tag=SymTagFunction&gt;
* &lt;SymbolInfoA name=&quot;CreateFileA&quot; start=0x1800240d0 tag=SymTagFunction&gt;
* &lt;SymbolInfoA name=&quot;CreateFileMappingNumaW&quot; start=0x18002ca40 tag=SymTagFunction&gt;
* &lt;SymbolInfoA name=&quot;CreateFileMapping2&quot; start=0x1800fb6d0 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;CreateFileInternal&quot; start=0x180024250 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;CreateFileMappingW&quot; start=0x18002cd00 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;CreateFileDowngrade_Win7&quot; start=0x180082ff0 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;CreateFileDowngrade_Vista&quot; start=0x18007eba0 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;CreateFileMappingFromApp&quot; start=0x1800809d0 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;CreateFile2&quot; start=0x180074550 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;CreateFileW&quot; start=0x1800241d0 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;CreateFileA&quot; start=0x1800240d0 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;CreateFileMappingNumaW&quot; start=0x18002ca40 tag=SymTagPublicSymbol&gt;
$ python64 debug\symbols\symsearch.py &quot;NtCreate*&quot; c:\windows\system32\ntdll.dll --addr 0x42000000
Namespace(addr=1107296256, dbghelp=None, file=&#39;c:\\windows\\system32\\ntdll.dll&#39;, pattern=&#39;NtCreate*&#39;, tag=0)
47 symbols found:
* &lt;SymbolInfoA name=&quot;NtCreateProcessEx&quot; start=0x4209ca00 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;NtCreateIRTimer&quot; start=0x4209d530 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;NtCreateRegistryTransaction&quot; start=0x4209d750 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;NtCreateTimer&quot; start=0x4209d810 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;NtCreateKeyedEvent&quot; start=0x4209d5d0 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;NtCreateFile&quot; start=0x4209cb00 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;NtCreateSymbolicLinkObject&quot; start=0x4209d7d0 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;NtCreatePrivateNamespace&quot; start=0x4209d6d0 tag=SymTagPublicSymbol&gt;
* &lt;SymbolInfoA name=&quot;NtCreateKey&quot; start=0x4209c400 tag=SymTagPublicSymbol&gt;
...
</pre></div>
</div>
</section>
</section>
<section id="wmi">
<span id="wmi-samples"></span><h2><span class="section-number">18.15. </span>WMI<a class="headerlink" href="#wmi" title="Link to this heading"></a></h2>
<section id="wmi-requests">
<h3><span class="section-number">18.15.1. </span>WMI requests<a class="headerlink" href="#wmi-requests" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;WMI requester is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">wmi</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Selecting * from &#39;Win32_Process&#39;&quot;</span><span class="p">)</span>
<span class="n">result</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">wmi</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s2">&quot;Win32_Process&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;They are &lt;</span><span class="si">{0}</span><span class="s2">&gt; processes&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">result</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Looking for ourself via pid&quot;</span><span class="p">)</span>
<span class="n">us</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">result</span> <span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="s2">&quot;ProcessId&quot;</span><span class="p">])</span> <span class="o">==</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">pid</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Some info about our process:&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2"> -&gt; </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">&quot;Name&quot;</span><span class="p">,</span> <span class="n">us</span><span class="p">[</span><span class="s2">&quot;Name&quot;</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2"> -&gt; </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">&quot;ProcessId&quot;</span><span class="p">,</span> <span class="n">us</span><span class="p">[</span><span class="s2">&quot;ProcessId&quot;</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2"> -&gt; </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">&quot;OSName&quot;</span><span class="p">,</span> <span class="n">us</span><span class="p">[</span><span class="s2">&quot;OSName&quot;</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2"> -&gt; </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">&quot;UserModeTime&quot;</span><span class="p">,</span> <span class="n">us</span><span class="p">[</span><span class="s2">&quot;UserModeTime&quot;</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2"> -&gt; </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">&quot;WindowsVersion&quot;</span><span class="p">,</span> <span class="n">us</span><span class="p">[</span><span class="s2">&quot;WindowsVersion&quot;</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2"> -&gt; </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">&quot;CommandLine&quot;</span><span class="p">,</span> <span class="n">us</span><span class="p">[</span><span class="s2">&quot;CommandLine&quot;</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&lt;Select Caption,FileSystem,FreeSpace from Win32_LogicalDisk&gt;:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">vol</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">wmi</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">&quot;select Caption,FileSystem,FreeSpace from Win32_LogicalDisk&quot;</span><span class="p">):</span>
<span class="c1"># Filter out system-properties for the sample</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">({</span><span class="n">k</span><span class="p">:</span><span class="n">v</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">vol</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">k</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">)}))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> ==== Advanced use ====&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listing some namespaces:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">namespace</span> <span class="ow">in</span> <span class="p">[</span><span class="n">ns</span> <span class="k">for</span> <span class="n">ns</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">wmi</span><span class="o">.</span><span class="n">namespaces</span> <span class="k">if</span> <span class="s2">&quot;2&quot;</span> <span class="ow">in</span> <span class="n">ns</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">namespace</span><span class="p">))</span>
<span class="n">security2</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">wmi</span><span class="p">[</span><span class="s2">&quot;root</span><span class="se">\\</span><span class="s2">SecurityCenter2&quot;</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Querying non-default namespace: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">security2</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listing some available classes:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">clsname</span> <span class="ow">in</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="n">security2</span><span class="o">.</span><span class="n">classes</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="s2">&quot;__CLASS&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;Product&quot;</span><span class="p">)]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">clsname</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listing &lt;AntiVirusProduct&gt;:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">av</span> <span class="ow">in</span> <span class="n">security2</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s2">&quot;AntiVirusProduct&quot;</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">av</span><span class="p">[</span><span class="s2">&quot;displayName&quot;</span><span class="p">]))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python wmi\wmi_request.py
WMI requester is &lt;windows.winobject.wmi.WmiManager object at 0x000001CD1A46E150&gt;
Selecting * from &#39;Win32_Process&#39;
They are &lt;329&gt; processes
Looking for ourself via pid
Some info about our process:
* Name -&gt; python.exe
* ProcessId -&gt; 28460
* OSName -&gt; Microsoft Windows 11 Pro|C:\Windows|\Device\Harddisk0\Partition3
* UserModeTime -&gt; 0
* WindowsVersion -&gt; 10.0.22631
* CommandLine -&gt; C:\Users\cleme\AppData\Local\Programs\Python\Python311\python.exe wmi\wmi_request.py
&lt;Select Caption,FileSystem,FreeSpace from Win32_LogicalDisk&gt;:
* {&#39;Caption&#39;: &#39;C:&#39;, &#39;FileSystem&#39;: &#39;NTFS&#39;, &#39;FreeSpace&#39;: &#39;925749731328&#39;}
==== Advanced use ====
Listing some namespaces:
* CIMV2
* SecurityCenter2
* StandardCimv2
Querying non-default namespace: &lt;WmiNamespace &quot;root\SecurityCenter2&quot;&gt;
Listing some available classes:
* &lt;WmiObject class &quot;AntiSpywareProduct&quot;&gt;
* &lt;WmiObject class &quot;AntiVirusProduct&quot;&gt;
* &lt;WmiObject class &quot;FirewallProduct&quot;&gt;
Listing &lt;AntiVirusProduct&gt;:
* Windows Defender
</pre></div>
</div>
</section>
<section id="wmi-create-process">
<h3><span class="section-number">18.15.2. </span>WMI Create Process<a class="headerlink" href="#wmi-create-process" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="n">wmispace</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">wmi</span><span class="p">[</span><span class="s2">&quot;root</span><span class="se">\\</span><span class="s2">cimv2&quot;</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;WMI namespace is &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">wmispace</span><span class="p">))</span>
<span class="n">proc_class</span> <span class="o">=</span> <span class="n">wmispace</span><span class="o">.</span><span class="n">get_object</span><span class="p">(</span><span class="s2">&quot;Win32_process&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Process class is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">proc_class</span><span class="p">))</span>
<span class="n">inparam_cls</span> <span class="o">=</span> <span class="n">proc_class</span><span class="o">.</span><span class="n">get_method</span><span class="p">(</span><span class="s2">&quot;Create&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">inparam</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Method Create InParams is &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">inparam_cls</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Method Create InParams properties are &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">inparam_cls</span><span class="o">.</span><span class="n">properties</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Creating instance of inparam&quot;</span><span class="p">)</span>
<span class="n">inparam</span> <span class="o">=</span> <span class="n">inparam_cls</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;InParam instance is &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">inparam</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Setting &lt;CommandLine&gt;&quot;</span><span class="p">)</span>
<span class="n">inparam</span><span class="p">[</span><span class="s2">&quot;CommandLine&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;c:\windows\system32\notepad.exe&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Executing method&quot;</span><span class="p">)</span>
<span class="c1"># This API may change for something that better wraps cls/object/Parameters handling</span>
<span class="n">outparam</span> <span class="o">=</span> <span class="n">wmispace</span><span class="o">.</span><span class="n">exec_method</span><span class="p">(</span><span class="n">proc_class</span><span class="p">,</span> <span class="s2">&quot;Create&quot;</span><span class="p">,</span> <span class="n">inparam</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;OutParams is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outparam</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Out params values are: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outparam</span><span class="o">.</span><span class="n">properties</span><span class="p">))</span>
<span class="n">target</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">WinProcess</span><span class="p">(</span><span class="n">pid</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">outparam</span><span class="p">[</span><span class="s2">&quot;ProcessId&quot;</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Created process is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Waiting 1s&quot;</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Killing the process&quot;</span><span class="p">)</span>
<span class="n">target</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python wmi\create_process.py
WMI namespace is &lt;&lt;WmiNamespace &quot;root\cimv2&quot;&gt;&gt;
Process class is &lt;WmiObject class &quot;Win32_Process&quot;&gt;
Method Create InParams is &lt;&lt;WmiObject class &quot;__PARAMETERS&quot;&gt;&gt;
Method Create InParams properties are &lt;[&#39;CommandLine&#39;, &#39;CurrentDirectory&#39;, &#39;ProcessStartupInformation&#39;]&gt;
Creating instance of inparam
InParam instance is &lt;&lt;WmiObject instance of &quot;__PARAMETERS&quot;&gt;&gt;
Setting &lt;CommandLine&gt;
Executing method
OutParams is &lt;WmiObject instance of &quot;__PARAMETERS&quot;&gt;
Out params values are: [&#39;ProcessId&#39;, &#39;ReturnValue&#39;]
Created process is &lt;WinProcess &quot;notepad.exe&quot; pid 26744 at 0x180e84d48d0&gt;
Waiting 1s
Killing the process
</pre></div>
</div>
</section>
</section>
<section id="windows-com">
<span id="sample-com"></span><h2><span class="section-number">18.16. </span><a class="reference internal" href="com.html#module-windows.com" title="windows.com"><code class="xref py py-mod docutils literal notranslate"><span class="pre">windows.com</span></code></a><a class="headerlink" href="#windows-com" title="Link to this heading"></a></h2>
<section id="inetfwpolicy2">
<span id="sample-com-firewall"></span><h3><span class="section-number">18.16.1. </span><code class="docutils literal notranslate"><span class="pre">INetFwPolicy2</span></code><a class="headerlink" href="#inetfwpolicy2" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</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.generated_def</span> <span class="kn">import</span> <span class="n">interfaces</span>
<span class="c1"># This code is a simple version of the firewall code in windows.winoject.network</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Initialisation of COM&quot;</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">init</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Creating INetFwPolicy2 variable&quot;</span><span class="p">)</span>
<span class="n">firewall</span> <span class="o">=</span> <span class="n">interfaces</span><span class="o">.</span><span class="n">INetFwPolicy2</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{0}</span><span class="s2"> (value = </span><span class="si">{1}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">firewall</span><span class="p">,</span> <span class="n">firewall</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Generating CLSID&quot;</span><span class="p">)</span>
<span class="n">NetFwPolicy2CLSID</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">com</span><span class="o">.</span><span class="n">IID</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="s2">&quot;E2B3C97F-6AE1-41AC-817A-F6F92166D7DD&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">NetFwPolicy2CLSID</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Creating COM instance&quot;</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">create_instance</span><span class="p">(</span><span class="n">NetFwPolicy2CLSID</span><span class="p">,</span> <span class="n">firewall</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{0}</span><span class="s2"> (value = 0x</span><span class="si">{1:0}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">firewall</span><span class="p">,</span> <span class="n">firewall</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Checking for enabled profiles&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">profile</span> <span class="ow">in</span> <span class="p">[</span><span class="n">gdef</span><span class="o">.</span><span class="n">NET_FW_PROFILE2_DOMAIN</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">NET_FW_PROFILE2_PRIVATE</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">NET_FW_PROFILE2_PUBLIC</span><span class="p">]:</span>
<span class="n">enabled</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">VARIANT_BOOL</span><span class="p">()</span>
<span class="n">firewall</span><span class="o">.</span><span class="n">get_FirewallEnabled</span><span class="p">(</span><span class="n">profile</span><span class="p">,</span> <span class="n">enabled</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2"> -&gt; </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">profile</span><span class="p">,</span> <span class="n">enabled</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">com</span>\<span class="n">com_inetfwpolicy2</span><span class="o">.</span><span class="n">py</span>
<span class="n">Initialisation</span> <span class="n">of</span> <span class="n">COM</span>
<span class="n">Creating</span> <span class="n">INetFwPolicy2</span> <span class="n">variable</span>
<span class="o">&lt;</span><span class="n">INetFwPolicy2</span><span class="o">&lt;</span><span class="n">NULL</span><span class="o">&gt;</span> <span class="n">at</span> <span class="mh">0x2925a3e2350</span><span class="o">&gt;</span> <span class="p">(</span><span class="n">value</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">Generating</span> <span class="n">CLSID</span>
<span class="o">&lt;</span><span class="n">GUID</span> <span class="s2">&quot;E2B3C97F-6AE1-41AC-817A-F6F92166D7DD&quot;</span><span class="o">&gt;</span>
<span class="n">Creating</span> <span class="n">COM</span> <span class="n">instance</span>
<span class="o">&lt;</span><span class="n">INetFwPolicy2</span> <span class="n">at</span> <span class="mh">0x2925a3e2350</span><span class="o">&gt;</span> <span class="p">(</span><span class="n">value</span> <span class="o">=</span> <span class="mh">0x2827524184096</span><span class="p">)</span>
<span class="n">Checking</span> <span class="k">for</span> <span class="n">enabled</span> <span class="n">profiles</span>
<span class="o">*</span> <span class="n">NET_FW_PROFILE_TYPE2_</span><span class="o">.</span><span class="n">NET_FW_PROFILE2_DOMAIN</span><span class="p">(</span><span class="mh">0x1</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">True</span>
<span class="o">*</span> <span class="n">NET_FW_PROFILE_TYPE2_</span><span class="o">.</span><span class="n">NET_FW_PROFILE2_PRIVATE</span><span class="p">(</span><span class="mh">0x2</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">True</span>
<span class="o">*</span> <span class="n">NET_FW_PROFILE_TYPE2_</span><span class="o">.</span><span class="n">NET_FW_PROFILE2_PUBLIC</span><span class="p">(</span><span class="mh">0x4</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">True</span>
</pre></div>
</div>
</section>
<section id="icallinterceptor">
<span id="sample-com-icallinterceptor"></span><h3><span class="section-number">18.16.2. </span><code class="docutils literal notranslate"><span class="pre">ICallInterceptor</span></code><a class="headerlink" href="#icallinterceptor" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></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="c1"># POC of ICallInterceptor</span>
<span class="c1"># Based on works by Pavel Yosifovich</span>
<span class="c1"># http://blogs.microsoft.co.il/pavely/2018/02/28/intercepting-com-objects-with-cogetinterceptor/</span>
<span class="n">windows</span><span class="o">.</span><span class="n">com</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
<span class="c1"># Create an interceptor for the firewall (INetFwPolicy2)</span>
<span class="n">interceptor</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ICallInterceptor</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">CoGetInterceptor</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">INetFwPolicy2</span><span class="o">.</span><span class="n">IID</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">interceptor</span><span class="o">.</span><span class="n">IID</span><span class="p">,</span> <span class="n">interceptor</span><span class="p">)</span>
<span class="c1"># The PythonForWindows firewall object is a real/valid INetFwPolicy2</span>
<span class="c1"># used for demos of ICallFrameEvents.Invoke</span>
<span class="n">real_firewall</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">network</span><span class="o">.</span><span class="n">firewall</span>
<span class="c1"># Custom Python ICallFrameEvents implementation</span>
<span class="k">class</span> <span class="nc">MySink</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">COMImplementation</span><span class="p">):</span>
<span class="n">IMPLEMENT</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ICallFrameEvents</span>
<span class="k">def</span> <span class="nf">OnCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">this</span><span class="p">,</span> <span class="n">frame</span><span class="p">):</span>
<span class="n">ifname</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PWSTR</span><span class="p">()</span>
<span class="n">methodname</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PWSTR</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Hello from python sink !&quot;</span><span class="p">)</span>
<span class="n">frame</span><span class="o">.</span><span class="n">GetNames</span><span class="p">(</span><span class="n">ifname</span><span class="p">,</span> <span class="n">methodname</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Catching call to &lt;</span><span class="si">{0}</span><span class="s2">.</span><span class="si">{1}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ifname</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">methodname</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
<span class="n">param0info</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">CALLFRAMEPARAMINFO</span><span class="p">()</span>
<span class="n">param0</span> <span class="o">=</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="n">frame</span><span class="o">.</span><span class="n">GetParamInfo</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">param0info</span><span class="p">)</span>
<span class="n">frame</span><span class="o">.</span><span class="n">GetParam</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">param0</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Info about parameters 0:&quot;</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">sprint</span><span class="p">(</span><span class="n">param0info</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot; * param0info&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;param0 value = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">param0</span><span class="o">.</span><span class="n">aslong</span><span class="p">))</span>
<span class="n">frame</span><span class="o">.</span><span class="n">Invoke</span><span class="p">(</span><span class="n">real_firewall</span><span class="p">)</span>
<span class="n">frame</span><span class="o">.</span><span class="n">SetReturnValue</span><span class="p">(</span><span class="mi">1234</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Leaving the sink !&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="mi">0</span>
<span class="c1"># Create and register our ICallFrameEvents sink</span>
<span class="n">xsink</span> <span class="o">=</span> <span class="n">MySink</span><span class="p">()</span>
<span class="n">interceptor</span><span class="o">.</span><span class="n">RegisterSink</span><span class="p">(</span><span class="n">xsink</span><span class="p">)</span>
<span class="c1"># Create the INetFwPolicy2 interceptor interface</span>
<span class="n">fakefirewall</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">INetFwPolicy2</span><span class="p">()</span>
<span class="n">interceptor</span><span class="o">.</span><span class="n">QueryInterface</span><span class="p">(</span><span class="n">fakefirewall</span><span class="o">.</span><span class="n">IID</span><span class="p">,</span> <span class="n">fakefirewall</span><span class="p">)</span>
<span class="c1"># Calling one of the INetFwPolicy2 function for testing</span>
<span class="c1"># Testing on https://msdn.microsoft.com/en-us/library/windows/desktop/aa365316(v=vs.85).aspx</span>
<span class="n">enabled</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">VARIANT_BOOL</span><span class="p">()</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">fakefirewall</span><span class="o">.</span><span class="n">get_FirewallEnabled</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">enabled</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;return value = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;firewall enabled = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">enabled</span><span class="p">))</span>
<span class="c1"># Test a function taking a POINTER(ICallFrameEvents) (PTR to interface)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Testing a function taking a PTR to a COM interface&quot;</span><span class="p">)</span>
<span class="n">sink2</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ICallFrameEvents</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Before call: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">((</span><span class="n">sink2</span><span class="p">,</span> <span class="n">sink2</span><span class="o">.</span><span class="n">value</span><span class="p">)))</span>
<span class="n">interceptor</span><span class="o">.</span><span class="n">GetRegisteredSink</span><span class="p">(</span><span class="n">sink2</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;After call: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">((</span><span class="n">sink2</span><span class="p">,</span> <span class="n">sink2</span><span class="o">.</span><span class="n">value</span><span class="p">)))</span>
<span class="c1"># (cmd) python samples\com\icallinterceptor.py</span>
<span class="c1"># Hello from python sink !</span>
<span class="c1"># Catching call to &lt;INetFwPolicy2.FirewallEnabled&gt;</span>
<span class="c1"># Info about parameters 0:</span>
<span class="c1"># * param0info.fIn -&gt; 0x1</span>
<span class="c1"># * param0info.fOut -&gt; 0x0</span>
<span class="c1"># * param0info.stackOffset -&gt; 0x4L</span>
<span class="c1"># * param0info.cbParam -&gt; 0x4L</span>
<span class="c1"># param0 value = 2</span>
<span class="c1"># Leaving the sink !</span>
<span class="c1"># return value = 1234</span>
<span class="c1"># firewall enabled = VARIANT_BOOL(True)</span>
<span class="c1"># Testing a function taking a PTR to a COM interface</span>
<span class="c1"># Before call: (&lt;ICallFrameEvents object at 0x066EF3F0&gt;, None)</span>
<span class="c1"># After call: (&lt;ICallFrameEvents object at 0x066EF3F0&gt;, 107934504)</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python com\icallinterceptor.py
Hello from python sink !
Catching call to &lt;INetFwPolicy2.FirewallEnabled&gt;
Info about parameters 0:
* param0info.fIn -&gt; 0x1
* param0info.fOut -&gt; 0x0
* param0info.stackOffset -&gt; 0x8
* param0info.cbParam -&gt; 0x8
param0 value = 2
Leaving the sink !
return value = 1234
firewall enabled = VARIANT_BOOL(True)
Testing a function taking a PTR to a COM interface
Before call: (&lt;ICallFrameEvents&lt;NULL&gt; at 0x1fb65de5550&gt;, None)
After call: (&lt;ICallFrameEvents at 0x1fb65de5550&gt;, 2179257488408)
</pre></div>
</div>
</section>
</section>
<section id="windows-crypto">
<h2><span class="section-number">18.17. </span><a class="reference internal" href="crypto.html#module-windows.crypto" title="windows.crypto"><code class="xref py py-mod docutils literal notranslate"><span class="pre">windows.crypto</span></code></a><a class="headerlink" href="#windows-crypto" title="Link to this heading"></a></h2>
<section id="encryption-demo">
<span id="sample-crypto-encryption"></span><h3><span class="section-number">18.17.1. </span>Encryption demo<a class="headerlink" href="#encryption-demo" title="Link to this heading"></a></h3>
<p>This sample is a working POC able to generate key-pair, encrypt and decrypt file.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">argparse</span>
<span class="kn">import</span> <span class="nn">getpass</span>
<span class="kn">import</span> <span class="nn">windows.crypto</span> <span class="k">as</span> <span class="nn">crypto</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.generated_def</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">import</span> <span class="nn">windows.crypto.generation</span> <span class="k">as</span> <span class="nn">gencrypt</span>
<span class="c1"># http://stackoverflow.com/questions/1461272/basic-questions-on-microsoft-cryptoapi</span>
<span class="k">def</span> <span class="nf">crypt</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">certs</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Encrypt the content of &#39;src&#39; file with the certifacts in &#39;certs&#39; into &#39;dst&#39;&quot;&quot;&quot;</span>
<span class="c1"># Open every certificates in the certs list</span>
<span class="n">certlist</span> <span class="o">=</span> <span class="p">[</span><span class="n">crypto</span><span class="o">.</span><span class="n">Certificate</span><span class="o">.</span><span class="n">from_file</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">certs</span><span class="p">]</span>
<span class="c1"># Encrypt the content of &#39;src&#39; with all the public keys(certs)</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">crypto</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="n">certlist</span><span class="p">,</span> <span class="n">src</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Encryption done. Result:&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
<span class="c1"># Write the result in &#39;dst&#39;</span>
<span class="n">dst</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
<span class="n">dst</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">src</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">decrypt</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">pfxfile</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">outfile</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Decrypt the content of &#39;src&#39; with the private key in &#39;pfxfile&#39;. the &#39;pfxfile&#39; is open using the &#39;password&#39;&quot;&quot;&quot;</span>
<span class="c1"># Open the &#39;pfx&#39; with the given password</span>
<span class="k">if</span> <span class="n">password</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">password</span> <span class="o">=</span> <span class="n">getpass</span><span class="o">.</span><span class="n">getpass</span><span class="p">()</span>
<span class="n">pfx</span> <span class="o">=</span> <span class="n">crypto</span><span class="o">.</span><span class="n">import_pfx</span><span class="p">(</span><span class="n">pfxfile</span><span class="o">.</span><span class="n">read</span><span class="p">(),</span> <span class="n">password</span><span class="p">)</span>
<span class="c1"># Decrypt the content of the file</span>
<span class="n">decrypted</span> <span class="o">=</span> <span class="n">crypto</span><span class="o">.</span><span class="n">decrypt</span><span class="p">(</span><span class="n">pfx</span><span class="p">,</span> <span class="n">src</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
<span class="k">if</span> <span class="n">outfile</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot;Result = &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">decrypted</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">outfile</span><span class="p">,</span> <span class="s2">&quot;wb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">decrypted</span><span class="p">)</span>
<span class="k">return</span> <span class="n">decrypted</span>
<span class="k">def</span> <span class="nf">sign</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">pfxfile</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">outfile</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="n">password</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">password</span> <span class="o">=</span> <span class="n">getpass</span><span class="o">.</span><span class="n">getpass</span><span class="p">()</span>
<span class="n">pfx</span> <span class="o">=</span> <span class="n">crypto</span><span class="o">.</span><span class="n">import_pfx</span><span class="p">(</span><span class="n">pfxfile</span><span class="o">.</span><span class="n">read</span><span class="p">(),</span> <span class="n">password</span><span class="p">)</span>
<span class="c1"># Decrypt the content of the file</span>
<span class="n">certs</span> <span class="o">=</span> <span class="n">pfx</span><span class="o">.</span><span class="n">certs</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">certs</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;PFX containing exactly one certificate expected for signature&quot;</span><span class="p">)</span>
<span class="n">cert</span> <span class="o">=</span> <span class="n">certs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">signed</span> <span class="o">=</span> <span class="n">crypto</span><span class="o">.</span><span class="n">sign</span><span class="p">(</span><span class="n">cert</span><span class="p">,</span> <span class="n">src</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
<span class="k">if</span> <span class="n">outfile</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot;Result = &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">signed</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">outfile</span><span class="p">,</span> <span class="s2">&quot;wb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">signed</span><span class="p">)</span>
<span class="k">return</span> <span class="n">signed</span>
<span class="n">PFW_TMP_KEY_CONTAINER</span> <span class="o">=</span> <span class="s2">&quot;PythonForWindowsTMPContainer&quot;</span>
<span class="k">def</span> <span class="nf">genkeys</span><span class="p">(</span><span class="n">common_name</span><span class="p">,</span> <span class="n">pfxpassword</span><span class="p">,</span> <span class="n">outname</span><span class="p">,</span> <span class="n">keysize</span><span class="o">=</span><span class="mi">2048</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generate a SHA256/RSA key pair. A self-signed certificate with &#39;common_name&#39; is stored as &#39;outname&#39;.cer.</span>
<span class="sd"> The private key is stored in &#39;outname&#39;.pfx protected with &#39;pfxpassword&#39;&quot;&quot;&quot;</span>
<span class="n">cert_store</span> <span class="o">=</span> <span class="n">crypto</span><span class="o">.</span><span class="n">CertificateStore</span><span class="o">.</span><span class="n">new_in_memory</span><span class="p">()</span>
<span class="c1"># Create a TMP context that will hold our newly generated key-pair</span>
<span class="k">with</span> <span class="n">crypto</span><span class="o">.</span><span class="n">CryptContext</span><span class="p">(</span><span class="n">PFW_TMP_KEY_CONTAINER</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">PROV_RSA_FULL</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">retrycreate</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">as</span> <span class="n">ctx</span><span class="p">:</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">HCRYPTKEY</span><span class="p">()</span>
<span class="n">keysize_flags</span> <span class="o">=</span> <span class="n">keysize</span> <span class="o">&lt;&lt;</span> <span class="mi">16</span>
<span class="c1"># Generate a key-pair that is exportable</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">CryptGenKey</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">AT_KEYEXCHANGE</span><span class="p">,</span> <span class="n">CRYPT_EXPORTABLE</span> <span class="o">|</span> <span class="n">keysize_flags</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
<span class="c1"># It does NOT destroy the key-pair from the container,</span>
<span class="c1"># It only release the key handle</span>
<span class="c1"># https://msdn.microsoft.com/en-us/library/windows/desktop/aa379918(v=vs.85).aspx</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">CryptDestroyKey</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="c1"># Descrption of the key-container that will be used to generate the certificate</span>
<span class="n">KeyProvInfo</span> <span class="o">=</span> <span class="n">CRYPT_KEY_PROV_INFO</span><span class="p">()</span>
<span class="n">KeyProvInfo</span><span class="o">.</span><span class="n">pwszContainerName</span> <span class="o">=</span> <span class="n">PFW_TMP_KEY_CONTAINER</span>
<span class="n">KeyProvInfo</span><span class="o">.</span><span class="n">pwszProvName</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">KeyProvInfo</span><span class="o">.</span><span class="n">dwProvType</span> <span class="o">=</span> <span class="n">PROV_RSA_FULL</span>
<span class="n">KeyProvInfo</span><span class="o">.</span><span class="n">dwFlags</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">KeyProvInfo</span><span class="o">.</span><span class="n">cProvParam</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">KeyProvInfo</span><span class="o">.</span><span class="n">rgProvParam</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1">#KeyProvInfo.dwKeySpec = AT_SIGNATURE</span>
<span class="n">KeyProvInfo</span><span class="o">.</span><span class="n">dwKeySpec</span> <span class="o">=</span> <span class="n">AT_KEYEXCHANGE</span>
<span class="n">crypt_algo</span> <span class="o">=</span> <span class="n">CRYPT_ALGORITHM_IDENTIFIER</span><span class="p">()</span>
<span class="n">crypt_algo</span><span class="o">.</span><span class="n">pszObjId</span> <span class="o">=</span> <span class="n">szOID_RSA_SHA256RSA</span>
<span class="n">certif_name</span> <span class="o">=</span> <span class="s2">&quot;CN=</span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">common_name</span><span class="p">)</span>
<span class="c1"># Generate a self-signed certificate based on the given key-container and signature algorithme</span>
<span class="n">certif</span> <span class="o">=</span> <span class="n">gencrypt</span><span class="o">.</span><span class="n">generate_selfsigned_certificate</span><span class="p">(</span><span class="n">certif_name</span><span class="p">,</span> <span class="n">key_info</span><span class="o">=</span><span class="n">KeyProvInfo</span><span class="p">,</span> <span class="n">signature_algo</span><span class="o">=</span><span class="n">crypt_algo</span><span class="p">)</span>
<span class="c1"># Add the newly created certificate to our TMP cert-store</span>
<span class="n">cert_store</span><span class="o">.</span><span class="n">add_certificate</span><span class="p">(</span><span class="n">certif</span><span class="p">)</span>
<span class="c1"># Generate a pfx from the TMP cert-store</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Password is &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">pfxpassword</span><span class="p">))</span>
<span class="n">pfx</span> <span class="o">=</span> <span class="n">gencrypt</span><span class="o">.</span><span class="n">generate_pfx</span><span class="p">(</span><span class="n">cert_store</span><span class="p">,</span> <span class="n">pfxpassword</span><span class="p">)</span>
<span class="k">if</span> <span class="n">outname</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">outname</span> <span class="o">=</span> <span class="n">common_name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="c1"># Dump the certif (public key) and pfx (public + private keys)</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">outname</span> <span class="o">+</span> <span class="s2">&quot;.cer&quot;</span><span class="p">,</span> <span class="s2">&quot;wb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="c1"># The encoded certif only contains the public key</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">certif</span><span class="o">.</span><span class="n">encoded</span><span class="p">)</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">outname</span> <span class="o">+</span> <span class="s2">&quot;.pfx&quot;</span><span class="p">,</span> <span class="s2">&quot;wb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">pfx</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">certif</span><span class="p">)</span>
<span class="c1"># Destroy the TMP key container</span>
<span class="n">prov</span> <span class="o">=</span> <span class="n">HCRYPTPROV</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">CryptAcquireContextW</span><span class="p">(</span><span class="n">prov</span><span class="p">,</span> <span class="n">PFW_TMP_KEY_CONTAINER</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">PROV_RSA_FULL</span><span class="p">,</span> <span class="n">CRYPT_DELETEKEYSET</span><span class="p">)</span>
<span class="c1"># Openssl commands to check ce certif/pfx</span>
<span class="c1">## Read certificate info (.cer)</span>
<span class="c1">### openssl x509 -inform der -in {certif} -text -noout</span>
<span class="c1">## Read pfx info (ask to another password to encrypt Private key before print/export)</span>
<span class="c1">### openssl pkcs12 -info -in {pfx} -nokeys</span>
<span class="c1">## Read pfx info !!!! PRINT PRIVATE KEY !!!!</span>
<span class="c1">### openssl pkcs12 -info -in {pfx} -nodes</span>
<span class="c1">## Read ASN1 data</span>
<span class="c1">### openssl asn1parse -inform DER -in {file}</span>
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="vm">__file__</span><span class="p">,</span> <span class="n">formatter_class</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentDefaultsHelpFormatter</span><span class="p">)</span>
<span class="n">subparsers</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_subparsers</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s1">&#39;valid subcommands&#39;</span><span class="p">)</span>
<span class="n">cryptparse</span> <span class="o">=</span> <span class="n">subparsers</span><span class="o">.</span><span class="n">add_parser</span><span class="p">(</span><span class="s1">&#39;crypt&#39;</span><span class="p">)</span>
<span class="n">cryptparse</span><span class="o">.</span><span class="n">set_defaults</span><span class="p">(</span><span class="n">func</span><span class="o">=</span><span class="n">crypt</span><span class="p">)</span>
<span class="n">cryptparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;src&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">FileType</span><span class="p">(</span><span class="s1">&#39;rb&#39;</span><span class="p">),</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;File to encrypt&#39;</span><span class="p">)</span>
<span class="n">cryptparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;dst&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">FileType</span><span class="p">(</span><span class="s1">&#39;wb&#39;</span><span class="p">),</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;The encrypted file&#39;</span><span class="p">)</span>
<span class="n">cryptparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;certs&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s1">&#39;+&#39;</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s1">&#39;List of certfile used to encrypt the src&#39;</span><span class="p">)</span>
<span class="n">decryptparse</span> <span class="o">=</span> <span class="n">subparsers</span><span class="o">.</span><span class="n">add_parser</span><span class="p">(</span><span class="s1">&#39;decrypt&#39;</span><span class="p">)</span>
<span class="n">decryptparse</span><span class="o">.</span><span class="n">set_defaults</span><span class="p">(</span><span class="n">func</span><span class="o">=</span><span class="n">decrypt</span><span class="p">)</span>
<span class="n">decryptparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;src&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">FileType</span><span class="p">(</span><span class="s1">&#39;rb&#39;</span><span class="p">),</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;File to decrypt&#39;</span><span class="p">)</span>
<span class="n">decryptparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;pfxfile&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">FileType</span><span class="p">(</span><span class="s1">&#39;rb&#39;</span><span class="p">),</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;PFX file to use&#39;</span><span class="p">)</span>
<span class="n">decryptparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--password&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Password of the PFX&#39;</span><span class="p">)</span>
<span class="n">decryptparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--outfile&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;The outputfile default is print&#39;</span><span class="p">)</span>
<span class="n">decryptparse</span> <span class="o">=</span> <span class="n">subparsers</span><span class="o">.</span><span class="n">add_parser</span><span class="p">(</span><span class="s1">&#39;sign&#39;</span><span class="p">)</span>
<span class="n">decryptparse</span><span class="o">.</span><span class="n">set_defaults</span><span class="p">(</span><span class="n">func</span><span class="o">=</span><span class="n">sign</span><span class="p">)</span>
<span class="n">decryptparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;src&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">FileType</span><span class="p">(</span><span class="s1">&#39;rb&#39;</span><span class="p">),</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;File to sign&#39;</span><span class="p">)</span>
<span class="n">decryptparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;pfxfile&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">FileType</span><span class="p">(</span><span class="s1">&#39;rb&#39;</span><span class="p">),</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;PFX file to use&#39;</span><span class="p">)</span>
<span class="n">decryptparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--password&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Password of the PFX&#39;</span><span class="p">)</span>
<span class="n">decryptparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--outfile&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;The outputfile default is print&#39;</span><span class="p">)</span>
<span class="n">genkeysparse</span> <span class="o">=</span> <span class="n">subparsers</span><span class="o">.</span><span class="n">add_parser</span><span class="p">(</span><span class="s1">&#39;genkey&#39;</span><span class="p">,</span> <span class="n">formatter_class</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentDefaultsHelpFormatter</span><span class="p">)</span>
<span class="n">genkeysparse</span><span class="o">.</span><span class="n">set_defaults</span><span class="p">(</span><span class="n">func</span><span class="o">=</span><span class="n">genkeys</span><span class="p">)</span>
<span class="n">genkeysparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;common_name&#39;</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s1">&#39;?&#39;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s1">&#39;CommonName&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s1">&#39;DEFAULT&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;the common name of the certificate&#39;</span><span class="p">)</span>
<span class="n">genkeysparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;outname&#39;</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s1">&#39;?&#39;</span><span class="p">,</span><span class="n">help</span><span class="o">=</span><span class="s1">&#39;The filename base for the generated files&#39;</span><span class="p">)</span>
<span class="n">genkeysparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--pfxpassword&#39;</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s1">&#39;?&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Password to protect the PFX&#39;</span><span class="p">)</span>
<span class="n">genkeysparse</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--keysize&#39;</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s1">&#39;?&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">default</span><span class="o">=</span><span class="mi">2048</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;The size of the RSA key&#39;</span><span class="p">)</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
<span class="n">res</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="o">**</span><span class="n">res</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span>
</pre></div>
</div>
<p>Ouput:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd λ) python crypto\encryption_demo.py genkey YOLOCERTIF mykey --pfxpassword MYPASSWORD
&lt;CertificatContext &quot;YOLOCERTIF&quot; serial=&quot;1b a4 3e 17 f7 ed ec ab 4f f8 11 46 48 e9 29 25&quot;&gt;
(cmd λ) ls
mykey.cer mykey.pfx
(cmd λ) echo|set /p=&quot;my secret message&quot; &gt; message.txt
(cmd λ) python crypto\encryption_demo.py crypt message.txt message.crypt mykey.cer
Encryption done. Result:
bytearray(b&#39;0\x82\x01\x19\x06\t*\x86H\x86\xf7\r\x01\x07\x03\xa0\x82\x01\n0\x82\x01\x06\x02\x01\x001\x81\xc30\x81
\xc0\x02\x01\x000)0\x151\x130\x11\x06\x03U\x04\x03\x13\nYOLOCERTIF\x02\x10\x1b\xa4&gt;\x17\xf7\xed\xec\xabO\xf8\x11
FH\xe9)%0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x04\x81\x80V\x89)\xf5\xaaM\x99cEA\x17^\xa2D~\x94\xe3\xf2\x1f
\x05Y\xc2\xbb\xb2\xbbYBpU6\x870\xce\xe7\xd2M{\xbb\xb9K\xa0\xf5\xe5\x93\xca\xedF\x80.x\xdc\xf2\x0c\xa6UO\x01\r\xaf
\xd0Z\xd9\xabnzR\xd4j=\xca\xc2RG\xcd\x11u\x82\x7f\x8c\xd8t\xb9\xf9\xe8%\xfal\xaaHPj;\xecKk]\t%\xfd\x91\xcc\xe0lWf
\xc6\x12x\x1am\xc8\x01t\xac\xa6\xf3#\x02\xd4J \x8eZ\xbb\x10W\xe1 0;\x06\t*\x86H\x86\xf7\r\x01\x07\x010\x14\x06\x08*
\x86H\x86\xf7\r\x03\x07\x04\x08\x14F\x04\xad\xed9\xed&lt;\x80\x18\x80]6\xccTV\xbc\xb8*\x84QY!~\xb3\n\x1aV\xd4\rf\xd1n:&#39;)
(cmd λ) python crypto\encryption_demo.py decrypt --password BADPASS message.crypt mykey.pfx
Traceback (most recent call last):
File &quot;..\samples\encryption_demo.py&quot;, line 103, in &lt;module&gt;
res.func(**res.__dict__)
File &quot;..\samples\encryption_demo.py&quot;, line 26, in decrypt
pfx = crypto.import_pfx(pfxfile.read(), password)
File &quot;c:\users\hakril\documents\work\pythonforwindows\windows\crypto\certificate.py&quot;, line 153, in import_pfx
cert_store = winproxy.PFXImportCertStore(pfx, password, flags)
File &quot;c:\users\hakril\documents\work\pythonforwindows\windows\winproxy.py&quot;, line 1065, in PFXImportCertStore
return PFXImportCertStore.ctypes_function(pPFX, szPassword, dwFlags)
File &quot;c:\users\hakril\documents\work\pythonforwindows\windows\winproxy.py&quot;, line 148, in perform_call
return self._cprototyped(*args)
File &quot;c:\users\hakril\documents\work\pythonforwindows\windows\winproxy.py&quot;, line 69, in kernel32_error_check
raise WinproxyError(func_name)
windows.winproxy.error.WinproxyError: PFXImportCertStore: [Error 86] The specified network password is not correct.
(cmd λ) python crypto\encryption_demo.py decrypt --password MYPASSWORD message.crypt mykey.pfx
Result = &lt;my secret message&gt;
</pre></div>
</div>
</section>
<section id="certificate-demo">
<span id="sample-crypto-certificate"></span><h3><span class="section-number">18.17.2. </span>Certificate demo<a class="headerlink" href="#certificate-demo" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">hashlib</span>
<span class="kn">import</span> <span class="nn">base64</span>
<span class="kn">import</span> <span class="nn">windows.crypto</span>
<span class="n">windowscert</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;&quot;&quot;-----BEGIN CERTIFICATE-----</span>
<span class="s2">MIIFBDCCA+ygAwIBAgITMwAAAQZuwyXEMckYDgAAAAABBjANBgkqhkiG9w0BAQsF</span>
<span class="s2">ADCBhDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT</span>
<span class="s2">B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEuMCwGA1UE</span>
<span class="s2">AxMlTWljcm9zb2Z0IFdpbmRvd3MgUHJvZHVjdGlvbiBQQ0EgMjAxMTAeFw0xNjEw</span>
<span class="s2">MTEyMDM5MzFaFw0xODAxMTEyMDM5MzFaMHAxCzAJBgNVBAYTAlVTMRMwEQYDVQQI</span>
<span class="s2">EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv</span>
<span class="s2">ZnQgQ29ycG9yYXRpb24xGjAYBgNVBAMTEU1pY3Jvc29mdCBXaW5kb3dzMIIBIjAN</span>
<span class="s2">BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyWcaCYghNInk3ecpyu2uZ7LCV9QS</span>
<span class="s2">7GWYr41ufTkcL66ewHxlAoWjmkKG6W2Bp9BYYQok10iDeDGACE9Vjr6m4Jdh+YuN</span>
<span class="s2">RLxMnHC8JTGzk96CzmdBPAuUWdAcHNmTkIWQF6AXzsbBWsekQejvDBygAOCuIYh4</span>
<span class="s2">sBgNa5cjTxQc7Iyp9c7RxBmThV5BNFTOnSN6D9N8zU+ENgIZuyHxGvqzRdrhU4G4</span>
<span class="s2">Cg/h1CkI4TgeZQZCeUNPnWV6DMuvPCiqGEia5phOJZyENKND0Sx6eQZrYnuz1gMn</span>
<span class="s2">YaEnO+ggegtt4pWpqg8Ch0jNrkL1fb3Kzz7E34/K9dcTgaOymfF6qUKabQIDAQAB</span>
<span class="s2">o4IBgDCCAXwwHwYDVR0lBBgwFgYKKwYBBAGCNwoDBgYIKwYBBQUHAwMwHQYDVR0O</span>
<span class="s2">BBYEFBEciVg/vsVmKtr/hmHt7KM6g8lSMFIGA1UdEQRLMEmkRzBFMQ0wCwYDVQQL</span>
<span class="s2">EwRNT1BSMTQwMgYDVQQFEysyMjk4NzkrMTQ3NDQ5YmUtMTVhOC00ZWJhLTkzZjMt</span>
<span class="s2">ZDExMGE1YzQ1NTUyMB8GA1UdIwQYMBaAFKkpAjmOFsSXeM2Q+Z5PmuF8Va9TMFQG</span>
<span class="s2">A1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMv</span>
<span class="s2">Y3JsL01pY1dpblByb1BDQTIwMTFfMjAxMS0xMC0xOS5jcmwwYQYIKwYBBQUHAQEE</span>
<span class="s2">VTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz</span>
<span class="s2">L2NlcnRzL01pY1dpblByb1BDQTIwMTFfMjAxMS0xMC0xOS5jcnQwDAYDVR0TAQH/</span>
<span class="s2">BAIwADANBgkqhkiG9w0BAQsFAAOCAQEAvYC1iawgKoxXAotQXaN0lj1J5VX01/un</span>
<span class="s2">7JybZF4sPMG4acoFT85Ao5U6TK5ATPB7yPUulAivp8908DwTGqN+Ju6iH+UkvAb+</span>
<span class="s2">a/WcHVEMxQXK5eOFNE6yekUArBGbMNWlTFrpwklmVTnL9R+4aApTEe6ITT1KLDio</span>
<span class="s2">5uFw98n5Sqgh+In073czyiTG7MVhBexbOfhgnciXoufeyhwy1pYgjouSqSQZs4bj</span>
<span class="s2">cUwQTwGlS2Gd5a+3nblhjn+QhSszIo1K5n1udLPFWtn29BuGlSrtTXPv5OCfNtLO</span>
<span class="s2">l2ec6CyjDQc6HcQBNCsbJVq6qGtQbYNE+ih+KhIU4tO5jf25xthf2g==</span>
<span class="s2">-----END CERTIFICATE-----&quot;&quot;&quot;</span>
<span class="n">raw_cert</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">decodebytes</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">windowscert</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]))</span>
<span class="n">cert</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">crypto</span><span class="o">.</span><span class="n">Certificate</span><span class="o">.</span><span class="n">from_buffer</span><span class="p">(</span><span class="n">raw_cert</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Analysing certificate: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cert</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * name: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cert</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * issuer: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cert</span><span class="o">.</span><span class="n">issuer</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * raw_serial: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cert</span><span class="o">.</span><span class="n">raw_serial</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * serial: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cert</span><span class="o">.</span><span class="n">serial</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * encoded start: &lt;</span><span class="si">{0!r}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cert</span><span class="o">.</span><span class="n">encoded</span><span class="p">[:</span><span class="mi">20</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">chains</span> <span class="o">=</span> <span class="n">cert</span><span class="o">.</span><span class="n">chains</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;This certificate has </span><span class="si">{0}</span><span class="s2"> certificate chain(s)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">chains</span><span class="p">)))</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">chain</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">chains</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Chain </span><span class="si">{0}</span><span class="s2">:&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">))</span>
<span class="k">for</span> <span class="n">ccert</span> <span class="ow">in</span> <span class="n">chain</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; </span><span class="si">{0}</span><span class="s2">:&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ccert</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * issuer: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ccert</span><span class="o">.</span><span class="n">issuer</span><span class="p">))</span>
<span class="nb">print</span> <span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">cert_to_verif</span> <span class="o">=</span> <span class="n">ccert</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Looking for &lt;</span><span class="si">{0}</span><span class="s2">&gt; in trusted certificates&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cert_to_verif</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="n">root_store</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">crypto</span><span class="o">.</span><span class="n">CertificateStore</span><span class="o">.</span><span class="n">from_system_store</span><span class="p">(</span><span class="s2">&quot;Root&quot;</span><span class="p">)</span>
<span class="c1"># This is not the correct way verify the validity of a certificate chain.</span>
<span class="c1"># I would say that if the goal is to verify the signature of the certificate: use wintrust.</span>
<span class="c1"># (or maybe CertVerifyCertificateChainPolicy : https://msdn.microsoft.com/en-us/library/windows/desktop/aa377163(v=vs.85).aspx)</span>
<span class="n">matchs</span> <span class="o">=</span> <span class="p">[</span><span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">root_store</span><span class="o">.</span><span class="n">certs</span> <span class="k">if</span> <span class="n">c</span> <span class="o">==</span> <span class="n">cert_to_verif</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;matches = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">matchs</span><span class="p">))</span>
<span class="k">if</span> <span class="n">matchs</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Found it !&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Not found :(&quot;</span><span class="p">)</span>
<span class="c1">## Extract certificates of a PE file</span>
<span class="c1">## This code is not a fixed API and the current state of my tests</span>
<span class="nb">print</span> <span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span> <span class="p">(</span><span class="s2">&quot;== PE Analysis ==&quot;</span><span class="p">)</span>
<span class="n">TARGET_FILE</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;C:\windows\system32\ntdll.dll&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Target sha1 = &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">hashlib</span><span class="o">.</span><span class="n">sha1</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">TARGET_FILE</span><span class="p">,</span> <span class="s2">&quot;rb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">())</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()))</span>
<span class="n">cryptobj</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">crypto</span><span class="o">.</span><span class="n">CryptObject</span><span class="p">(</span><span class="n">TARGET_FILE</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Analysing </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cryptobj</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;File has </span><span class="si">{0}</span><span class="s2"> signer(s):&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cryptobj</span><span class="o">.</span><span class="n">crypt_msg</span><span class="o">.</span><span class="n">nb_signer</span><span class="p">))</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">signer</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">cryptobj</span><span class="o">.</span><span class="n">crypt_msg</span><span class="o">.</span><span class="n">signers</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Signer </span><span class="si">{0}</span><span class="s2">:&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Issuer: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">signer</span><span class="o">.</span><span class="n">Issuer</span><span class="o">.</span><span class="n">data</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * HashAlgorithme: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">signer</span><span class="o">.</span><span class="n">HashAlgorithm</span><span class="o">.</span><span class="n">pszObjId</span><span class="p">))</span>
<span class="n">cert</span> <span class="o">=</span> <span class="n">cryptobj</span><span class="o">.</span><span class="n">cert_store</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">signer</span><span class="o">.</span><span class="n">Issuer</span><span class="p">,</span> <span class="n">signer</span><span class="o">.</span><span class="n">SerialNumber</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Certificate: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cert</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;File embdeds </span><span class="si">{0}</span><span class="s2"> certificate(s):&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cryptobj</span><span class="o">.</span><span class="n">crypt_msg</span><span class="o">.</span><span class="n">nb_cert</span><span class="p">))</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">certificate</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">cryptobj</span><span class="o">.</span><span class="n">crypt_msg</span><span class="o">.</span><span class="n">certs</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">) </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">certificate</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">crypto</span>\<span class="n">certificate</span><span class="o">.</span><span class="n">py</span>
<span class="n">Analysing</span> <span class="n">certificate</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">Certificate</span> <span class="s2">&quot;Microsoft Windows&quot;</span> <span class="n">serial</span><span class="o">=</span><span class="s2">&quot;33 00 00 01 06 6e c3 25 c4 31 c9 18 0e 00 00 00 00 01 06&quot;</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">name</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">Microsoft</span> <span class="n">Windows</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">issuer</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">Microsoft</span> <span class="n">Windows</span> <span class="n">Production</span> <span class="n">PCA</span> <span class="mi">2011</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">raw_serial</span><span class="p">:</span> <span class="o">&lt;</span><span class="p">[</span><span class="mi">51</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">110</span><span class="p">,</span> <span class="mi">195</span><span class="p">,</span> <span class="mi">37</span><span class="p">,</span> <span class="mi">196</span><span class="p">,</span> <span class="mi">49</span><span class="p">,</span> <span class="mi">201</span><span class="p">,</span> <span class="mi">24</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">serial</span><span class="p">:</span> <span class="o">&lt;</span><span class="mi">33</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">01</span> <span class="mi">06</span> <span class="mi">6</span><span class="n">e</span> <span class="n">c3</span> <span class="mi">25</span> <span class="n">c4</span> <span class="mi">31</span> <span class="n">c9</span> <span class="mi">18</span> <span class="mi">0</span><span class="n">e</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">01</span> <span class="mi">06</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">encoded</span> <span class="n">start</span><span class="p">:</span> <span class="o">&lt;</span><span class="nb">bytearray</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;0</span><span class="se">\x82\x05\x04</span><span class="s1">0</span><span class="se">\x82\x03\xec\xa0\x03\x02\x01\x02\x02\x13</span><span class="s1">3</span><span class="se">\x00\x00\x01\x06</span><span class="s1">&#39;</span><span class="p">)</span><span class="o">&gt;</span>
<span class="n">This</span> <span class="n">certificate</span> <span class="n">has</span> <span class="mi">1</span> <span class="n">certificate</span> <span class="n">chain</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="n">Chain</span> <span class="mi">0</span><span class="p">:</span>
<span class="o">&lt;</span><span class="n">Certificate</span> <span class="s2">&quot;Microsoft Windows&quot;</span> <span class="n">serial</span><span class="o">=</span><span class="s2">&quot;33 00 00 01 06 6e c3 25 c4 31 c9 18 0e 00 00 00 00 01 06&quot;</span><span class="o">&gt;</span><span class="p">:</span>
<span class="o">*</span> <span class="n">issuer</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">Microsoft</span> <span class="n">Windows</span> <span class="n">Production</span> <span class="n">PCA</span> <span class="mi">2011</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="n">Certificate</span> <span class="s2">&quot;Microsoft Windows Production PCA 2011&quot;</span> <span class="n">serial</span><span class="o">=</span><span class="s2">&quot;61 07 76 56 00 00 00 00 00 08&quot;</span><span class="o">&gt;</span><span class="p">:</span>
<span class="o">*</span> <span class="n">issuer</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">Microsoft</span> <span class="n">Root</span> <span class="n">Certificate</span> <span class="n">Authority</span> <span class="mi">2010</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="n">Certificate</span> <span class="s2">&quot;Microsoft Root Certificate Authority 2010&quot;</span> <span class="n">serial</span><span class="o">=</span><span class="s2">&quot;28 cc 3a 25 bf ba 44 ac 44 9a 9b 58 6b 43 39 aa&quot;</span><span class="o">&gt;</span><span class="p">:</span>
<span class="o">*</span> <span class="n">issuer</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">Microsoft</span> <span class="n">Root</span> <span class="n">Certificate</span> <span class="n">Authority</span> <span class="mi">2010</span><span class="o">&gt;</span>
<span class="n">Looking</span> <span class="k">for</span> <span class="o">&lt;</span><span class="n">Microsoft</span> <span class="n">Root</span> <span class="n">Certificate</span> <span class="n">Authority</span> <span class="mi">2010</span><span class="o">&gt;</span> <span class="ow">in</span> <span class="n">trusted</span> <span class="n">certificates</span>
<span class="n">matches</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">Not</span> <span class="n">found</span> <span class="p">:(</span>
<span class="o">==</span> <span class="n">PE</span> <span class="n">Analysis</span> <span class="o">==</span>
<span class="n">Target</span> <span class="n">sha1</span> <span class="o">=</span> <span class="o">&lt;</span><span class="mi">5</span><span class="n">f7905b56952e28316edcbce0206d7bec34de2a1</span><span class="o">&gt;</span>
<span class="n">Analysing</span> <span class="o">&lt;</span><span class="n">CryptObject</span> <span class="s2">&quot;C:\windows\system32</span><span class="se">\n</span><span class="s2">tdll.dll&quot;</span> <span class="n">content_type</span><span class="o">=</span><span class="n">CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED</span><span class="p">(</span><span class="mh">0xa</span><span class="p">)</span><span class="o">&gt;</span>
<span class="n">File</span> <span class="n">has</span> <span class="mi">1</span> <span class="n">signer</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
<span class="n">Signer</span> <span class="mi">0</span><span class="p">:</span>
<span class="o">*</span> <span class="n">Issuer</span><span class="p">:</span> <span class="nb">bytearray</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;0</span><span class="se">\x81\x84</span><span class="s1">1</span><span class="se">\x0b</span><span class="s1">0</span><span class="se">\t\x06\x03</span><span class="s1">U</span><span class="se">\x04\x06\x13\x02</span><span class="s1">US1</span><span class="se">\x13</span><span class="s1">0</span><span class="se">\x11\x06\x03</span><span class="s1">U</span><span class="se">\x04\x08\x13\n</span><span class="s1">Washington1</span><span class="se">\x10</span><span class="s1">0</span><span class="se">\x0e\x06\x03</span><span class="s1">U</span><span class="se">\x04\x07\x13\x07</span><span class="s1">Redmond1</span><span class="se">\x1e</span><span class="s1">0</span><span class="se">\x1c\x06\x03</span><span class="s1">U</span><span class="se">\x04\n\x13\x15</span><span class="s1">Microsoft Corporation1.0,</span><span class="se">\x06\x03</span><span class="s1">U</span><span class="se">\x04\x03\x13</span><span class="s1">%Microsoft Windows Production PCA 2011&#39;</span><span class="p">)</span>
<span class="o">*</span> <span class="n">HashAlgorithme</span><span class="p">:</span> <span class="sa">b</span><span class="s1">&#39;2.16.840.1.101.3.4.2.1&#39;</span>
<span class="o">*</span> <span class="n">Certificate</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">Certificate</span> <span class="s2">&quot;Microsoft Windows&quot;</span> <span class="n">serial</span><span class="o">=</span><span class="s2">&quot;33 00 00 04 5c 3d 56 72 66 6c b7 54 17 00 00 00 00 04 5c&quot;</span><span class="o">&gt;</span>
<span class="n">File</span> <span class="n">embdeds</span> <span class="mi">2</span> <span class="n">certificate</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
<span class="o">*</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&lt;</span><span class="n">Certificate</span> <span class="s2">&quot;Microsoft Windows&quot;</span> <span class="n">serial</span><span class="o">=</span><span class="s2">&quot;33 00 00 04 5c 3d 56 72 66 6c b7 54 17 00 00 00 00 04 5c&quot;</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&lt;</span><span class="n">Certificate</span> <span class="s2">&quot;Microsoft Windows Production PCA 2011&quot;</span> <span class="n">serial</span><span class="o">=</span><span class="s2">&quot;61 07 76 56 00 00 00 00 00 08&quot;</span><span class="o">&gt;</span>
</pre></div>
</div>
</section>
</section>
<section id="windows-alpc">
<h2><span class="section-number">18.18. </span><a class="reference internal" href="alpc.html#module-windows.alpc" title="windows.alpc"><code class="xref py py-mod docutils literal notranslate"><span class="pre">windows.alpc</span></code></a><a class="headerlink" href="#windows-alpc" title="Link to this heading"></a></h2>
<section id="simple-alpc-communication">
<span id="sample-alpc"></span><h3><span class="section-number">18.18.1. </span>simple alpc communication<a class="headerlink" href="#simple-alpc-communication" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">multiprocessing</span>
<span class="kn">import</span> <span class="nn">windows.alpc</span>
<span class="kn">from</span> <span class="nn">windows.generated_def</span> <span class="kn">import</span> <span class="n">LPC_CONNECTION_REQUEST</span><span class="p">,</span> <span class="n">LPC_REQUEST</span>
<span class="n">PORT_NAME</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\RPC Control\PythonForWindowsPORT&quot;</span>
<span class="k">def</span> <span class="nf">alpc_server</span><span class="p">():</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">alpc</span><span class="o">.</span><span class="n">AlpcServer</span><span class="p">(</span><span class="n">PORT_NAME</span><span class="p">)</span> <span class="c1"># Create the ALPC Port</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[SERV] PORT &lt;</span><span class="si">{0}</span><span class="s2">&gt; CREATED&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">PORT_NAME</span><span class="p">))</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">server</span><span class="o">.</span><span class="n">recv</span><span class="p">()</span> <span class="c1"># Wait for a message</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[SERV] Message type = </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">type</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[SERV] Received data: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">()))</span>
<span class="k">assert</span> <span class="n">msg</span><span class="o">.</span><span class="n">type</span> <span class="o">&amp;</span> <span class="mh">0xfff</span> <span class="o">==</span> <span class="n">LPC_CONNECTION_REQUEST</span> <span class="c1"># Check that message is a connection request</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[SERV] Connection request&quot;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">accept_connection</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">server</span><span class="o">.</span><span class="n">recv</span><span class="p">()</span> <span class="c1"># Wait for a real message</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[SERV] Received message: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">()))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[SERV] Message type = </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">type</span><span class="p">))</span>
<span class="k">assert</span> <span class="n">msg</span><span class="o">.</span><span class="n">type</span> <span class="o">&amp;</span> <span class="mh">0xfff</span> <span class="o">==</span> <span class="n">LPC_REQUEST</span>
<span class="c1"># We can reply by two ways:</span>
<span class="c1"># - Send the same message with modified data</span>
<span class="c1"># - Recreate a Message and copy the MessageId</span>
<span class="n">msg</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="sa">u</span><span class="s2">&quot;REQUEST &#39;</span><span class="si">{0}</span><span class="s2">&#39; DONE&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
<span class="n">server</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">alpc_client</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Client pid = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</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">pid</span><span class="p">))</span>
<span class="c1"># Creation an &#39;AlpcClient&#39; with a port name will connect to the port with an empty message</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">alpc</span><span class="o">.</span><span class="n">AlpcClient</span><span class="p">(</span><span class="n">PORT_NAME</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[CLIENT] Connected: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">client</span><span class="p">))</span>
<span class="c1"># Send a message / wait for the response</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">send_receive</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;Hello world !&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[CLIENT] Response: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">()))</span>
<span class="c1"># You can also send message without waiting for a response with &#39;client.send&#39;</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
<span class="n">proc</span> <span class="o">=</span> <span class="n">multiprocessing</span><span class="o">.</span><span class="n">Process</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">alpc_server</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">())</span>
<span class="n">proc</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="kn">import</span> <span class="nn">time</span><span class="p">;</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">alpc_client</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;BYE&quot;</span><span class="p">)</span>
<span class="n">proc</span><span class="o">.</span><span class="n">terminate</span><span class="p">()</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>(cmd) python alpc\simple_alpc.py
[SERV] PORT &lt;\RPC Control\PythonForWindowsPORT&gt; CREATED
Client pid = 15840
[SERV] Message type = 0x300a
[SERV] Received data: &lt;&gt;
[SERV] Connection request
[CLIENT] Connected: &lt;windows.alpc.AlpcClient object at 0x06919290&gt;
[SERV] Received message: &lt;Hello world !&gt;
[SERV] Message type = 0x3001
[CLIENT] Response: &lt;REQUEST &#39;Hello world !&#39; DONE&gt;
BYE
</pre></div>
</div>
</section>
<section id="advanced-alpc-communication">
<span id="sample-advanced-alpc"></span><h3><span class="section-number">18.18.2. </span>advanced alpc communication<a class="headerlink" href="#advanced-alpc-communication" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">multiprocessing</span>
<span class="kn">import</span> <span class="nn">windows.alpc</span>
<span class="kn">from</span> <span class="nn">windows.generated_def</span> <span class="kn">import</span> <span class="n">LPC_CONNECTION_REQUEST</span><span class="p">,</span> <span class="n">LPC_REQUEST</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">import</span> <span class="nn">ctypes</span>
<span class="kn">import</span> <span class="nn">tempfile</span>
<span class="n">PORT_NAME</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\RPC Control\PythonForWindowsPORT_2&quot;</span>
<span class="n">PORT_CONTEXT</span> <span class="o">=</span> <span class="mh">0x11223344</span>
<span class="k">def</span> <span class="nf">full_alpc_server</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;server pid = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</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">pid</span><span class="p">))</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">alpc</span><span class="o">.</span><span class="n">AlpcServer</span><span class="p">(</span><span class="n">PORT_NAME</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[SERV] PORT &lt;</span><span class="si">{0}</span><span class="s2">&gt; CREATED&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">PORT_NAME</span><span class="p">))</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">server</span><span class="o">.</span><span class="n">recv</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[SERV] == Message received ==&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">msg</span><span class="o">.</span><span class="n">type</span> <span class="o">&amp;</span> <span class="mh">0xfff</span> <span class="o">==</span> <span class="n">LPC_CONNECTION_REQUEST</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * ALPC connection request: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">()))</span>
<span class="n">msg</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;Connection message response&quot;</span>
<span class="n">server</span><span class="o">.</span><span class="n">accept_connection</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">port_context</span><span class="o">=</span><span class="n">PORT_CONTEXT</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Expected connection&quot;</span><span class="p">)</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">server</span><span class="o">.</span><span class="n">recv</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[SERV] == Message received ==&quot;</span><span class="p">)</span>
<span class="c1"># print(&quot; * Data: {0}&quot;.format(msg.data))</span>
<span class="c1"># print(&quot;[SERV] RECV Message type = {0:#x}&quot;.format(msg.type))</span>
<span class="c1"># print(&quot;[SERV] RECV Message Valid ATTRS = {0:#x}&quot;.format(msg.attributes.ValidAttributes))</span>
<span class="c1"># print(&quot;[SERV] RECV Message ATTRS = {0:#x}&quot;.format(msg.attributes.AllocatedAttributes))</span>
<span class="k">if</span> <span class="n">msg</span><span class="o">.</span><span class="n">type</span> <span class="o">&amp;</span> <span class="mh">0xfff</span> <span class="o">==</span> <span class="n">LPC_REQUEST</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * ALPC request: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">()))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * view_is_valid &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">view_is_valid</span><span class="p">))</span>
<span class="k">if</span> <span class="n">msg</span><span class="o">.</span><span class="n">view_is_valid</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * message view attribute:&quot;</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">print_ctypes_struct</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">view_attribute</span><span class="p">,</span> <span class="s2">&quot; - VIEW&quot;</span><span class="p">,</span> <span class="n">hexa</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">view_data</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">read_string</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">view_attribute</span><span class="o">.</span><span class="n">ViewBase</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Reading view content: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">view_data</span><span class="p">))</span>
<span class="c1"># Needed in Win7 - TODO: why is there a different behavior ?</span>
<span class="n">msg</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">ValidAttributes</span> <span class="o">-=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ALPC_MESSAGE_VIEW_ATTRIBUTE</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * security_is_valid &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">security_is_valid</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * handle_is_valid &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">handle_is_valid</span><span class="p">))</span>
<span class="k">if</span> <span class="n">msg</span><span class="o">.</span><span class="n">handle_is_valid</span><span class="p">:</span>
<span class="k">if</span> <span class="n">msg</span><span class="o">.</span><span class="n">handle_attribute</span><span class="o">.</span><span class="n">Handle</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * message handle attribute:&quot;</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">print_ctypes_struct</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">handle_attribute</span><span class="p">,</span> <span class="s2">&quot; - HANDLE&quot;</span><span class="p">,</span> <span class="n">hexa</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">msg</span><span class="o">.</span><span class="n">handle_attribute</span><span class="o">.</span><span class="n">ObjectType</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">f</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">create_file_from_handle</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">handle_attribute</span><span class="o">.</span><span class="n">Handle</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - File: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - content: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()))</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - unknow object type == </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">handle_attribute</span><span class="o">.</span><span class="n">ObjectType</span><span class="p">))</span>
<span class="n">msg</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">ValidAttributes</span> <span class="o">-=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ALPC_MESSAGE_HANDLE_ATTRIBUTE</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * context_is_valid &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">context_is_valid</span><span class="p">))</span>
<span class="k">if</span> <span class="n">msg</span><span class="o">.</span><span class="n">context_is_valid</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * message context attribute:&quot;</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">print_ctypes_struct</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">context_attribute</span><span class="p">,</span> <span class="s2">&quot; - CTX&quot;</span><span class="p">,</span> <span class="n">hexa</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">msg</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">ValidAttributes</span> <span class="o">&amp;</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ALPC_MESSAGE_TOKEN_ATTRIBUTE</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * message token attribute:&quot;</span><span class="p">)</span>
<span class="n">token_struct</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get_attribute</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">ALPC_MESSAGE_TOKEN_ATTRIBUTE</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">print_ctypes_struct</span><span class="p">(</span><span class="n">token_struct</span><span class="p">,</span> <span class="s2">&quot; - TOKEN&quot;</span><span class="p">,</span> <span class="n">hexa</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># We can reply by to way:</span>
<span class="c1"># - Send the same message with modified data</span>
<span class="c1"># - Recreate a Message and copy the MessageId</span>
<span class="n">msg</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s2">&quot;REQUEST &#39;</span><span class="si">{0}</span><span class="s2">&#39; DONE&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
<span class="n">server</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unexpected message type &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">type</span> <span class="o">&amp;</span> <span class="mh">0xfff</span><span class="p">)))</span>
<span class="k">def</span> <span class="nf">send_message_with_handle</span><span class="p">(</span><span class="n">client</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[Client] == Sending a message with a handle ==&quot;</span><span class="p">)</span>
<span class="c1"># Craft a file with some data</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">NamedTemporaryFile</span><span class="p">()</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;Tempfile data &lt;3&quot;</span><span class="p">)</span>
<span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="c1"># New message with a Handle</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">alpc</span><span class="o">.</span><span class="n">AlpcMessage</span><span class="p">()</span>
<span class="n">msg</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">ValidAttributes</span> <span class="o">|=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ALPC_MESSAGE_HANDLE_ATTRIBUTE</span>
<span class="n">msg</span><span class="o">.</span><span class="n">handle_attribute</span><span class="o">.</span><span class="n">Flags</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ALPC_HANDLEFLG_DUPLICATE_SAME_ACCESS</span>
<span class="n">msg</span><span class="o">.</span><span class="n">handle_attribute</span><span class="o">.</span><span class="n">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">msg</span><span class="o">.</span><span class="n">handle_attribute</span><span class="o">.</span><span class="n">ObjectType</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">msg</span><span class="o">.</span><span class="n">handle_attribute</span><span class="o">.</span><span class="n">DesiredAccess</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">msg</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;some message with a file&quot;</span>
<span class="n">client</span><span class="o">.</span><span class="n">send_receive</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">send_message_with_view</span><span class="p">(</span><span class="n">client</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[Client] == Sending a message with a view ==&quot;</span><span class="p">)</span>
<span class="c1"># Create View</span>
<span class="n">section</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">create_port_section</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mh">0x4000</span><span class="p">)</span>
<span class="n">view</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">map_section</span><span class="p">(</span><span class="n">section</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="mh">0x4000</span><span class="p">)</span>
<span class="c1"># New message with a View</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">alpc</span><span class="o">.</span><span class="n">AlpcMessage</span><span class="p">(</span><span class="mh">0x2000</span><span class="p">)</span>
<span class="n">msg</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">ValidAttributes</span> <span class="o">|=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ALPC_MESSAGE_VIEW_ATTRIBUTE</span>
<span class="n">msg</span><span class="o">.</span><span class="n">view_attribute</span><span class="o">.</span><span class="n">Flags</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">msg</span><span class="o">.</span><span class="n">view_attribute</span><span class="o">.</span><span class="n">ViewBase</span> <span class="o">=</span> <span class="n">view</span><span class="o">.</span><span class="n">ViewBase</span>
<span class="n">msg</span><span class="o">.</span><span class="n">view_attribute</span><span class="o">.</span><span class="n">SectionHandle</span> <span class="o">=</span> <span class="n">view</span><span class="o">.</span><span class="n">SectionHandle</span>
<span class="n">msg</span><span class="o">.</span><span class="n">view_attribute</span><span class="o">.</span><span class="n">ViewSize</span> <span class="o">=</span> <span class="mh">0x4000</span>
<span class="n">msg</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;some message with a view&quot;</span>
<span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">write_memory</span><span class="p">(</span><span class="n">view</span><span class="o">.</span><span class="n">ViewBase</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&quot;The content of the view :)</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">client</span><span class="o">.</span><span class="n">send_receive</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">alpc_client</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Client pid = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</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">pid</span><span class="p">))</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">alpc</span><span class="o">.</span><span class="n">AlpcClient</span><span class="p">()</span>
<span class="c1"># You can create a non-connected AlpcClient and send a custom</span>
<span class="c1"># &#39;AlpcMessage&#39; for complexe alpc port connection.</span>
<span class="n">connect_message</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">alpc</span><span class="o">.</span><span class="n">AlpcMessage</span><span class="p">()</span>
<span class="n">connect_message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;Connection request client message&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[CLIENT] == Connecting to port ==&quot;</span><span class="p">)</span>
<span class="n">connect_response</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">connect_to_port</span><span class="p">(</span><span class="n">PORT_NAME</span><span class="p">,</span> <span class="n">connect_message</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[CLIENT] Connected with response: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">connect_response</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">()))</span>
<span class="c1"># AlpcClient send/recv/send_receive methods accept both string or</span>
<span class="c1"># AlpcMessage for complexe message.</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[CLIENT] == Sending a message ==&quot;</span><span class="p">)</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">alpc</span><span class="o">.</span><span class="n">AlpcMessage</span><span class="p">()</span>
<span class="n">msg</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;Complex Message 1&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Sending Message &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">()))</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">send_receive</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[CLIENT] Server response: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">()))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[CLIENT] RESP Message Valid ATTRS = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">valid_attributes</span><span class="p">))</span>
<span class="n">send_message_with_handle</span><span class="p">(</span><span class="n">client</span><span class="p">)</span>
<span class="n">send_message_with_view</span><span class="p">(</span><span class="n">client</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
<span class="n">proc</span> <span class="o">=</span> <span class="n">multiprocessing</span><span class="o">.</span><span class="n">Process</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">full_alpc_server</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">())</span>
<span class="n">proc</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="kn">import</span> <span class="nn">time</span><span class="p">;</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span>
<span class="n">alpc_client</span><span class="p">()</span>
<span class="kn">import</span> <span class="nn">time</span><span class="p">;</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;BYE&quot;</span><span class="p">)</span>
<span class="n">proc</span><span class="o">.</span><span class="n">terminate</span><span class="p">()</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">alpc</span>\<span class="n">advanced_alpc</span><span class="o">.</span><span class="n">py</span>
<span class="n">server</span> <span class="n">pid</span> <span class="o">=</span> <span class="mi">2300</span>
<span class="p">[</span><span class="n">SERV</span><span class="p">]</span> <span class="n">PORT</span> <span class="o">&lt;</span>\<span class="n">RPC</span> <span class="n">Control</span>\<span class="n">PythonForWindowsPORT_2</span><span class="o">&gt;</span> <span class="n">CREATED</span>
<span class="n">Client</span> <span class="n">pid</span> <span class="o">=</span> <span class="mi">14848</span>
<span class="p">[</span><span class="n">CLIENT</span><span class="p">]</span> <span class="o">==</span> <span class="n">Connecting</span> <span class="n">to</span> <span class="n">port</span> <span class="o">==</span>
<span class="p">[</span><span class="n">SERV</span><span class="p">]</span> <span class="o">==</span> <span class="n">Message</span> <span class="n">received</span> <span class="o">==</span>
<span class="o">*</span> <span class="n">ALPC</span> <span class="n">connection</span> <span class="n">request</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">Connection</span> <span class="n">request</span> <span class="n">client</span> <span class="n">message</span><span class="o">&gt;</span>
<span class="p">[</span><span class="n">CLIENT</span><span class="p">]</span> <span class="n">Connected</span> <span class="k">with</span> <span class="n">response</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">Connection</span> <span class="n">message</span> <span class="n">response</span><span class="o">&gt;</span>
<span class="p">[</span><span class="n">CLIENT</span><span class="p">]</span> <span class="o">==</span> <span class="n">Sending</span> <span class="n">a</span> <span class="n">message</span> <span class="o">==</span>
<span class="o">*</span> <span class="n">Sending</span> <span class="n">Message</span> <span class="o">&lt;</span><span class="n">Complex</span> <span class="n">Message</span> <span class="mi">1</span><span class="o">&gt;</span>
<span class="p">[</span><span class="n">SERV</span><span class="p">]</span> <span class="o">==</span> <span class="n">Message</span> <span class="n">received</span> <span class="o">==</span>
<span class="o">*</span> <span class="n">ALPC</span> <span class="n">request</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">Complex</span> <span class="n">Message</span> <span class="mi">1</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">view_is_valid</span> <span class="o">&lt;</span><span class="kc">False</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">security_is_valid</span> <span class="o">&lt;</span><span class="kc">False</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">handle_is_valid</span> <span class="o">&lt;</span><span class="kc">False</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">context_is_valid</span> <span class="o">&lt;</span><span class="kc">True</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">message</span> <span class="n">context</span> <span class="n">attribute</span><span class="p">:</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">PortContext</span> <span class="o">-&gt;</span> <span class="mh">0x11223344</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">MessageContext</span> <span class="o">-&gt;</span> <span class="kc">None</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">Sequence</span> <span class="o">-&gt;</span> <span class="mh">0x1</span><span class="n">L</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">MessageId</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">CallbackId</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="o">*</span> <span class="n">message</span> <span class="n">token</span> <span class="n">attribute</span><span class="p">:</span>
<span class="o">-</span> <span class="n">TOKEN</span><span class="o">.</span><span class="n">TokenId</span> <span class="o">-&gt;</span> <span class="mh">0x4101ef8e</span><span class="n">L</span>
<span class="o">-</span> <span class="n">TOKEN</span><span class="o">.</span><span class="n">AuthenticationId</span> <span class="o">-&gt;</span> <span class="mh">0x54177</span><span class="n">L</span>
<span class="o">-</span> <span class="n">TOKEN</span><span class="o">.</span><span class="n">ModifiedId</span> <span class="o">-&gt;</span> <span class="mh">0x4077ab89</span><span class="n">L</span>
<span class="p">[</span><span class="n">CLIENT</span><span class="p">]</span> <span class="n">Server</span> <span class="n">response</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">REQUEST</span> <span class="s1">&#39;Complex Message 1&#39;</span> <span class="n">DONE</span><span class="o">&gt;</span>
<span class="p">[</span><span class="n">CLIENT</span><span class="p">]</span> <span class="n">RESP</span> <span class="n">Message</span> <span class="n">Valid</span> <span class="n">ATTRS</span> <span class="o">=</span> <span class="p">[</span><span class="n">ALPC_MESSAGE_CONTEXT_ATTRIBUTE</span><span class="p">(</span><span class="mh">0x20000000</span><span class="n">L</span><span class="p">)]</span>
<span class="p">[</span><span class="n">Client</span><span class="p">]</span> <span class="o">==</span> <span class="n">Sending</span> <span class="n">a</span> <span class="n">message</span> <span class="k">with</span> <span class="n">a</span> <span class="n">handle</span> <span class="o">==</span>
<span class="p">[</span><span class="n">SERV</span><span class="p">]</span> <span class="o">==</span> <span class="n">Message</span> <span class="n">received</span> <span class="o">==</span>
<span class="o">*</span> <span class="n">ALPC</span> <span class="n">request</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">some</span> <span class="n">message</span> <span class="k">with</span> <span class="n">a</span> <span class="n">file</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">view_is_valid</span> <span class="o">&lt;</span><span class="kc">False</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">security_is_valid</span> <span class="o">&lt;</span><span class="kc">False</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">handle_is_valid</span> <span class="o">&lt;</span><span class="kc">True</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">message</span> <span class="n">handle</span> <span class="n">attribute</span><span class="p">:</span>
<span class="o">-</span> <span class="n">HANDLE</span><span class="o">.</span><span class="n">Flags</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="o">-</span> <span class="n">HANDLE</span><span class="o">.</span><span class="n">Handle</span> <span class="o">-&gt;</span> <span class="mh">0x2cc</span>
<span class="o">-</span> <span class="n">HANDLE</span><span class="o">.</span><span class="n">ObjectType</span> <span class="o">-&gt;</span> <span class="mh">0x1</span><span class="n">L</span>
<span class="o">-</span> <span class="n">HANDLE</span><span class="o">.</span><span class="n">DesiredAccess</span> <span class="o">-&gt;</span> <span class="mh">0x13019f</span><span class="n">L</span>
<span class="o">-</span> <span class="n">File</span><span class="p">:</span> <span class="o">&lt;</span><span class="nb">open</span> <span class="n">file</span> <span class="s1">&#39;&lt;fdopen&gt;&#39;</span><span class="p">,</span> <span class="n">mode</span> <span class="s1">&#39;r&#39;</span> <span class="n">at</span> <span class="mh">0x049ECA18</span><span class="o">&gt;</span>
<span class="o">-</span> <span class="n">content</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">Tempfile</span> <span class="n">data</span> <span class="o">&lt;</span><span class="mi">3</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">context_is_valid</span> <span class="o">&lt;</span><span class="kc">True</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">message</span> <span class="n">context</span> <span class="n">attribute</span><span class="p">:</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">PortContext</span> <span class="o">-&gt;</span> <span class="mh">0x11223344</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">MessageContext</span> <span class="o">-&gt;</span> <span class="kc">None</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">Sequence</span> <span class="o">-&gt;</span> <span class="mh">0x2</span><span class="n">L</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">MessageId</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">CallbackId</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="o">*</span> <span class="n">message</span> <span class="n">token</span> <span class="n">attribute</span><span class="p">:</span>
<span class="o">-</span> <span class="n">TOKEN</span><span class="o">.</span><span class="n">TokenId</span> <span class="o">-&gt;</span> <span class="mh">0x4101ef8e</span><span class="n">L</span>
<span class="o">-</span> <span class="n">TOKEN</span><span class="o">.</span><span class="n">AuthenticationId</span> <span class="o">-&gt;</span> <span class="mh">0x54177</span><span class="n">L</span>
<span class="o">-</span> <span class="n">TOKEN</span><span class="o">.</span><span class="n">ModifiedId</span> <span class="o">-&gt;</span> <span class="mh">0x4077ab89</span><span class="n">L</span>
<span class="p">[</span><span class="n">Client</span><span class="p">]</span> <span class="o">==</span> <span class="n">Sending</span> <span class="n">a</span> <span class="n">message</span> <span class="k">with</span> <span class="n">a</span> <span class="n">view</span> <span class="o">==</span>
<span class="p">[</span><span class="n">SERV</span><span class="p">]</span> <span class="o">==</span> <span class="n">Message</span> <span class="n">received</span> <span class="o">==</span>
<span class="o">*</span> <span class="n">ALPC</span> <span class="n">request</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">some</span> <span class="n">message</span> <span class="k">with</span> <span class="n">a</span> <span class="n">view</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">view_is_valid</span> <span class="o">&lt;</span><span class="kc">True</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">message</span> <span class="n">view</span> <span class="n">attribute</span><span class="p">:</span>
<span class="o">-</span> <span class="n">VIEW</span><span class="o">.</span><span class="n">Flags</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="o">-</span> <span class="n">VIEW</span><span class="o">.</span><span class="n">SectionHandle</span> <span class="o">-&gt;</span> <span class="kc">None</span>
<span class="o">-</span> <span class="n">VIEW</span><span class="o">.</span><span class="n">ViewBase</span> <span class="o">-&gt;</span> <span class="mh">0x4780000</span>
<span class="o">-</span> <span class="n">VIEW</span><span class="o">.</span><span class="n">ViewSize</span> <span class="o">-&gt;</span> <span class="mh">0x4000</span>
<span class="o">*</span> <span class="n">Reading</span> <span class="n">view</span> <span class="n">content</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">The</span> <span class="n">content</span> <span class="n">of</span> <span class="n">the</span> <span class="n">view</span> <span class="p">:)</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">security_is_valid</span> <span class="o">&lt;</span><span class="kc">False</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">handle_is_valid</span> <span class="o">&lt;</span><span class="kc">False</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">context_is_valid</span> <span class="o">&lt;</span><span class="kc">True</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">message</span> <span class="n">context</span> <span class="n">attribute</span><span class="p">:</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">PortContext</span> <span class="o">-&gt;</span> <span class="mh">0x11223344</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">MessageContext</span> <span class="o">-&gt;</span> <span class="kc">None</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">Sequence</span> <span class="o">-&gt;</span> <span class="mh">0x3</span><span class="n">L</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">MessageId</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="o">-</span> <span class="n">CTX</span><span class="o">.</span><span class="n">CallbackId</span> <span class="o">-&gt;</span> <span class="mh">0x0</span><span class="n">L</span>
<span class="o">*</span> <span class="n">message</span> <span class="n">token</span> <span class="n">attribute</span><span class="p">:</span>
<span class="o">-</span> <span class="n">TOKEN</span><span class="o">.</span><span class="n">TokenId</span> <span class="o">-&gt;</span> <span class="mh">0x4101ef8e</span><span class="n">L</span>
<span class="o">-</span> <span class="n">TOKEN</span><span class="o">.</span><span class="n">AuthenticationId</span> <span class="o">-&gt;</span> <span class="mh">0x54177</span><span class="n">L</span>
<span class="o">-</span> <span class="n">TOKEN</span><span class="o">.</span><span class="n">ModifiedId</span> <span class="o">-&gt;</span> <span class="mh">0x4077ab89</span><span class="n">L</span>
<span class="p">[</span><span class="n">SERV</span><span class="p">]</span> <span class="o">==</span> <span class="n">Message</span> <span class="n">received</span> <span class="o">==</span>
<span class="n">Unexpected</span> <span class="n">message</span> <span class="nb">type</span> <span class="o">&lt;</span><span class="mi">12</span><span class="o">&gt;</span>
<span class="p">[</span><span class="n">SERV</span><span class="p">]</span> <span class="o">==</span> <span class="n">Message</span> <span class="n">received</span> <span class="o">==</span>
<span class="n">Unexpected</span> <span class="n">message</span> <span class="nb">type</span> <span class="o">&lt;</span><span class="mi">5</span><span class="o">&gt;</span>
<span class="p">[</span><span class="n">SERV</span><span class="p">]</span> <span class="o">==</span> <span class="n">Message</span> <span class="n">received</span> <span class="o">==</span>
<span class="n">Unexpected</span> <span class="n">message</span> <span class="nb">type</span> <span class="o">&lt;</span><span class="mi">12</span><span class="o">&gt;</span>
<span class="p">[</span><span class="n">SERV</span><span class="p">]</span> <span class="o">==</span> <span class="n">Message</span> <span class="n">received</span> <span class="o">==</span>
<span class="n">Unexpected</span> <span class="n">message</span> <span class="nb">type</span> <span class="o">&lt;</span><span class="mi">12</span><span class="o">&gt;</span>
<span class="n">BYE</span>
</pre></div>
</div>
</section>
</section>
<section id="windows-rpc">
<h2><span class="section-number">18.19. </span><a class="reference internal" href="rpc.html#module-windows.rpc" title="windows.rpc"><code class="xref py py-mod docutils literal notranslate"><span class="pre">windows.rpc</span></code></a><a class="headerlink" href="#windows-rpc" title="Link to this heading"></a></h2>
<section id="manual-uac">
<span id="sample-rpc-uac"></span><h3><span class="section-number">18.19.1. </span>Manual UAC<a class="headerlink" href="#manual-uac" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">argparse</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">windows.rpc</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.rpc</span> <span class="kn">import</span> <span class="n">ndr</span>
<span class="c1"># NDR Descriptions</span>
<span class="k">class</span> <span class="nc">NDRPoint</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrStructure</span><span class="p">):</span>
<span class="n">MEMBERS</span> <span class="o">=</span> <span class="p">[</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span> <span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">]</span>
<span class="k">class</span> <span class="nc">NdrUACStartupInfo</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrStructure</span><span class="p">):</span>
<span class="n">MEMBERS</span> <span class="o">=</span> <span class="p">[</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrUniquePTR</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrWString</span><span class="p">),</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">NDRPoint</span><span class="p">]</span>
<span class="k">class</span> <span class="nc">RAiLaunchAdminProcessParameters</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrParameters</span><span class="p">):</span>
<span class="n">MEMBERS</span> <span class="o">=</span> <span class="p">[</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrUniquePTR</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrWString</span><span class="p">),</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrUniquePTR</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrWString</span><span class="p">),</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrWString</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrWString</span><span class="p">,</span>
<span class="n">NdrUACStartupInfo</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">]</span>
<span class="k">class</span> <span class="nc">NdrProcessInformation</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrParameters</span><span class="p">):</span>
<span class="n">MEMBERS</span> <span class="o">=</span> <span class="p">[</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">]</span> <span class="o">*</span> <span class="mi">4</span>
<span class="c1"># Parsing args</span>
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="vm">__file__</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--target&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Executable to launch&#39;</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--cmdline&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;The commandline for the process&#39;</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--uacflags&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">default</span><span class="o">=</span><span class="mh">0x11</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--creationflags&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">default</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">CREATE_UNICODE_ENVIRONMENT</span><span class="p">)</span>
<span class="n">params</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
<span class="c1"># Connecting to RPC Interface.</span>
<span class="n">UAC_UIID</span> <span class="o">=</span> <span class="s2">&quot;201ef99a-7fa0-444c-9399-19ba84f12a1a&quot;</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">rpc</span><span class="o">.</span><span class="n">find_alpc_endpoint_and_connect</span><span class="p">(</span><span class="n">UAC_UIID</span><span class="p">)</span>
<span class="n">iid</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">UAC_UIID</span><span class="p">)</span>
<span class="c1"># Marshalling parameters.</span>
<span class="n">parameters</span> <span class="o">=</span> <span class="n">RAiLaunchAdminProcessParameters</span><span class="o">.</span><span class="n">pack</span><span class="p">([</span>
<span class="n">params</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="c1"># Application Path</span>
<span class="n">params</span><span class="o">.</span><span class="n">cmdline</span><span class="p">,</span> <span class="c1"># Commandline</span>
<span class="n">params</span><span class="o">.</span><span class="n">uacflags</span><span class="p">,</span> <span class="c1"># UAC-Request Flag</span>
<span class="n">params</span><span class="o">.</span><span class="n">creationflags</span><span class="p">,</span> <span class="c1"># dwCreationFlags</span>
<span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="c1"># StartDirectory</span>
<span class="s2">&quot;WinSta0</span><span class="se">\\</span><span class="s2">Default&quot;</span><span class="p">,</span> <span class="c1"># Station</span>
<span class="c1"># Startup Info</span>
<span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="c1"># Title</span>
<span class="mi">0</span><span class="p">,</span> <span class="c1"># dwX</span>
<span class="mi">0</span><span class="p">,</span> <span class="c1"># dwY</span>
<span class="mi">0</span><span class="p">,</span> <span class="c1"># dwXSize</span>
<span class="mi">0</span><span class="p">,</span> <span class="c1"># dwYSize</span>
<span class="mi">0</span><span class="p">,</span> <span class="c1"># dwXCountChars</span>
<span class="mi">0</span><span class="p">,</span> <span class="c1"># dwYCountChars</span>
<span class="mi">0</span><span class="p">,</span> <span class="c1"># dwFillAttribute</span>
<span class="mi">0</span><span class="p">,</span> <span class="c1"># dwFlags</span>
<span class="mi">5</span><span class="p">,</span> <span class="c1"># wShowWindow</span>
<span class="c1"># Point structure: Use MonitorFromPoint to setup StartupInfo.hStdOutput</span>
<span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)),</span>
<span class="mi">0</span><span class="p">,</span> <span class="c1"># Window-Handle to know if UAC can steal focus</span>
<span class="mh">0xffffffff</span><span class="p">])</span> <span class="c1"># UAC Timeout</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">iid</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">parameters</span><span class="p">)</span>
<span class="n">stream</span> <span class="o">=</span> <span class="n">ndr</span><span class="o">.</span><span class="n">NdrStream</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="n">ph</span><span class="p">,</span> <span class="n">th</span><span class="p">,</span> <span class="n">pid</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">NdrProcessInformation</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<span class="n">return_value</span> <span class="o">=</span> <span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Return value = </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">return_value</span><span class="p">))</span>
<span class="n">target</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">winobject</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">WinProcess</span><span class="p">(</span><span class="n">handle</span><span class="o">=</span><span class="n">ph</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Created process is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * bitness is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">bitness</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * integrity: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">token</span><span class="o">.</span><span class="n">integrity</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * elevated: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">token</span><span class="o">.</span><span class="n">is_elevated</span><span class="p">))</span>
</pre></div>
</div>
<p>Output:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span> <span class="n">λ</span><span class="p">)</span> <span class="n">python</span> <span class="n">rpc</span>\<span class="n">uac</span><span class="o">.</span><span class="n">py</span>
<span class="n">Namespace</span><span class="p">(</span><span class="n">cmdline</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">creationflags</span><span class="o">=</span><span class="n">CREATE_UNICODE_ENVIRONMENT</span><span class="p">(</span><span class="mh">0x400</span><span class="n">L</span><span class="p">),</span> <span class="n">target</span><span class="o">=</span><span class="s1">&#39;C:</span><span class="se">\\</span><span class="s1">Python27</span><span class="se">\\</span><span class="s1">python.exe&#39;</span><span class="p">,</span> <span class="n">uacflags</span><span class="o">=</span><span class="mi">17</span><span class="p">)</span>
<span class="c1"># UAC pop - asking to execute python.exe | Clicking Yes</span>
<span class="n">Return</span> <span class="n">value</span> <span class="o">=</span> <span class="mh">0x6</span>
<span class="n">Created</span> <span class="n">process</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">WinProcess</span> <span class="s2">&quot;python.exe&quot;</span> <span class="n">pid</span> <span class="mi">19304</span> <span class="n">at</span> <span class="mh">0x455f7d0</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">bitness</span> <span class="ow">is</span> <span class="mi">32</span>
<span class="o">*</span> <span class="n">integrity</span><span class="p">:</span> <span class="n">SECURITY_MANDATORY_HIGH_RID</span><span class="p">(</span><span class="mh">0x3000</span><span class="n">L</span><span class="p">)</span>
<span class="o">*</span> <span class="n">elevated</span><span class="p">:</span> <span class="kc">True</span>
<span class="c1"># The new python.exe in another window</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">token</span><span class="o">.</span><span class="n">integrity</span>
<span class="n">SECURITY_MANDATORY_HIGH_RID</span><span class="p">(</span><span class="mh">0x3000</span><span class="n">L</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">token</span><span class="o">.</span><span class="n">is_elevated</span>
<span class="kc">True</span>
</pre></div>
</div>
</section>
<section id="manual-lsarenumerateprivileges">
<span id="sample-rpc-lsass"></span><h3><span class="section-number">18.19.2. </span>Manual <code class="docutils literal notranslate"><span class="pre">LsarEnumeratePrivileges</span></code><a class="headerlink" href="#manual-lsarenumerateprivileges" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">windows.rpc</span>
<span class="kn">from</span> <span class="nn">windows.rpc</span> <span class="kn">import</span> <span class="n">ndr</span>
<span class="k">class</span> <span class="nc">PLSAPR_OBJECT_ATTRIBUTES</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrStructure</span><span class="p">):</span>
<span class="n">MEMBERS</span> <span class="o">=</span> <span class="p">[</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrUniquePTR</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrWString</span><span class="p">),</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrUniquePTR</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">),</span> <span class="c1"># We dont care of the subtype as we will pass None</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrUniquePTR</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">),</span> <span class="c1"># We dont care of the subtype as we will pass None</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrUniquePTR</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">)]</span> <span class="c1"># We dont care of the subtype as we will pass None</span>
<span class="c1">## From: RPCVIEW</span>
<span class="c1"># long Proc44_LsarOpenPolicy2(</span>
<span class="c1"># [in][unique][string] wchar_t* arg_0,</span>
<span class="c1"># [in]struct Struct_364_t* arg_1,</span>
<span class="c1"># [in]long arg_2,</span>
<span class="c1"># [out][context_handle] void** arg_3);</span>
<span class="c1"># This function has a [out][context_handle] meaning it return a context_handle</span>
<span class="c1"># Context handle are represented by 5 NdrLong where the first one is always 0</span>
<span class="c1"># PythonForWindows represent context_handle using NdrContextHandle</span>
<span class="k">class</span> <span class="nc">LsarOpenPolicy2Parameter</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrParameters</span><span class="p">):</span>
<span class="n">MEMBERS</span> <span class="o">=</span> <span class="p">[</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrUniquePTR</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrWString</span><span class="p">),</span>
<span class="n">PLSAPR_OBJECT_ATTRIBUTES</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">]</span>
<span class="c1">## From: RPCVIEW</span>
<span class="c1"># long Proc2_LsarEnumeratePrivileges(</span>
<span class="c1"># [in][context_handle] void* arg_0,</span>
<span class="c1"># [in][out]long *arg_1,</span>
<span class="c1"># [out]struct Struct_110_t* arg_2,</span>
<span class="c1"># [in]long arg_3);</span>
<span class="c1"># This function has a [in][context_handle] meaning it expect a context_handle</span>
<span class="c1"># We can pass the NdrContextHandle returned by Proc44_LsarOpenPolicy2</span>
<span class="k">class</span> <span class="nc">LsarEnumeratePrivilegesParameter</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrParameters</span><span class="p">):</span>
<span class="n">MEMBERS</span> <span class="o">=</span> <span class="p">[</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrContextHandle</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">,</span>
<span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="p">]</span>
<span class="k">class</span> <span class="nc">LSAPR_POLICY_PRIVILEGE_DEF</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">unpack</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
<span class="n">size1</span> <span class="o">=</span> <span class="n">ndr</span><span class="o">.</span><span class="n">NdrShort</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<span class="n">ptr</span> <span class="o">=</span> <span class="n">ndr</span><span class="o">.</span><span class="n">NdrShort</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<span class="n">size2</span> <span class="o">=</span> <span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<span class="n">luid</span> <span class="o">=</span> <span class="n">ndr</span><span class="o">.</span><span class="n">NdrHyper</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<span class="k">return</span> <span class="n">ptr</span><span class="p">,</span> <span class="n">luid</span>
<span class="k">class</span> <span class="nc">LSAPR_PRIVILEGE_ENUM_BUFFER</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">unpack</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
<span class="n">entries</span> <span class="o">=</span> <span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<span class="n">array_size</span> <span class="o">=</span> <span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<span class="n">array_ptr</span> <span class="o">=</span> <span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<span class="c1"># Unpack pointed array</span>
<span class="n">array_size2</span> <span class="o">=</span> <span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">array_size</span> <span class="o">==</span> <span class="n">array_size2</span>
<span class="n">x</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># unpack each elements LSAPR_POLICY_PRIVILEGE_DEF</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">array_size2</span><span class="p">):</span>
<span class="n">ptr</span><span class="p">,</span> <span class="n">luid</span> <span class="o">=</span> <span class="n">LSAPR_POLICY_PRIVILEGE_DEF</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ptr</span><span class="p">:</span>
<span class="n">x</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">luid</span><span class="p">)</span>
<span class="c1"># unpack pointed strings</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">luid</span> <span class="ow">in</span> <span class="n">x</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">ndr</span><span class="o">.</span><span class="n">NdrWcharConformantVaryingArrays</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">luid</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
<span class="k">return</span> <span class="n">result</span>
<span class="c1"># Actual code</span>
<span class="c1">## LSASS alpc endpoints is fixed, no need for the epmapper</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">rpc</span><span class="o">.</span><span class="n">RPCClient</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\RPC Control\lsasspirpc&quot;</span><span class="p">)</span>
<span class="c1">## Bind to the desired interface</span>
<span class="n">iid</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="s1">&#39;12345778-1234-abcd-ef00-0123456789ab&#39;</span><span class="p">,</span> <span class="n">version</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="c1">## Craft parameters and call &#39;LsarOpenPolicy2&#39;</span>
<span class="n">params</span> <span class="o">=</span> <span class="n">LsarOpenPolicy2Parameter</span><span class="o">.</span><span class="n">pack</span><span class="p">([</span><span class="kc">None</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="kc">None</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="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span> <span class="mh">0x20000000</span><span class="p">])</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">iid</span><span class="p">,</span> <span class="mi">44</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
<span class="c1">## Unpack the resulting handle</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">ndr</span><span class="o">.</span><span class="n">NdrContextHandle</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrStream</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
<span class="c1"># As context_handle have 4 NdrLong of effective data</span>
<span class="c1"># We can represent them as GUID</span>
<span class="c1"># NdrContextHandle is just a wrapper packing/unpacking GUID and taking</span>
<span class="c1"># care of the leading NdrLong(0) in the actual ndr representation of context_handle</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Context Handle is: </span><span class="si">{0}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">handle</span><span class="p">))</span>
<span class="c1">## Craft parameters and call &#39;LsarEnumeratePrivileges&#39;</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">LsarEnumeratePrivilegesParameter</span><span class="o">.</span><span class="n">pack</span><span class="p">([</span><span class="n">handle</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10000</span><span class="p">]);</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">iid</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Privileges:&quot;</span><span class="p">)</span>
<span class="c1">## Unpack the resulting &#39;LSAPR_PRIVILEGE_ENUM_BUFFER&#39;</span>
<span class="n">priviledges</span> <span class="o">=</span> <span class="n">LSAPR_PRIVILEGE_ENUM_BUFFER</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrStream</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
<span class="k">for</span> <span class="n">priv</span> <span class="ow">in</span> <span class="n">priviledges</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">priv</span><span class="p">)</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">rpc</span>\<span class="n">lsass</span><span class="o">.</span><span class="n">py</span>
<span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeCreateTokenPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeAssignPrimaryTokenPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeLockMemoryPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeIncreaseQuotaPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeMachineAccountPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeTcbPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeSecurityPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">9</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeTakeOwnershipPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeLoadDriverPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">11</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeSystemProfilePrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeSystemtimePrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">13</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeProfileSingleProcessPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">14</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeIncreaseBasePriorityPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">15</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeCreatePagefilePrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeCreatePermanentPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">17</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeBackupPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeRestorePrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">19</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeShutdownPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeDebugPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">21</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeAuditPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">22</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeSystemEnvironmentPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">23</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeChangeNotifyPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">24</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeRemoteShutdownPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">25</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeUndockPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">26</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeSyncAgentPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">27</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeEnableDelegationPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">28</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeManageVolumePrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">29</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeImpersonatePrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeCreateGlobalPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">31</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeTrustedCredManAccessPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">32</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeRelabelPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">33</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeIncreaseWorkingSetPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">34</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeTimeZonePrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">35</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeCreateSymbolicLinkPrivilege&#39;</span><span class="p">)</span>
<span class="p">(</span><span class="mi">36</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;SeDelegateSessionUserImpersonatePrivilege&#39;</span><span class="p">)</span>
</pre></div>
</div>
</section>
</section>
<section id="windows-pipe">
<span id="sample-pipe"></span><h2><span class="section-number">18.20. </span><a class="reference internal" href="pipe.html#module-windows.pipe" title="windows.pipe"><code class="xref py py-mod docutils literal notranslate"><span class="pre">windows.pipe</span></code></a><a class="headerlink" href="#windows-pipe" title="Link to this heading"></a></h2>
<section id="communication-with-an-injected-process">
<h3><span class="section-number">18.20.1. </span>Communication with an injected process<a class="headerlink" href="#communication-with-an-injected-process" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.test</span>
<span class="kn">import</span> <span class="nn">windows.pipe</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">pop_proc_32</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Child is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">p</span><span class="p">))</span>
<span class="n">PIPE_NAME</span> <span class="o">=</span> <span class="s2">&quot;PFW_Pipe&quot;</span>
<span class="n">rcode</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">import windows</span>
<span class="s2">import windows.pipe</span>
<span class="s2">f = open(&#39;tst.txt&#39;, &quot;w+&quot;)</span>
<span class="s2">fh = windows.utils.get_handle_from_file(f)</span>
<span class="s2">hm = windows.winproxy.CreateFileMappingA(fh, dwMaximumSizeLow=0x1000, lpName=None)</span>
<span class="s2">addr = windows.winproxy.MapViewOfFile(hm, dwNumberOfBytesToMap=0x1000)</span>
<span class="s2">windows.pipe.send_object(&quot;</span><span class="si">{pipe}</span><span class="s2">&quot;, addr)</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="k">with</span> <span class="n">windows</span><span class="o">.</span><span class="n">pipe</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">PIPE_NAME</span><span class="p">)</span> <span class="k">as</span> <span class="n">np</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Created pipe is </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">np</span><span class="p">))</span>
<span class="n">p</span><span class="o">.</span><span class="n">execute_python</span><span class="p">(</span><span class="n">rcode</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">pipe</span><span class="o">=</span><span class="n">PIPE_NAME</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Receiving object from injected process&quot;</span><span class="p">)</span>
<span class="n">addr</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">recv</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Remote Address = </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">addr</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Querying memory in target at &lt;</span><span class="si">{0:#x}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">addr</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">query_memory</span><span class="p">(</span><span class="n">addr</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Querying mapped file in target at &lt;</span><span class="si">{0:#x}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">addr</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">get_mapped_filename</span><span class="p">(</span><span class="n">addr</span><span class="p">)))</span>
<span class="n">p</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">pipe</span>\<span class="n">child_send_object</span><span class="o">.</span><span class="n">py</span>
<span class="n">Child</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">WinProcess</span> <span class="s2">&quot;notepad.exe&quot;</span> <span class="n">pid</span> <span class="mi">4316</span> <span class="n">at</span> <span class="mh">0x672fcf0</span><span class="o">&gt;</span>
<span class="n">Created</span> <span class="n">pipe</span> <span class="ow">is</span> <span class="o">&lt;</span><span class="n">PipeConnection</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">.\pipe\PFW_Pipe&quot;</span> <span class="n">server</span><span class="o">=</span><span class="kc">True</span><span class="o">&gt;</span>
<span class="n">Receiving</span> <span class="nb">object</span> <span class="kn">from</span> <span class="nn">injected</span> <span class="n">process</span>
<span class="n">Remote</span> <span class="n">Address</span> <span class="o">=</span> <span class="mh">0x97a0000</span>
<span class="n">Querying</span> <span class="n">memory</span> <span class="ow">in</span> <span class="n">target</span> <span class="n">at</span> <span class="o">&lt;</span><span class="mh">0x97a0000</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">MEMORY_BASIC_INFORMATION32</span> <span class="n">BaseAddress</span><span class="o">=</span><span class="mh">0x97a0000</span> <span class="n">RegionSize</span><span class="o">=</span><span class="mh">0x001000</span> <span class="n">State</span><span class="o">=</span><span class="n">MEM_COMMIT</span><span class="p">(</span><span class="mh">0x1000</span><span class="n">L</span><span class="p">)</span> <span class="n">Type</span><span class="o">=</span><span class="n">MEM_MAPPED</span><span class="p">(</span><span class="mh">0x40000</span><span class="n">L</span><span class="p">)</span> <span class="n">Protect</span><span class="o">=</span><span class="n">PAGE_READWRITE</span><span class="p">(</span><span class="mh">0x4</span><span class="n">L</span><span class="p">)</span><span class="o">&gt;</span>
<span class="n">Querying</span> <span class="n">mapped</span> <span class="n">file</span> <span class="ow">in</span> <span class="n">target</span> <span class="n">at</span> <span class="o">&lt;</span><span class="mh">0x97a0000</span><span class="o">&gt;</span>
<span class="o">*</span> \<span class="n">Device</span>\<span class="n">HarddiskVolume2</span>\<span class="n">Users</span>\<span class="n">hakril</span>\<span class="n">Documents</span>\<span class="n">projets</span>\<span class="n">PythonForWindows</span>\<span class="n">samples</span>\<span class="n">tst</span><span class="o">.</span><span class="n">txt</span>
</pre></div>
</div>
</section>
</section>
<section id="windows-security">
<span id="sample-security"></span><h2><span class="section-number">18.21. </span><a class="reference internal" href="security.html#module-windows.security" title="windows.security"><code class="xref py py-mod docutils literal notranslate"><span class="pre">windows.security</span></code></a><a class="headerlink" href="#windows-security" title="Link to this heading"></a></h2>
<section id="security-descriptor">
<h3><span class="section-number">18.21.1. </span>Security Descriptor<a class="headerlink" href="#security-descriptor" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">windows.security</span>
<span class="n">SDDL</span> <span class="o">=</span> <span class="s2">&quot;O:BAG:AND:(A;OI;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)(D;CIIO;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)&quot;</span>
<span class="n">sd</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">security</span><span class="o">.</span><span class="n">SecurityDescriptor</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="n">SDDL</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Security descriptor is: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sd</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Owner: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sd</span><span class="o">.</span><span class="n">owner</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - lookup: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">lookup_sid</span><span class="p">(</span><span class="n">sd</span><span class="o">.</span><span class="n">owner</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Group: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sd</span><span class="o">.</span><span class="n">group</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - lookup: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">lookup_sid</span><span class="p">(</span><span class="n">sd</span><span class="o">.</span><span class="n">group</span><span class="p">)))</span>
<span class="n">dacl</span> <span class="o">=</span> <span class="n">sd</span><span class="o">.</span><span class="n">dacl</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Dacl: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">dacl</span><span class="p">))</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">ace</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">dacl</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; ACE [</span><span class="si">{0}</span><span class="s2">]: </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">ace</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - Header-AceType: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceType</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - Header-AceFlags: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceFlags</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - Header-flags: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">flags</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - Mask: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">Mask</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - mask: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">mask</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; - Sid: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">sid</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">security</span>\<span class="n">security_descriptor</span><span class="o">.</span><span class="n">py</span>
<span class="n">Security</span> <span class="n">descriptor</span> <span class="ow">is</span><span class="p">:</span> <span class="n">O</span><span class="p">:</span><span class="n">BAG</span><span class="p">:</span><span class="n">AND</span><span class="p">:(</span><span class="n">A</span><span class="p">;</span><span class="n">OI</span><span class="p">;</span><span class="n">CCDCLCSWRPWPRCWDWOGA</span><span class="p">;;;</span><span class="n">S</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="mi">0</span><span class="o">-</span><span class="mi">0</span><span class="p">)(</span><span class="n">D</span><span class="p">;</span><span class="n">CIIO</span><span class="p">;</span><span class="n">CCDCLCSWRPWPRCWDWOGA</span><span class="p">;;;</span><span class="n">S</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="mi">0</span><span class="o">-</span><span class="mi">0</span><span class="p">)</span>
<span class="n">Owner</span><span class="p">:</span> <span class="n">S</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="mi">5</span><span class="o">-</span><span class="mi">32</span><span class="o">-</span><span class="mi">544</span>
<span class="o">-</span> <span class="n">lookup</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;BUILTIN&#39;</span><span class="p">,</span> <span class="s1">&#39;Administrators&#39;</span><span class="p">)</span>
<span class="n">Group</span><span class="p">:</span> <span class="n">S</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="mi">5</span><span class="o">-</span><span class="mi">7</span>
<span class="o">-</span> <span class="n">lookup</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;NT AUTHORITY&#39;</span><span class="p">,</span> <span class="s1">&#39;ANONYMOUS LOGON&#39;</span><span class="p">)</span>
<span class="n">Dacl</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">Acl</span> <span class="n">count</span><span class="o">=</span><span class="mi">2</span><span class="o">&gt;</span>
<span class="n">ACE</span> <span class="p">[</span><span class="mi">0</span><span class="p">]:</span> <span class="o">&lt;</span><span class="n">AccessAllowedACE</span> <span class="n">mask</span><span class="o">=</span><span class="mi">269353023</span><span class="o">&gt;</span>
<span class="o">-</span> <span class="n">Header</span><span class="o">-</span><span class="n">AceType</span><span class="p">:</span> <span class="n">ACCESS_ALLOWED_ACE_TYPE</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span>
<span class="o">-</span> <span class="n">Header</span><span class="o">-</span><span class="n">AceFlags</span><span class="p">:</span> <span class="mi">1</span>
<span class="o">-</span> <span class="n">Header</span><span class="o">-</span><span class="n">flags</span><span class="p">:</span> <span class="p">[</span><span class="n">OBJECT_INHERIT_ACE</span><span class="p">(</span><span class="mh">0x1</span><span class="p">)]</span>
<span class="o">-</span> <span class="n">Mask</span><span class="p">:</span> <span class="mi">269353023</span>
<span class="o">-</span> <span class="n">mask</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="n">READ_CONTROL</span><span class="p">(</span><span class="mh">0x20000</span><span class="p">),</span> <span class="n">WRITE_DAC</span><span class="p">(</span><span class="mh">0x40000</span><span class="p">),</span> <span class="n">WRITE_OWNER</span><span class="p">(</span><span class="mh">0x80000</span><span class="p">),</span> <span class="n">GENERIC_ALL</span><span class="p">(</span><span class="mh">0x10000000</span><span class="p">)]</span>
<span class="o">-</span> <span class="n">Sid</span><span class="p">:</span> <span class="n">S</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="mi">0</span><span class="o">-</span><span class="mi">0</span>
<span class="n">ACE</span> <span class="p">[</span><span class="mi">1</span><span class="p">]:</span> <span class="o">&lt;</span><span class="n">AccessDeniedACE</span> <span class="n">mask</span><span class="o">=</span><span class="mi">269353023</span><span class="o">&gt;</span>
<span class="o">-</span> <span class="n">Header</span><span class="o">-</span><span class="n">AceType</span><span class="p">:</span> <span class="n">ACCESS_DENIED_ACE_TYPE</span><span class="p">(</span><span class="mh">0x1</span><span class="p">)</span>
<span class="o">-</span> <span class="n">Header</span><span class="o">-</span><span class="n">AceFlags</span><span class="p">:</span> <span class="mi">10</span>
<span class="o">-</span> <span class="n">Header</span><span class="o">-</span><span class="n">flags</span><span class="p">:</span> <span class="p">[</span><span class="n">CONTAINER_INHERIT_ACE</span><span class="p">(</span><span class="mh">0x2</span><span class="p">),</span> <span class="n">INHERIT_ONLY_ACE</span><span class="p">(</span><span class="mh">0x8</span><span class="p">)]</span>
<span class="o">-</span> <span class="n">Mask</span><span class="p">:</span> <span class="mi">269353023</span>
<span class="o">-</span> <span class="n">mask</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="n">READ_CONTROL</span><span class="p">(</span><span class="mh">0x20000</span><span class="p">),</span> <span class="n">WRITE_DAC</span><span class="p">(</span><span class="mh">0x40000</span><span class="p">),</span> <span class="n">WRITE_OWNER</span><span class="p">(</span><span class="mh">0x80000</span><span class="p">),</span> <span class="n">GENERIC_ALL</span><span class="p">(</span><span class="mh">0x10000000</span><span class="p">)]</span>
<span class="o">-</span> <span class="n">Sid</span><span class="p">:</span> <span class="n">S</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="mi">0</span><span class="o">-</span><span class="mi">0</span>
</pre></div>
</div>
</section>
<section id="query-sacl">
<span id="sample-security-sacl"></span><h3><span class="section-number">18.21.2. </span>Query SACL<a class="headerlink" href="#query-sacl" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">windows.security</span>
<span class="n">TARGET</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;C:\windows\notepad.exe&quot;</span> <span class="c1"># On WIN10 (at least) notepad.exe has a AuditACE</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">token</span><span class="o">.</span><span class="n">elevated</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;This sample should be run as admin to demonstration SACL access&quot;</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[NO-PRIV] Querying &lt;</span><span class="si">{0}</span><span class="s2">&gt; SecurityDescriptor without SACL&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">TARGET</span><span class="p">))</span>
<span class="n">sd</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">security</span><span class="o">.</span><span class="n">SecurityDescriptor</span><span class="o">.</span><span class="n">from_filename</span><span class="p">(</span><span class="n">TARGET</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;sacl = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sd</span><span class="o">.</span><span class="n">sacl</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[NO-PRIV] Querying &lt;</span><span class="si">{0}</span><span class="s2">&gt; SecurityDescriptor with SACL&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">TARGET</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">sd</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">security</span><span class="o">.</span><span class="n">SecurityDescriptor</span><span class="o">.</span><span class="n">from_filename</span><span class="p">(</span><span class="n">TARGET</span><span class="p">,</span> <span class="n">query_sacl</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;sacl = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sd</span><span class="o">.</span><span class="n">sacl</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="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Enabling &lt;SeSecurityPrivilege&gt;&quot;</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">current_process</span><span class="o">.</span><span class="n">token</span><span class="o">.</span><span class="n">enable_privilege</span><span class="p">(</span><span class="s2">&quot;SeSecurityPrivilege&quot;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[ERROR] </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
<span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[PRIV] Querying &lt;</span><span class="si">{0}</span><span class="s2">&gt; SecurityDescriptor with SACL&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">TARGET</span><span class="p">))</span>
<span class="n">sd</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">security</span><span class="o">.</span><span class="n">SecurityDescriptor</span><span class="o">.</span><span class="n">from_filename</span><span class="p">(</span><span class="n">TARGET</span><span class="p">,</span> <span class="n">query_sacl</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;sacl = </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sd</span><span class="o">.</span><span class="n">sacl</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">sd</span><span class="o">.</span><span class="n">sacl</span><span class="p">))</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">security</span>\<span class="n">query_sacl</span><span class="o">.</span><span class="n">py</span>
<span class="n">This</span> <span class="n">sample</span> <span class="n">should</span> <span class="n">be</span> <span class="n">run</span> <span class="k">as</span> <span class="n">admin</span> <span class="n">to</span> <span class="n">demonstration</span> <span class="n">SACL</span> <span class="n">access</span>
<span class="p">[</span><span class="n">NO</span><span class="o">-</span><span class="n">PRIV</span><span class="p">]</span> <span class="n">Querying</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">notepad</span><span class="o">.</span><span class="n">exe</span><span class="o">&gt;</span> <span class="n">SecurityDescriptor</span> <span class="n">without</span> <span class="n">SACL</span>
<span class="n">sacl</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">Acl</span> <span class="n">count</span><span class="o">=</span><span class="mi">0</span><span class="o">&gt;</span>
<span class="p">[</span><span class="n">NO</span><span class="o">-</span><span class="n">PRIV</span><span class="p">]</span> <span class="n">Querying</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">notepad</span><span class="o">.</span><span class="n">exe</span><span class="o">&gt;</span> <span class="n">SecurityDescriptor</span> <span class="k">with</span> <span class="n">SACL</span>
<span class="kc">None</span><span class="p">:</span> <span class="p">[</span><span class="n">Error</span> <span class="mi">1314</span><span class="p">]</span> <span class="n">A</span> <span class="n">required</span> <span class="n">privilege</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">held</span> <span class="n">by</span> <span class="n">the</span> <span class="n">client</span><span class="o">.</span>
<span class="n">Enabling</span> <span class="o">&lt;</span><span class="n">SeSecurityPrivilege</span><span class="o">&gt;</span>
<span class="p">[</span><span class="n">ERROR</span><span class="p">]</span> <span class="o">&lt;</span><span class="n">Token</span> <span class="n">TokenId</span><span class="o">=</span><span class="mh">0xd6db5cc</span> <span class="n">Type</span><span class="o">=</span><span class="n">TokenPrimary</span><span class="p">(</span><span class="mh">0x1</span><span class="n">L</span><span class="p">)</span><span class="o">&gt;</span> <span class="n">has</span> <span class="n">no</span> <span class="n">privilege</span> <span class="o">&lt;</span><span class="n">SeSecurityPrivilege</span><span class="o">&gt;</span>
<span class="p">(</span><span class="n">cmd</span><span class="o">-</span><span class="n">admin</span><span class="p">)</span> <span class="n">python</span> <span class="n">security</span>\<span class="n">query_sacl</span><span class="o">.</span><span class="n">py</span>
<span class="p">[</span><span class="n">NO</span><span class="o">-</span><span class="n">PRIV</span><span class="p">]</span> <span class="n">Querying</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">notepad</span><span class="o">.</span><span class="n">exe</span><span class="o">&gt;</span> <span class="n">SecurityDescriptor</span> <span class="n">without</span> <span class="n">SACL</span>
<span class="n">sacl</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">Acl</span> <span class="n">count</span><span class="o">=</span><span class="mi">0</span><span class="o">&gt;</span>
<span class="p">[</span><span class="n">NO</span><span class="o">-</span><span class="n">PRIV</span><span class="p">]</span> <span class="n">Querying</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">notepad</span><span class="o">.</span><span class="n">exe</span><span class="o">&gt;</span> <span class="n">SecurityDescriptor</span> <span class="k">with</span> <span class="n">SACL</span>
<span class="kc">None</span><span class="p">:</span> <span class="p">[</span><span class="n">Error</span> <span class="mi">1314</span><span class="p">]</span> <span class="n">A</span> <span class="n">required</span> <span class="n">privilege</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">held</span> <span class="n">by</span> <span class="n">the</span> <span class="n">client</span><span class="o">.</span>
<span class="n">Enabling</span> <span class="o">&lt;</span><span class="n">SeSecurityPrivilege</span><span class="o">&gt;</span>
<span class="p">[</span><span class="n">PRIV</span><span class="p">]</span> <span class="n">Querying</span> <span class="o">&lt;</span><span class="n">C</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">notepad</span><span class="o">.</span><span class="n">exe</span><span class="o">&gt;</span> <span class="n">SecurityDescriptor</span> <span class="k">with</span> <span class="n">SACL</span>
<span class="n">sacl</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">Acl</span> <span class="n">count</span><span class="o">=</span><span class="mi">1</span><span class="o">&gt;</span>
<span class="p">[</span><span class="o">&lt;</span><span class="n">SystemAuditACE</span> <span class="n">mask</span><span class="o">=</span><span class="mi">852246</span><span class="o">&gt;</span><span class="p">]</span>
</pre></div>
</div>
</section>
</section>
<section id="etw-event-tracing-for-windows">
<span id="sample-etw"></span><h2><span class="section-number">18.22. </span>ETW (Event Tracing for Windows)<a class="headerlink" href="#etw-event-tracing-for-windows" title="Link to this heading"></a></h2>
<section id="trace-processing">
<h3><span class="section-number">18.22.1. </span>Trace processing<a class="headerlink" href="#trace-processing" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">ctypes</span>
<span class="kn">import</span> <span class="nn">struct</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="n">makeg</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">GUID</span><span class="o">.</span><span class="n">from_string</span>
<span class="c1"># This sample record the ETW event of provider CBB61B6D-A2CF-471A-9A58-A4CD5C08FFBA</span>
<span class="c1"># related to the UAC (service AppInfo)</span>
<span class="c1"># The ETW session is called MY_UAC_MONITOR</span>
<span class="c1"># Is then trigger the UAC and display the retrieved event afterward</span>
<span class="k">def</span> <span class="nf">show</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{0:#x}</span><span class="s2">: </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">EventHeader</span><span class="o">.</span><span class="n">TimeStamp</span><span class="p">,</span> <span class="n">event</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; guid: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">guid</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; id: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">id</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; opcode: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">opcode</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; level: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">level</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; data: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">user_data</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)))</span>
<span class="k">return</span> <span class="mi">0</span>
<span class="n">session_name</span> <span class="o">=</span> <span class="s2">&quot;MY_UAC_MONITOR&quot;</span>
<span class="n">logfile_name</span> <span class="o">=</span> <span class="s2">&quot;uac.trace&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Recording UAC event in file &lt;</span><span class="si">{0}</span><span class="s2">&gt; using session named &lt;</span><span class="si">{1}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">logfile_name</span><span class="p">,</span> <span class="n">session_name</span><span class="p">))</span>
<span class="n">my_trace</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">etw</span><span class="o">.</span><span class="n">open_trace</span><span class="p">(</span><span class="n">session_name</span><span class="p">,</span> <span class="n">logfile</span><span class="o">=</span><span class="n">logfile_name</span><span class="p">)</span>
<span class="n">my_trace</span><span class="o">.</span><span class="n">stop</span><span class="p">(</span><span class="n">soft</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># Stop previous trace with this name if exists</span>
<span class="n">my_trace</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="n">my_trace</span><span class="o">.</span><span class="n">enable</span><span class="p">(</span><span class="s2">&quot;CBB61B6D-A2CF-471A-9A58-A4CD5C08FFBA&quot;</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">)</span>
<span class="c1"># Trigger UAC</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">ShellExecuteA</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="s2">&quot;runas&quot;</span><span class="p">,</span> <span class="s2">&quot;mmc.exe&quot;</span><span class="p">,</span> <span class="s2">&quot;BAD_MMC_FILENAME&quot;</span><span class="p">,</span> <span class="kc">None</span> <span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="n">my_trace</span><span class="o">.</span><span class="n">stop</span><span class="p">()</span>
<span class="n">my_trace</span><span class="o">.</span><span class="n">process</span><span class="p">(</span><span class="n">show</span><span class="p">)</span> <span class="c1">#: Process the events registered in the trace (and logfile)</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">etw</span>\<span class="n">uac_trace</span><span class="o">.</span><span class="n">py</span>
<span class="n">Recording</span> <span class="n">UAC</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">file</span> <span class="o">&lt;</span><span class="n">uac</span><span class="o">.</span><span class="n">trace</span><span class="o">&gt;</span> <span class="n">using</span> <span class="n">session</span> <span class="n">named</span> <span class="o">&lt;</span><span class="n">MY_UAC_MONITOR</span><span class="o">&gt;</span>
<span class="mh">0x1d65bb1febaceea</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">EventRecord</span> <span class="n">provider</span><span class="o">=</span><span class="s2">&quot;68FDD900-4A3E-11D1-84F4-0000F80464E3&quot;</span> <span class="nb">id</span><span class="o">=</span><span class="mi">0</span><span class="o">&gt;</span>
<span class="n">guid</span><span class="p">:</span> <span class="mi">68</span><span class="n">FDD900</span><span class="o">-</span><span class="mi">4</span><span class="n">A3E</span><span class="o">-</span><span class="mi">11</span><span class="n">D1</span><span class="o">-</span><span class="mi">84</span><span class="n">F4</span><span class="o">-</span><span class="mi">0000</span><span class="n">F80464E3</span>
<span class="nb">id</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">opcode</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">level</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">data</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\x01\n\x01\x05\xbb</span><span class="s1">G</span><span class="se">\x04</span><span class="s1">-D</span><span class="se">\xd5\xff\xb1</span><span class="s1">[</span><span class="se">\xd6\x01</span><span class="s1">Zb</span><span class="se">\x02\t\x01\x04\xf0\x0c\t\x06\xc4\xff\xff\xff</span><span class="s1">@tzres.dll,-302</span><span class="se">\n\x05\x03</span><span class="s1">@tzres.dll,-301</span><span class="se">\x03\x05\x02\xc4\xff\xff\xff\xc0\x92\x1c\xd2</span><span class="s1">D[</span><span class="se">\xd6\x01\x80\x96\x98\xea\xce\xba\xfe\xb1</span><span class="s1">[</span><span class="se">\xd6\x01\x01</span><span class="s1">MY_UAC_MONITORC:</span><span class="se">\\</span><span class="s1">Users</span><span class="se">\\</span><span class="s1">hakril</span><span class="se">\\</span><span class="s1">Documents</span><span class="se">\\</span><span class="s1">projets</span><span class="se">\\</span><span class="s1">PythonForWindows</span><span class="se">\\</span><span class="s1">samples</span><span class="se">\\</span><span class="s1">uac.trace&#39;</span>
<span class="p">[</span><span class="o">...</span><span class="p">]</span>
<span class="mh">0x1d65bb1fec4c011</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">EventRecord</span> <span class="n">provider</span><span class="o">=</span><span class="s2">&quot;DEB74A23-5444-3F3B-924B-0E653973F55A&quot;</span> <span class="nb">id</span><span class="o">=</span><span class="mi">11</span><span class="o">&gt;</span>
<span class="n">guid</span><span class="p">:</span> <span class="n">DEB74A23</span><span class="o">-</span><span class="mi">5444</span><span class="o">-</span><span class="mi">3</span><span class="n">F3B</span><span class="o">-</span><span class="mi">924</span><span class="n">B</span><span class="o">-</span><span class="mf">0E653973</span><span class="n">F55A</span>
<span class="nb">id</span><span class="p">:</span> <span class="mi">11</span>
<span class="n">opcode</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">level</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">data</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\x9e\x06\x04\x19\x14\x04\x08\x04\xff\xff\xff\xff</span><span class="s1">WinSta0</span><span class="se">\\</span><span class="s1">DefaultC:</span><span class="se">\\</span><span class="s1">Windows</span><span class="se">\\</span><span class="s1">System32</span><span class="se">\\</span><span class="s1">mmc.exe&quot;C:</span><span class="se">\\</span><span class="s1">Windows</span><span class="se">\\</span><span class="s1">System32</span><span class="se">\\</span><span class="s1">mmc.exe&quot; BAD_MMC_FILENAMEC:</span><span class="se">\\</span><span class="s1">Users</span><span class="se">\\</span><span class="s1">hakril</span><span class="se">\\</span><span class="s1">Documents</span><span class="se">\\</span><span class="s1">projets</span><span class="se">\\</span><span class="s1">PythonForWindows</span><span class="se">\\</span><span class="s1">samples&#39;</span>
<span class="mh">0x1d65bb1fec4e48b</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">EventRecord</span> <span class="n">provider</span><span class="o">=</span><span class="s2">&quot;C0B508D3-5459-339F-A213-889C238CA5B1&quot;</span> <span class="nb">id</span><span class="o">=</span><span class="mi">10</span><span class="o">&gt;</span>
<span class="n">guid</span><span class="p">:</span> <span class="n">C0B508D3</span><span class="o">-</span><span class="mi">5459</span><span class="o">-</span><span class="mi">339</span><span class="n">F</span><span class="o">-</span><span class="n">A213</span><span class="o">-</span><span class="mi">889</span><span class="n">C238CA5B1</span>
<span class="nb">id</span><span class="p">:</span> <span class="mi">10</span>
<span class="n">opcode</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">level</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">data</span><span class="p">:</span> <span class="s1">&#39;C:</span><span class="se">\\</span><span class="s1">WINDOWS</span><span class="se">\\</span><span class="s1">SysWOW64</span><span class="se">\\</span><span class="s1">mmc.exe&quot;C:</span><span class="se">\\</span><span class="s1">WINDOWS</span><span class="se">\\</span><span class="s1">SysWOW64</span><span class="se">\\</span><span class="s1">mmc.exe&quot; BAD_MMC_FILENAME` &#39;</span>
<span class="mh">0x1d65bb1fec7c8eb</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">EventRecord</span> <span class="n">provider</span><span class="o">=</span><span class="s2">&quot;C0B508D3-5459-339F-A213-889C238CA5B1&quot;</span> <span class="nb">id</span><span class="o">=</span><span class="mi">13</span><span class="o">&gt;</span>
<span class="n">guid</span><span class="p">:</span> <span class="n">C0B508D3</span><span class="o">-</span><span class="mi">5459</span><span class="o">-</span><span class="mi">339</span><span class="n">F</span><span class="o">-</span><span class="n">A213</span><span class="o">-</span><span class="mi">889</span><span class="n">C238CA5B1</span>
<span class="nb">id</span><span class="p">:</span> <span class="mi">13</span>
<span class="n">opcode</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">level</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">data</span><span class="p">:</span> <span class="s1">&#39;C:</span><span class="se">\\</span><span class="s1">WINDOWS</span><span class="se">\\</span><span class="s1">SysWOW64</span><span class="se">\\</span><span class="s1">mmc.exe&#39;</span>
<span class="mh">0x1d65bb1fec7c8f0</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">EventRecord</span> <span class="n">provider</span><span class="o">=</span><span class="s2">&quot;C0B508D3-5459-339F-A213-889C238CA5B1&quot;</span> <span class="nb">id</span><span class="o">=</span><span class="mi">14</span><span class="o">&gt;</span>
<span class="n">guid</span><span class="p">:</span> <span class="n">C0B508D3</span><span class="o">-</span><span class="mi">5459</span><span class="o">-</span><span class="mi">339</span><span class="n">F</span><span class="o">-</span><span class="n">A213</span><span class="o">-</span><span class="mi">889</span><span class="n">C238CA5B1</span>
<span class="nb">id</span><span class="p">:</span> <span class="mi">14</span>
<span class="n">opcode</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">level</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">data</span><span class="p">:</span> <span class="s1">&#39;&quot;C:</span><span class="se">\\</span><span class="s1">WINDOWS</span><span class="se">\\</span><span class="s1">SysWOW64</span><span class="se">\\</span><span class="s1">mmc.exe&quot; BAD_MMC_FILENAME&#39;</span>
<span class="p">[</span><span class="o">...</span><span class="p">]</span>
<span class="mh">0x1d65bb1feca018d</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">EventRecord</span> <span class="n">provider</span><span class="o">=</span><span class="s2">&quot;172FF31C-2D80-31A6-FCA8-EB000D380666&quot;</span> <span class="nb">id</span><span class="o">=</span><span class="mi">11</span><span class="o">&gt;</span>
<span class="n">guid</span><span class="p">:</span> <span class="mi">172</span><span class="n">FF31C</span><span class="o">-</span><span class="mi">2</span><span class="n">D80</span><span class="o">-</span><span class="mi">31</span><span class="n">A6</span><span class="o">-</span><span class="n">FCA8</span><span class="o">-</span><span class="n">EB000D380666</span>
<span class="nb">id</span><span class="p">:</span> <span class="mi">11</span>
<span class="n">opcode</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">level</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">data</span><span class="p">:</span> <span class="s1">&#39;C:</span><span class="se">\\</span><span class="s1">WINDOWS</span><span class="se">\\</span><span class="s1">SysWOW64</span><span class="se">\\</span><span class="s1">mmc.exe&#39;</span>
<span class="mh">0x1d65bb1feca030d</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">EventRecord</span> <span class="n">provider</span><span class="o">=</span><span class="s2">&quot;172FF31C-2D80-31A6-FCA8-EB000D380666&quot;</span> <span class="nb">id</span><span class="o">=</span><span class="mi">25</span><span class="o">&gt;</span>
<span class="n">guid</span><span class="p">:</span> <span class="mi">172</span><span class="n">FF31C</span><span class="o">-</span><span class="mi">2</span><span class="n">D80</span><span class="o">-</span><span class="mi">31</span><span class="n">A6</span><span class="o">-</span><span class="n">FCA8</span><span class="o">-</span><span class="n">EB000D380666</span>
<span class="nb">id</span><span class="p">:</span> <span class="mi">25</span>
<span class="n">opcode</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">level</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">data</span><span class="p">:</span> <span class="s1">&#39;C:</span><span class="se">\\</span><span class="s1">WINDOWS</span><span class="se">\\</span><span class="s1">SysWOW64</span><span class="se">\\</span><span class="s1">mmc.exe</span><span class="se">\x08\x02</span><span class="s1">TRUEFALSE</span><span class="se">\x10</span><span class="s1">&#39;</span>
<span class="mh">0x1d65bb1fecfcdc0</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">EventRecord</span> <span class="n">provider</span><span class="o">=</span><span class="s2">&quot;172FF31C-2D80-31A6-FCA8-EB000D380666&quot;</span> <span class="nb">id</span><span class="o">=</span><span class="mi">27</span><span class="o">&gt;</span>
<span class="n">guid</span><span class="p">:</span> <span class="mi">172</span><span class="n">FF31C</span><span class="o">-</span><span class="mi">2</span><span class="n">D80</span><span class="o">-</span><span class="mi">31</span><span class="n">A6</span><span class="o">-</span><span class="n">FCA8</span><span class="o">-</span><span class="n">EB000D380666</span>
<span class="nb">id</span><span class="p">:</span> <span class="mi">27</span>
<span class="n">opcode</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">level</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">data</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\x05</span><span class="s1">TRUETRUE&#39;</span>
<span class="p">[</span><span class="o">...</span><span class="p">]</span>
</pre></div>
</div>
</section>
<section id="enumeration">
<h3><span class="section-number">18.22.2. </span>Enumeration<a class="headerlink" href="#enumeration" title="Link to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">windows</span>
<span class="n">etwmgr</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">etw</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ETW Manager is: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">etwmgr</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listing some ETW sessions:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">sess</span> <span class="ow">in</span> <span class="n">etwmgr</span><span class="o">.</span><span class="n">sessions</span><span class="p">[:</span><span class="mi">2</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sess</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * name: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sess</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * guid: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sess</span><span class="o">.</span><span class="n">guid</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * id: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sess</span><span class="o">.</span><span class="n">id</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * logfile: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sess</span><span class="o">.</span><span class="n">logfile</span><span class="p">))</span>
<span class="n">sess</span> <span class="o">=</span> <span class="n">etwmgr</span><span class="o">.</span><span class="n">sessions</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">target_id</span> <span class="o">=</span> <span class="n">sess</span><span class="o">.</span><span class="n">id</span>
<span class="n">NB_MATCH</span> <span class="o">=</span> <span class="mi">0</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Looking for providers for: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sess</span><span class="p">))</span>
<span class="k">for</span> <span class="n">provider</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">etw</span><span class="o">.</span><span class="n">providers</span><span class="p">:</span>
<span class="k">if</span> <span class="n">NB_MATCH</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
<span class="k">break</span>
<span class="k">for</span> <span class="n">instance</span> <span class="ow">in</span> <span class="n">provider</span><span class="o">.</span><span class="n">instances</span><span class="p">:</span>
<span class="k">if</span> <span class="n">NB_MATCH</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
<span class="k">break</span>
<span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="n">instance</span><span class="o">.</span><span class="n">sessions</span><span class="p">:</span>
<span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">LoggerId</span> <span class="o">==</span> <span class="n">target_id</span> <span class="ow">and</span> <span class="n">instance</span><span class="o">.</span><span class="n">Pid</span><span class="p">:</span>
<span class="n">proc</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">processes</span> <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">pid</span> <span class="o">==</span> <span class="n">instance</span><span class="o">.</span><span class="n">Pid</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Found a provider/session for target:&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Provider: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">provider</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Instance: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">instance</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Process: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">proc</span><span class="p">))</span>
<span class="n">NB_MATCH</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">NB_MATCH</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
<span class="k">break</span>
<span class="k">break</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">etw</span>\<span class="n">etw_enumeration</span><span class="o">.</span><span class="n">py</span>
<span class="n">ETW</span> <span class="n">Manager</span> <span class="ow">is</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">windows</span><span class="o">.</span><span class="n">winobject</span><span class="o">.</span><span class="n">event_trace</span><span class="o">.</span><span class="n">EtwManager</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x03AFBF70</span><span class="o">&gt;</span>
<span class="n">Listing</span> <span class="n">some</span> <span class="n">ETW</span> <span class="n">sessions</span><span class="p">:</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">EventTraceProperties</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;AppModel&quot;</span> <span class="n">guid</span><span class="o">=</span><span class="n">A922A8BE</span><span class="o">-</span><span class="mi">2450</span><span class="o">-</span><span class="mf">438E-9520</span><span class="o">-</span><span class="n">FBCDFB46B0BD</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">name</span><span class="p">:</span> <span class="n">AppModel</span>
<span class="o">*</span> <span class="n">guid</span><span class="p">:</span> <span class="n">A922A8BE</span><span class="o">-</span><span class="mi">2450</span><span class="o">-</span><span class="mf">438E-9520</span><span class="o">-</span><span class="n">FBCDFB46B0BD</span>
<span class="o">*</span> <span class="nb">id</span><span class="p">:</span> <span class="mi">4</span>
<span class="o">*</span> <span class="n">logfile</span><span class="p">:</span>
<span class="o">*</span> <span class="o">&lt;</span><span class="n">EventTraceProperties</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;LwtNetLog&quot;</span> <span class="n">guid</span><span class="o">=</span><span class="mi">603</span><span class="n">BA31E</span><span class="o">-</span><span class="n">EC5A</span><span class="o">-</span><span class="mi">4</span><span class="n">CDE</span><span class="o">-</span><span class="n">BE87</span><span class="o">-</span><span class="n">ED0A16C3B170</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">name</span><span class="p">:</span> <span class="n">LwtNetLog</span>
<span class="o">*</span> <span class="n">guid</span><span class="p">:</span> <span class="mi">603</span><span class="n">BA31E</span><span class="o">-</span><span class="n">EC5A</span><span class="o">-</span><span class="mi">4</span><span class="n">CDE</span><span class="o">-</span><span class="n">BE87</span><span class="o">-</span><span class="n">ED0A16C3B170</span>
<span class="o">*</span> <span class="nb">id</span><span class="p">:</span> <span class="mi">14</span>
<span class="o">*</span> <span class="n">logfile</span><span class="p">:</span> <span class="n">C</span><span class="p">:</span>\<span class="n">WINDOWS</span>\<span class="n">System32</span>\<span class="n">LogFiles</span>\<span class="n">WMI</span>\<span class="n">LwtNetLog</span><span class="o">.</span><span class="n">etl</span>
<span class="n">Looking</span> <span class="k">for</span> <span class="n">providers</span> <span class="k">for</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">EventTraceProperties</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;LwtNetLog&quot;</span> <span class="n">guid</span><span class="o">=</span><span class="mi">603</span><span class="n">BA31E</span><span class="o">-</span><span class="n">EC5A</span><span class="o">-</span><span class="mi">4</span><span class="n">CDE</span><span class="o">-</span><span class="n">BE87</span><span class="o">-</span><span class="n">ED0A16C3B170</span><span class="o">&gt;</span>
<span class="n">Found</span> <span class="n">a</span> <span class="n">provider</span><span class="o">/</span><span class="n">session</span> <span class="k">for</span> <span class="n">target</span><span class="p">:</span>
<span class="o">*</span> <span class="n">Provider</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">TraceProvider</span> <span class="k">for</span> <span class="s2">&quot;43D1A55C-76D6-4F7E-995C-64C711E5CAFE&quot;</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">Instance</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">TraceProviderInstanceInfo</span> <span class="n">Pid</span><span class="o">=</span><span class="mi">5256</span> <span class="n">EnableCount</span><span class="o">=</span><span class="mi">1</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">Process</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">WinProcess</span> <span class="s2">&quot;RuntimeBroker.exe&quot;</span> <span class="n">pid</span> <span class="mi">5256</span> <span class="n">at</span> <span class="mh">0x54c39d0</span><span class="o">&gt;</span>
<span class="n">Found</span> <span class="n">a</span> <span class="n">provider</span><span class="o">/</span><span class="n">session</span> <span class="k">for</span> <span class="n">target</span><span class="p">:</span>
<span class="o">*</span> <span class="n">Provider</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">TraceProvider</span> <span class="k">for</span> <span class="s2">&quot;43D1A55C-76D6-4F7E-995C-64C711E5CAFE&quot;</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">Instance</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">TraceProviderInstanceInfo</span> <span class="n">Pid</span><span class="o">=</span><span class="mi">10768</span> <span class="n">EnableCount</span><span class="o">=</span><span class="mi">1</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">Process</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">WinProcess</span> <span class="s2">&quot;chrome.exe&quot;</span> <span class="n">pid</span> <span class="mi">10768</span> <span class="n">at</span> <span class="mh">0x54c3930</span><span class="o">&gt;</span>
<span class="n">Found</span> <span class="n">a</span> <span class="n">provider</span><span class="o">/</span><span class="n">session</span> <span class="k">for</span> <span class="n">target</span><span class="p">:</span>
<span class="o">*</span> <span class="n">Provider</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">TraceProvider</span> <span class="k">for</span> <span class="s2">&quot;43D1A55C-76D6-4F7E-995C-64C711E5CAFE&quot;</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">Instance</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">TraceProviderInstanceInfo</span> <span class="n">Pid</span><span class="o">=</span><span class="mi">10236</span> <span class="n">EnableCount</span><span class="o">=</span><span class="mi">1</span><span class="o">&gt;</span>
<span class="o">*</span> <span class="n">Process</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">WinProcess</span> <span class="s2">&quot;YourPhone.exe&quot;</span> <span class="n">pid</span> <span class="mi">10236</span> <span class="n">at</span> <span class="mh">0x54c37d0</span><span class="o">&gt;</span>
</pre></div>
</div>
</section>
</section>
</section>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<div>
<h3><a href="index.html">Table of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">18. Samples of code</a><ul>
<li><a class="reference internal" href="#processes">18.1. Processes</a><ul>
<li><a class="reference internal" href="#windows-current-process">18.1.1. <code class="docutils literal notranslate"><span class="pre">windows.current_process</span></code></a></li>
<li><a class="reference internal" href="#remote-process-winprocess">18.1.2. Remote process : <code class="xref py py-class docutils literal notranslate"><span class="pre">WinProcess</span></code></a></li>
<li><a class="reference internal" href="#peb-exploration">18.1.3. <code class="xref py py-class docutils literal notranslate"><span class="pre">PEB</span></code> exploration</a></li>
<li><a class="reference internal" href="#apisetmap">18.1.4. ApiSetMap</a></li>
<li><a class="reference internal" href="#iat-hooking">18.1.5. IAT hooking</a></li>
<li><a class="reference internal" href="#microsoft-store-python-injection">18.1.6. Microsoft Store Python Injection</a></li>
</ul>
</li>
<li><a class="reference internal" href="#token">18.2. Token</a></li>
<li><a class="reference internal" href="#windows-system">18.3. <code class="docutils literal notranslate"><span class="pre">windows.system</span></code></a></li>
<li><a class="reference internal" href="#services">18.4. Services</a><ul>
<li><a class="reference internal" href="#windows-service-in-python">18.4.1. Windows Service in Python</a></li>
</ul>
</li>
<li><a class="reference internal" href="#network-socket-exploration">18.5. <code class="xref py py-class docutils literal notranslate"><span class="pre">Network</span></code> - socket exploration</a></li>
<li><a class="reference internal" href="#registry">18.6. <code class="xref py py-class docutils literal notranslate"><span class="pre">Registry</span></code></a></li>
<li><a class="reference internal" href="#scheduled-tasks">18.7. Scheduled tasks</a></li>
<li><a class="reference internal" href="#event-log">18.8. Event Log</a></li>
<li><a class="reference internal" href="#object-manager">18.9. Object manager</a><ul>
<li><a class="reference internal" href="#find-objects">18.9.1. find objects</a></li>
</ul>
</li>
<li><a class="reference internal" href="#device-manager">18.10. Device manager</a><ul>
<li><a class="reference internal" href="#enumerate-devices">18.10.1. Enumerate devices</a></li>
</ul>
</li>
<li><a class="reference internal" href="#windows-wintrust">18.11. <code class="docutils literal notranslate"><span class="pre">windows.wintrust</span></code></a></li>
<li><a class="reference internal" href="#vectoredexception">18.12. <code class="xref py py-func docutils literal notranslate"><span class="pre">VectoredException()</span></code></a><ul>
<li><a class="reference internal" href="#in-local-process">18.12.1. In local process</a></li>
<li><a class="reference internal" href="#in-remote-process">18.12.2. In remote process</a></li>
</ul>
</li>
<li><a class="reference internal" href="#debugging">18.13. Debugging</a><ul>
<li><a class="reference internal" href="#debugger">18.13.1. <code class="xref py py-class docutils literal notranslate"><span class="pre">Debugger</span></code></a><ul>
<li><a class="reference internal" href="#on-setup">18.13.1.1. on_setup</a></li>
<li><a class="reference internal" href="#single-stepping">18.13.1.2. Single stepping</a></li>
<li><a class="reference internal" href="#windows-debug-functioncallbp">18.13.1.3. <code class="xref py py-class docutils literal notranslate"><span class="pre">windows.debug.FunctionCallBP</span></code></a></li>
<li><a class="reference internal" href="#windows-debug-functionbp">18.13.1.4. <code class="xref py py-class docutils literal notranslate"><span class="pre">windows.debug.FunctionBP</span></code></a></li>
<li><a class="reference internal" href="#debugger-attach">18.13.1.5. <code class="xref py py-func docutils literal notranslate"><span class="pre">Debugger.attach</span></code></a></li>
<li><a class="reference internal" href="#native-code-tester">18.13.1.6. Native code tester</a></li>
</ul>
</li>
<li><a class="reference internal" href="#symboldebugger">18.13.2. <code class="xref py py-class docutils literal notranslate"><span class="pre">SymbolDebugger</span></code></a></li>
<li><a class="reference internal" href="#localdebugger">18.13.3. <code class="xref py py-class docutils literal notranslate"><span class="pre">LocalDebugger</span></code></a><ul>
<li><a class="reference internal" href="#in-current-process">18.13.3.1. In current process</a></li>
<li><a class="reference internal" href="#id1">18.13.3.2. In remote process</a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#symbols">18.14. Symbols</a><ul>
<li><a class="reference internal" href="#virtualsymbolhandler">18.14.1. VirtualSymbolHandler</a></li>
<li><a class="reference internal" href="#processsymbolhandler">18.14.2. ProcessSymbolHandler</a></li>
<li><a class="reference internal" href="#symbol-search">18.14.3. Symbol search</a></li>
</ul>
</li>
<li><a class="reference internal" href="#wmi">18.15. WMI</a><ul>
<li><a class="reference internal" href="#wmi-requests">18.15.1. WMI requests</a></li>
<li><a class="reference internal" href="#wmi-create-process">18.15.2. WMI Create Process</a></li>
</ul>
</li>
<li><a class="reference internal" href="#windows-com">18.16. <code class="xref py py-mod docutils literal notranslate"><span class="pre">windows.com</span></code></a><ul>
<li><a class="reference internal" href="#inetfwpolicy2">18.16.1. <code class="docutils literal notranslate"><span class="pre">INetFwPolicy2</span></code></a></li>
<li><a class="reference internal" href="#icallinterceptor">18.16.2. <code class="docutils literal notranslate"><span class="pre">ICallInterceptor</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#windows-crypto">18.17. <code class="xref py py-mod docutils literal notranslate"><span class="pre">windows.crypto</span></code></a><ul>
<li><a class="reference internal" href="#encryption-demo">18.17.1. Encryption demo</a></li>
<li><a class="reference internal" href="#certificate-demo">18.17.2. Certificate demo</a></li>
</ul>
</li>
<li><a class="reference internal" href="#windows-alpc">18.18. <code class="xref py py-mod docutils literal notranslate"><span class="pre">windows.alpc</span></code></a><ul>
<li><a class="reference internal" href="#simple-alpc-communication">18.18.1. simple alpc communication</a></li>
<li><a class="reference internal" href="#advanced-alpc-communication">18.18.2. advanced alpc communication</a></li>
</ul>
</li>
<li><a class="reference internal" href="#windows-rpc">18.19. <code class="xref py py-mod docutils literal notranslate"><span class="pre">windows.rpc</span></code></a><ul>
<li><a class="reference internal" href="#manual-uac">18.19.1. Manual UAC</a></li>
<li><a class="reference internal" href="#manual-lsarenumerateprivileges">18.19.2. Manual <code class="docutils literal notranslate"><span class="pre">LsarEnumeratePrivileges</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#windows-pipe">18.20. <code class="xref py py-mod docutils literal notranslate"><span class="pre">windows.pipe</span></code></a><ul>
<li><a class="reference internal" href="#communication-with-an-injected-process">18.20.1. Communication with an injected process</a></li>
</ul>
</li>
<li><a class="reference internal" href="#windows-security">18.21. <code class="xref py py-mod docutils literal notranslate"><span class="pre">windows.security</span></code></a><ul>
<li><a class="reference internal" href="#security-descriptor">18.21.1. Security Descriptor</a></li>
<li><a class="reference internal" href="#query-sacl">18.21.2. Query SACL</a></li>
</ul>
</li>
<li><a class="reference internal" href="#etw-event-tracing-for-windows">18.22. ETW (Event Tracing for Windows)</a><ul>
<li><a class="reference internal" href="#trace-processing">18.22.1. Trace processing</a></li>
<li><a class="reference internal" href="#enumeration">18.22.2. Enumeration</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div>
<h4>Previous topic</h4>
<p class="topless"><a href="internals.html"
title="previous chapter"><span class="section-number">17. </span>Internals</a></p>
</div>
<div>
<h4>Next topic</h4>
<p class="topless"><a href="encoding.html"
title="next chapter"><span class="section-number">19. </span>Python, Windows &amp; encoding</a></p>
</div>
<div role="note" aria-label="source link">
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/sample.rst.txt"
rel="nofollow">Show Source</a></li>
</ul>
</div>
<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="right" >
<a href="encoding.html" title="19. Python, Windows &amp; encoding"
>next</a> |</li>
<li class="right" >
<a href="internals.html" title="17. Internals"
>previous</a> |</li>
<li class="nav-item nav-item-0"><a href="index.html">PythonForWindows 1.0.3 documentation</a> &#187;</li>
<li class="nav-item nav-item-this"><a href=""><span class="section-number">18. </span>Samples of code</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2015-2020, Clement Rouault.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
</div>
</body>
</html>