Files
hakril-PythonForWindows/docs/build/html/sample.html
T
2018-03-07 10:24:46 +01:00

2749 lines
419 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>17. Samples of code &#8212; PythonForWindows 0.3 documentation</title>
<link rel="stylesheet" href="_static/classic.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/mbasic.css" type="text/css" />
<script type="text/javascript" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="prev" title="16. 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="internals.html" title="16. Internals"
accesskey="P">previous</a> |</li>
<li class="nav-item nav-item-0"><a href="index.html">PythonForWindows 0.3 documentation</a> &#187;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="samples-of-code">
<span id="sample-of-code"></span><h1>17. Samples of code<a class="headerlink" href="#samples-of-code" title="Permalink to this headline"></a></h1>
<div class="section" id="processes">
<h2>17.1. Processes<a class="headerlink" href="#processes" title="Permalink to this headline"></a></h2>
<div class="section" id="windows-current-process">
<span id="sample-current-process"></span><h3>17.1.1. <code class="docutils literal notranslate"><span class="pre">windows.current_process</span></code><a class="headerlink" href="#windows-current-process" title="Permalink to this headline"></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 0x06407430&gt;
current process is a &lt;32&gt; bits process
current process is a SysWow64 process ? &lt;True&gt;
current process pid &lt;11344&gt; and ppid &lt;14984&gt;
Here are the current process threads: &lt;[&lt;WinThread 17288 owner &quot;CurrentProcess&quot; at 0x6a68870&gt;, &lt;WinThread 15176 owner &quot;CurrentProcess&quot; at 0x6a687b0&gt;, &lt;WinThread 8972 owner &quot;CurrentProcess&quot; at 0x6a68bf0&gt;, &lt;WinThread 5568 owner &quot;CurrentProcess&quot; at 0x6a68dd0&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;0x5510000&gt;
Writing &#39;SOME STUFF&#39; in allocation memory
Reading memory : &lt;&#39;SOME STUFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&#39;&gt;
</pre></div>
</div>
</div>
<div class="section" id="remote-process-winprocess">
<span id="sample-remote-process"></span><h3>17.1.2. 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="Permalink to this headline"></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>
</div>
<div class="section" id="peb-exploration">
<span id="sample-peb-exploration"></span><h3>17.1.3. <code class="xref py py-class docutils literal notranslate"><span class="pre">PEB</span></code> exploration<a class="headerlink" href="#peb-exploration" title="Permalink to this headline"></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>
</div>
<div class="section" id="apisetmap">
<span id="sample-apisetmap"></span><h3>17.1.4. ApiSetMap<a class="headerlink" href="#apisetmap" title="Permalink to this headline"></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="n">dll_demos_fullname</span> <span class="o">=</span> <span class="s1">&#39;api-ms-win-core-processthreads-l1-1-3&#39;</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>
</div>
<div class="section" id="iat-hooking">
<span id="sample-iat-hook"></span><h3>17.1.5. IAT hooking<a class="headerlink" href="#iat-hooking" title="Permalink to this headline"></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">_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"># 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">RegOpenKeyExA_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="mi">0</span><span class="p">]</span>
<span class="c1"># Setup our hook</span>
<span class="n">RegOpenKeyExA_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"># 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>
</div>
</div>
<div class="section" id="windows-system">
<span id="sample-system"></span><h2>17.2. <code class="docutils literal notranslate"><span class="pre">windows.system</span></code><a class="headerlink" href="#windows-system" title="Permalink to this headline"></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>
</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="n">VER_NT_WORKSTATION</span><span class="p">(</span><span class="mh">0x1</span><span class="n">L</span><span class="p">)</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">222</span> <span class="n">processes</span>
<span class="n">There</span> <span class="ow">is</span> <span class="mi">2716</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;C:</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">C</span><span class="p">:</span>\
<span class="nb">type</span> <span class="o">=</span> <span class="n">DRIVE_FIXED</span><span class="p">(</span><span class="mh">0x3</span><span class="n">L</span><span class="p">)</span>
<span class="n">path</span> <span class="o">=</span> \<span class="n">Device</span>\<span class="n">HarddiskVolume2</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">ServiceA</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="n">L</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="n">ServiceStatus</span><span class="p">(</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="n">L</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="n">L</span><span class="p">),</span> <span class="n">control_accepted</span><span class="o">=</span><span class="mi">0</span><span class="n">L</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="n">L</span><span class="p">)</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">ServiceA</span> <span class="s2">&quot;Appinfo&quot;</span> <span class="n">SERVICE_RUNNING</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">name</span> <span class="o">=</span> <span class="n">Appinfo</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">Application</span> <span class="n">Information</span>
<span class="n">status</span> <span class="o">=</span> <span class="n">ServiceStatus</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="mi">48</span><span class="n">L</span><span class="p">,</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="n">L</span><span class="p">),</span> <span class="n">control_accepted</span><span class="o">=</span><span class="mi">129</span><span class="n">L</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="n">L</span><span class="p">)</span>
<span class="n">process</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">WinProcess</span> <span class="s2">&quot;svchost.exe&quot;</span> <span class="n">pid</span> <span class="mi">13288</span> <span class="n">at</span> <span class="mh">0x63ffc10</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">106325</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">Handle</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">261</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">Handle</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">16752</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>
</pre></div>
</div>
</div>
<div class="section" id="network-socket-exploration">
<span id="sample-network-exploration"></span><h2>17.3. <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="Permalink to this headline"></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</span><span class="o">.</span><span class="mf">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</span><span class="o">.</span><span class="mf">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</span><span class="o">.</span><span class="mf">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</span><span class="o">.</span><span class="mf">0.1</span><span class="p">:</span><span class="mi">912</span> <span class="o">-&gt;</span> <span class="mf">127.0</span><span class="o">.</span><span class="mf">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</span><span class="o">.</span><span class="mf">0.1</span><span class="p">:</span><span class="mi">912</span> <span class="o">-&gt;</span> <span class="mf">127.0</span><span class="o">.</span><span class="mf">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</span><span class="o">.</span><span class="mf">0.1</span><span class="p">:</span><span class="mi">49488</span> <span class="o">-&gt;</span> <span class="mf">127.0</span><span class="o">.</span><span class="mf">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</span><span class="o">.</span><span class="mf">0.1</span><span class="p">:</span><span class="mi">57167</span> <span class="o">-&gt;</span> <span class="mf">127.0</span><span class="o">.</span><span class="mf">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>
</div>
<div class="section" id="registry">
<span id="sample-registry"></span><h2>17.4. <code class="xref py py-class docutils literal notranslate"><span class="pre">Registry</span></code><a class="headerlink" href="#registry" title="Permalink to this headline"></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>
</div>
<div class="section" id="windows-wintrust">
<span id="sample-wintrust"></span><h2>17.5. <code class="docutils literal notranslate"><span class="pre">windows.wintrust</span></code><a class="headerlink" href="#windows-wintrust" title="Permalink to this headline"></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">Package_802_for_KB4054517</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</span><span class="o">.</span><span class="mf">1.6</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">python27</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">False</span> <span class="p">(</span><span class="n">TRUST_E_NOSIGNATURE</span><span class="p">(</span><span class="mh">0x800b0100</span><span class="n">L</span><span class="p">))</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">winsxs</span>\<span class="n">x86_microsoft</span><span class="o">.</span><span class="n">vc90</span><span class="o">.</span><span class="n">crt_1fc8b3b9a1e18e3b_9</span><span class="o">.</span><span class="mf">0.30729</span><span class="o">.</span><span class="mi">9317</span><span class="n">_none_508dca76bcbcfe81</span>\<span class="n">msvcr90</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>
</div>
<div class="section" id="vectoredexception">
<span id="sample-vectoredexception"></span><h2>17.6. <code class="xref py py-func docutils literal notranslate"><span class="pre">VectoredException()</span></code><a class="headerlink" href="#vectoredexception" title="Permalink to this headline"></a></h2>
<div class="section" id="in-local-process">
<h3>17.6.1. In local process<a class="headerlink" href="#in-local-process" title="Permalink to this headline"></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="k">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="k">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">0x7270000</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">0x6a54c166</span> <span class="n">accessed</span> <span class="n">to</span> <span class="n">addr</span> <span class="mh">0x7270000</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="n">L</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">0x6a54c166</span> <span class="n">accessed</span> <span class="n">to</span> <span class="n">addr</span> <span class="mh">0x7270010</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="n">L</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>
</div>
<div class="section" id="in-remote-process">
<h3>17.6.2. In remote process<a class="headerlink" href="#in-remote-process" title="Permalink to this headline"></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="k">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>
</div>
</div>
<div class="section" id="debugging">
<span id="sample-debugger"></span><h2>17.7. Debugging<a class="headerlink" href="#debugging" title="Permalink to this headline"></a></h2>
<div class="section" id="debugger">
<h3>17.7.1. <code class="xref py py-class docutils literal notranslate"><span class="pre">Debugger</span></code><a class="headerlink" href="#debugger" title="Permalink to this headline"></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="k">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="nf">__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">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">EXCEPTION_BREAKPOINT</span><span class="p">(</span><span class="mh">0x80000003</span><span class="n">L</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0x77e0dadf</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">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">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">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">processthreads</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="mf">2.</span><span class="n">dll</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">uxtheme</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">c</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">system32</span>\<span class="n">mrmcorer</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">c</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">system32</span>\<span class="n">windows</span><span class="o">.</span><span class="n">storage</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">c</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">system32</span>\<span class="n">efswrt</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">c</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">system32</span>\<span class="n">twinapi</span><span class="o">.</span><span class="n">appcore</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">rpcrt4</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">c</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">system32</span>\<span class="n">wintypes</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">c</span><span class="p">:</span>\<span class="n">windows</span>\<span class="n">syswow64</span>\<span class="n">wintypes</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>
<div class="section" id="single-stepping">
<h4>17.7.1.1. Single stepping<a class="headerlink" href="#single-stepping" title="Permalink to this headline"></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="k">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">__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="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="n">L</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0x77e0dadf</span>
<span class="n">Instruction</span> <span class="n">at</span> <span class="o">&lt;</span><span class="mh">0x520006</span><span class="o">&gt;</span> <span class="n">wrote</span> <span class="n">at</span> <span class="o">&lt;</span><span class="mh">0x530000</span><span class="o">&gt;</span>
<span class="n">Got</span> <span class="n">single_step</span> <span class="n">EXCEPTION_SINGLE_STEP</span><span class="p">(</span><span class="mh">0x80000004</span><span class="n">L</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0x52000c</span>
<span class="n">Got</span> <span class="n">single_step</span> <span class="n">EXCEPTION_SINGLE_STEP</span><span class="p">(</span><span class="mh">0x80000004</span><span class="n">L</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0x520011</span>
<span class="n">Instruction</span> <span class="n">at</span> <span class="o">&lt;</span><span class="mh">0x520011</span><span class="o">&gt;</span> <span class="n">wrote</span> <span class="n">at</span> <span class="o">&lt;</span><span class="mh">0x530004</span><span class="o">&gt;</span>
<span class="n">Got</span> <span class="n">single_step</span> <span class="n">EXCEPTION_SINGLE_STEP</span><span class="p">(</span><span class="mh">0x80000004</span><span class="n">L</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0x520017</span>
<span class="n">Got</span> <span class="n">single_step</span> <span class="n">EXCEPTION_SINGLE_STEP</span><span class="p">(</span><span class="mh">0x80000004</span><span class="n">L</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0x52001c</span>
<span class="n">Got</span> <span class="n">single_step</span> <span class="n">EXCEPTION_SINGLE_STEP</span><span class="p">(</span><span class="mh">0x80000004</span><span class="n">L</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0x520022</span>
<span class="n">Got</span> <span class="n">single_step</span> <span class="n">EXCEPTION_SINGLE_STEP</span><span class="p">(</span><span class="mh">0x80000004</span><span class="n">L</span><span class="p">)</span> <span class="n">at</span> <span class="mh">0x520023</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>
</div>
<div class="section" id="windows-debug-functionbp">
<h4>17.7.1.2. <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="Permalink to this headline"></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="k">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;86250608&gt;: handle = 0x124
Handle manually found! typename=&lt;File&gt;, name=&lt;\Device\HarddiskVolume2\Windows\SysWOW64\en-US\notepad.exe.mui&gt;
NtCreateFile of &lt;1996168876&gt;: handle = 0x150
Handle manually found! typename=&lt;File&gt;, name=&lt;\Device\DeviceApi&gt;
NtCreateFile of &lt;86206640&gt;: handle = 0x280
Handle manually found! typename=&lt;File&gt;, name=&lt;\Device\HarddiskVolume2\Windows\Fonts\StaticCache.dat&gt;
Exiting process
</pre></div>
</div>
</div>
<div class="section" id="debugger-attach">
<span id="sample-debugger-attach"></span><h4>17.7.1.3. <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="Permalink to this headline"></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="k">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="k">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;12252&gt;
Target is &lt;WinProcess &quot;notepad.exe&quot; pid 12252 at 0x66971b0&gt;
Debugger attached: &lt;windows.debug.debugger.Debugger object at 0x0667CFD0&gt;
NtCreateFile of &lt;10573272&gt;: handle = 0x144
Handle manually found! typename=&lt;File&gt;, name=&lt;\Device\HarddiskVolume2\Windows\SysWOW64\en-US\notepad.exe.mui&gt;
NtCreateFile of &lt;1996168876&gt;: handle = 0x170
Handle manually found! typename=&lt;File&gt;, name=&lt;\Device\DeviceApi&gt;
NtCreateFile of &lt;10504328&gt;: handle = 0x2a8
Handle manually found! typename=&lt;File&gt;, name=&lt;\Device\HarddiskVolume2\Windows\Fonts\StaticCache.dat&gt;
Exiting process
</pre></div>
</div>
</div>
<div class="section" id="native-code-tester">
<h4>17.7.1.4. Native code tester<a class="headerlink" href="#native-code-tester" title="Permalink to this headline"></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="k">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">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="nf">__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="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="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="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="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_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="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">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">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="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">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;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>
</div>
</div>
<div class="section" id="localdebugger">
<span id="sample-local-debugger"></span><h3>17.7.2. <code class="xref py py-class docutils literal notranslate"><span class="pre">LocalDebugger</span></code><a class="headerlink" href="#localdebugger" title="Permalink to this headline"></a></h3>
<div class="section" id="in-current-process">
<h4>17.7.2.1. In current process<a class="headerlink" href="#in-current-process" title="Permalink to this headline"></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">from</span> <span class="nn">windows.generated_def.winstructs</span> <span class="k">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}</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="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 = 0x5450002
GOT AN HXBP at 0x5450002
EXCEPTION !!!! Got a EXCEPTION_SINGLE_STEP(0x80000004L) at 0x5450003
EXCEPTION !!!! Got a EXCEPTION_SINGLE_STEP(0x80000004L) at 0x5450004
EXCEPTION !!!! Got a EXCEPTION_SINGLE_STEP(0x80000004L) at 0x5450005
EXCEPTION !!!! Got a EXCEPTION_SINGLE_STEP(0x80000004L) at 0x76948654
Done!
</pre></div>
</div>
</div>
<div class="section" id="id1">
<h4>17.7.2.2. In remote process<a class="headerlink" href="#id1" title="Permalink to this headline"></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="k">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="o">.</span><span class="mf">1.9600</span><span class="o">.</span><span class="mi">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>
</div>
</div>
</div>
<div class="section" id="wmi-requests">
<span id="wmi-request"></span><h2>17.8. WMI requests<a class="headerlink" href="#wmi-requests" title="Permalink to this headline"></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="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">select</span><span class="p">(</span><span class="s2">&quot;Win32_LogicalDisk&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;Caption&quot;</span><span class="p">,</span> <span class="s2">&quot;FileSystem&quot;</span><span class="p">,</span> <span class="s2">&quot;FreeSpace&quot;</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">vol</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="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><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">wmi</span>\<span class="n">wmi_request</span><span class="o">.</span><span class="n">py</span>
<span class="n">WMI</span> <span class="n">requester</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">wmi</span><span class="o">.</span><span class="n">WmiManager</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x05C70CA8</span><span class="o">&gt;</span>
<span class="n">Selecting</span> <span class="o">*</span> <span class="kn">from</span> <span class="s1">&#39;Win32_Process&#39;</span>
<span class="n">They</span> <span class="n">are</span> <span class="o">&lt;</span><span class="mi">188</span><span class="o">&gt;</span> <span class="n">processes</span>
<span class="n">Looking</span> <span class="k">for</span> <span class="n">ourself</span> <span class="n">via</span> <span class="n">pid</span>
<span class="n">Some</span> <span class="n">info</span> <span class="n">about</span> <span class="n">our</span> <span class="n">process</span><span class="p">:</span>
<span class="o">*</span> <span class="n">Name</span> <span class="o">-&gt;</span> <span class="n">python</span><span class="o">.</span><span class="n">exe</span>
<span class="o">*</span> <span class="n">ProcessId</span> <span class="o">-&gt;</span> <span class="mi">8144</span>
<span class="o">*</span> <span class="n">OSName</span> <span class="o">-&gt;</span> <span class="n">Microsoft</span> <span class="n">Windows</span> <span class="mi">10</span> <span class="n">Home</span><span class="o">|</span><span class="n">C</span><span class="p">:</span>\<span class="n">WINDOWS</span><span class="o">|</span>\<span class="n">Device</span>\<span class="n">Harddisk0</span>\<span class="n">Partition2</span>
<span class="o">*</span> <span class="n">UserModeTime</span> <span class="o">-&gt;</span> <span class="mi">1875000</span>
<span class="o">*</span> <span class="n">WindowsVersion</span> <span class="o">-&gt;</span> <span class="mf">10.0</span><span class="o">.</span><span class="mi">16299</span>
<span class="o">*</span> <span class="n">CommandLine</span> <span class="o">-&gt;</span> <span class="n">C</span><span class="p">:</span>\<span class="n">Python27</span>\<span class="n">python</span><span class="o">.</span><span class="n">exe</span> <span class="n">wmi</span>\<span class="n">wmi_request</span><span class="o">.</span><span class="n">py</span>
<span class="o">&lt;</span><span class="n">Select</span> <span class="n">Caption</span><span class="p">,</span><span class="n">FileSystem</span><span class="p">,</span><span class="n">FreeSpace</span> <span class="kn">from</span> <span class="nn">Win32_LogicalDisk</span><span class="o">&gt;</span><span class="p">:</span>
<span class="o">*</span> <span class="p">{</span><span class="s1">&#39;Caption&#39;</span><span class="p">:</span> <span class="sa">u</span><span class="s1">&#39;C:&#39;</span><span class="p">,</span> <span class="s1">&#39;FreeSpace&#39;</span><span class="p">:</span> <span class="sa">u</span><span class="s1">&#39;4704194560&#39;</span><span class="p">,</span> <span class="s1">&#39;FileSystem&#39;</span><span class="p">:</span> <span class="sa">u</span><span class="s1">&#39;NTFS&#39;</span><span class="p">}</span>
<span class="o">*</span> <span class="p">{</span><span class="s1">&#39;Caption&#39;</span><span class="p">:</span> <span class="sa">u</span><span class="s1">&#39;D:&#39;</span><span class="p">,</span> <span class="s1">&#39;FreeSpace&#39;</span><span class="p">:</span> <span class="sa">u</span><span class="s1">&#39;269887504384&#39;</span><span class="p">,</span> <span class="s1">&#39;FileSystem&#39;</span><span class="p">:</span> <span class="sa">u</span><span class="s1">&#39;NTFS&#39;</span><span class="p">}</span>
<span class="o">====</span> <span class="n">Advanced</span> <span class="n">use</span> <span class="o">====</span>
<span class="n">Listing</span> <span class="n">some</span> <span class="n">namespaces</span><span class="p">:</span>
<span class="o">*</span> <span class="n">CIMV2</span>
<span class="o">*</span> <span class="n">SecurityCenter2</span>
<span class="o">*</span> <span class="n">StandardCimv2</span>
<span class="n">Querying</span> <span class="n">non</span><span class="o">-</span><span class="n">default</span> <span class="n">namespace</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">WmiRequester</span> <span class="n">namespace</span><span class="o">=</span><span class="s2">&quot;root\SecurityCenter2&quot;</span><span class="o">&gt;</span>
<span class="n">Listing</span> <span class="n">some</span> <span class="n">available</span> <span class="n">classes</span><span class="p">:</span>
<span class="o">*</span> <span class="n">FirewallProduct</span>
<span class="o">*</span> <span class="n">AntiVirusProduct</span>
<span class="o">*</span> <span class="n">AntiSpywareProduct</span>
<span class="n">Listing</span> <span class="o">&lt;</span><span class="n">AntiVirusProduct</span><span class="o">&gt;</span><span class="p">:</span>
<span class="o">*</span> <span class="n">Windows</span> <span class="n">Defender</span>
</pre></div>
</div>
</div>
<div class="section" id="using-com-inetfwpolicy2">
<span id="sample-com-firewall"></span><h2>17.9. using COM: <code class="docutils literal notranslate"><span class="pre">INetFwPolicy2</span></code><a class="headerlink" href="#using-com-inetfwpolicy2" title="Permalink to this headline"></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="kn">from</span> <span class="nn">windows.generated_def</span> <span class="k">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="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="nb">object</span> <span class="n">at</span> <span class="mh">0x060677B0</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">IID</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="nb">object</span> <span class="n">at</span> <span class="mh">0x060677B0</span><span class="o">&gt;</span> <span class="p">(</span><span class="n">value</span> <span class="o">=</span> <span class="mh">0x85678080</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_PROFILE2_DOMAIN</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="kc">True</span>
<span class="o">*</span> <span class="n">NET_FW_PROFILE2_PRIVATE</span><span class="p">(</span><span class="mh">0x2</span><span class="n">L</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">True</span>
<span class="o">*</span> <span class="n">NET_FW_PROFILE2_PUBLIC</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="kc">True</span>
</pre></div>
</div>
</div>
<div class="section" id="windows-crypto">
<h2>17.10. <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="Permalink to this headline"></a></h2>
<div class="section" id="encryption-demo">
<span id="sample-crypto-encryption"></span><h3>17.10.1. Encryption demo<a class="headerlink" href="#encryption-demo" title="Permalink to this headline"></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="k">import</span> <span class="n">winproxy</span>
<span class="kn">from</span> <span class="nn">windows.generated_def</span> <span class="k">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="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="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="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="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="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">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">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">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 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 Kernel32Error(func_name)
windows.winproxy.Kernel32Error: 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>
</div>
<div class="section" id="certificate-demo">
<span id="sample-crypto-certificate"></span><h3>17.10.2. Certificate demo<a class="headerlink" href="#certificate-demo" title="Permalink to this headline"></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">windows.crypto</span>
<span class="n">windowscert</span> <span class="o">=</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="p">(</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="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="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;base64&#39;</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="s2">&quot;&quot;</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="s2">&quot;&quot;</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">windows</span><span class="o">.</span><span class="n">crypto</span><span class="o">.</span><span class="n">ECRYPT_DATA_BLOB</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">cbData</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">pbData</span><span class="p">)</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>(cmd) python crypto\certificate.py
Analysing certificate: &lt;Certificate &quot;Microsoft Windows&quot; serial=&quot;33 00 00 01 06 6e c3 25 c4 31 c9 18 0e 00 00 00 00 01 06&quot;&gt;
* name: &lt;Microsoft Windows&gt;
* issuer: &lt;Microsoft Windows Production PCA 2011&gt;
* raw_serial: &lt;[51, 0, 0, 1, 6, 110, 195, 37, 196, 49, 201, 24, 14, 0, 0, 0, 0, 1, 6]&gt;
* serial: &lt;33 00 00 01 06 6e c3 25 c4 31 c9 18 0e 00 00 00 00 01 06&gt;
* encoded start: &lt;bytearray(b&#39;0\x82\x05\x040\x82\x03\xec\xa0\x03\x02\x01\x02\x02\x133\x00\x00\x01\x06&#39;)&gt;
This certificate has 1 certificate chain(s)
Chain 0:
&lt;Certificate &quot;Microsoft Windows&quot; serial=&quot;33 00 00 01 06 6e c3 25 c4 31 c9 18 0e 00 00 00 00 01 06&quot;&gt;:
* issuer: &lt;Microsoft Windows Production PCA 2011&gt;
&lt;Certificate &quot;Microsoft Windows Production PCA 2011&quot; serial=&quot;61 07 76 56 00 00 00 00 00 08&quot;&gt;:
* issuer: &lt;Microsoft Root Certificate Authority 2010&gt;
&lt;Certificate &quot;Microsoft Root Certificate Authority 2010&quot; serial=&quot;28 cc 3a 25 bf ba 44 ac 44 9a 9b 58 6b 43 39 aa&quot;&gt;:
* issuer: &lt;Microsoft Root Certificate Authority 2010&gt;
Looking for &lt;Microsoft Root Certificate Authority 2010&gt; in trusted certificates
matches = [&lt;Certificate &quot;Microsoft Root Certificate Authority 2010&quot; serial=&quot;28 cc 3a 25 bf ba 44 ac 44 9a 9b 58 6b 43 39 aa&quot;&gt;]
Found it !
== PE Analysis ==
Target sha1 = &lt;339e4c236e716d4b6f6b10359c425eb3d1478df7&gt;
Analysing &lt;CryptObject &quot;C:\windows\system32\ntdll.dll&quot; content_type=CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED(0xaL)&gt;
File has 1 signer(s):
Signer 0:
* Issuer: bytearray(b&#39;0\x81\x841\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x130\x11\x06\x03U\x04\x08\x13\nWashington1\x100\x0e\x06\x03U\x04\x07\x13\x07Redmond1\x1e0\x1c\x06\x03U\x04\n\x13\x15Microsoft Corporation1.0,\x06\x03U\x04\x03\x13%Microsoft Windows Production PCA 2011&#39;)
* HashAlgorithme: 2.16.840.1.101.3.4.2.1
* Certificate: &lt;Certificate &quot;Microsoft Windows&quot; serial=&quot;33 00 00 01 73 30 31 07 26 65 b8 b9 b3 00 00 00 00 01 73&quot;&gt;
File embdeds 2 certificate(s):
* 0) &lt;Certificate &quot;Microsoft Windows&quot; serial=&quot;33 00 00 01 73 30 31 07 26 65 b8 b9 b3 00 00 00 00 01 73&quot;&gt;
* 1) &lt;Certificate &quot;Microsoft Windows Production PCA 2011&quot; serial=&quot;61 07 76 56 00 00 00 00 00 08&quot;&gt;
</pre></div>
</div>
</div>
</div>
<div class="section" id="windows-alpc">
<h2>17.11. <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="Permalink to this headline"></a></h2>
<div class="section" id="simple-alpc-communication">
<span id="sample-alpc"></span><h3>17.11.1. simple alpc communication<a class="headerlink" href="#simple-alpc-communication" title="Permalink to this headline"></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="k">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="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="s2">&quot;&quot;</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="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="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="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="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="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="mf">0.5</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>
</div>
<div class="section" id="advanced-alpc-communication">
<span id="sample-advanced-alpc"></span><h3>17.11.2. advanced alpc communication<a class="headerlink" href="#advanced-alpc-communication" title="Permalink to this headline"></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="k">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="p">))</span>
<span class="n">msg</span><span class="o">.</span><span class="n">data</span> <span class="o">=</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="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="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="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="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="s2">&quot;&quot;</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="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="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="s2">&quot;&quot;</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="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="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="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="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="s2">&quot;&quot;</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="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="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="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>
</div>
</div>
<div class="section" id="windows-rpc">
<h2>17.12. <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="Permalink to this headline"></a></h2>
<div class="section" id="manual-uac">
<span id="sample-rpc-uac"></span><h3>17.12.1. Manual UAC<a class="headerlink" href="#manual-uac" title="Permalink to this headline"></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="k">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="o">+</span> <span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</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="o">+</span> <span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</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;</span><span class="se">\x00</span><span class="s2">&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</span><span class="se">\x00</span><span class="s2">&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>
</div>
<div class="section" id="manual-lsarenumerateprivileges">
<span id="sample-rpc-lsass"></span><h3>17.12.2. Manual <code class="docutils literal notranslate"><span class="pre">LsarEnumeratePrivileges</span></code><a class="headerlink" href="#manual-lsarenumerateprivileges" title="Permalink to this headline"></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="k">import</span> <span class="n">ndr</span>
<span class="c1"># Ndr stuff</span>
<span class="k">class</span> <span class="nc">NdrContext</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="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="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 if 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 if 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 if the subtype as we will pass None</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="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">NdrContext</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">NdrContext</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">## 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="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="n">priv</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>
</div>
</div>
<div class="section" id="windows-pipe">
<span id="sample-pipe"></span><h2>17.13. <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="Permalink to this headline"></a></h2>
<div class="section" id="communication-with-an-injected-process">
<h3>17.13.1. Communication with an injected process<a class="headerlink" href="#communication-with-an-injected-process" title="Permalink to this headline"></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="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">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>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h3><a href="index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">17. Samples of code</a><ul>
<li><a class="reference internal" href="#processes">17.1. Processes</a><ul>
<li><a class="reference internal" href="#windows-current-process">17.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">17.1.2. Remote process : <code class="docutils literal notranslate"><span class="pre">WinProcess</span></code></a></li>
<li><a class="reference internal" href="#peb-exploration">17.1.3. <code class="docutils literal notranslate"><span class="pre">PEB</span></code> exploration</a></li>
<li><a class="reference internal" href="#apisetmap">17.1.4. ApiSetMap</a></li>
<li><a class="reference internal" href="#iat-hooking">17.1.5. IAT hooking</a></li>
</ul>
</li>
<li><a class="reference internal" href="#windows-system">17.2. <code class="docutils literal notranslate"><span class="pre">windows.system</span></code></a></li>
<li><a class="reference internal" href="#network-socket-exploration">17.3. <code class="docutils literal notranslate"><span class="pre">Network</span></code> - socket exploration</a></li>
<li><a class="reference internal" href="#registry">17.4. <code class="docutils literal notranslate"><span class="pre">Registry</span></code></a></li>
<li><a class="reference internal" href="#windows-wintrust">17.5. <code class="docutils literal notranslate"><span class="pre">windows.wintrust</span></code></a></li>
<li><a class="reference internal" href="#vectoredexception">17.6. <code class="docutils literal notranslate"><span class="pre">VectoredException()</span></code></a><ul>
<li><a class="reference internal" href="#in-local-process">17.6.1. In local process</a></li>
<li><a class="reference internal" href="#in-remote-process">17.6.2. In remote process</a></li>
</ul>
</li>
<li><a class="reference internal" href="#debugging">17.7. Debugging</a><ul>
<li><a class="reference internal" href="#debugger">17.7.1. <code class="docutils literal notranslate"><span class="pre">Debugger</span></code></a><ul>
<li><a class="reference internal" href="#single-stepping">17.7.1.1. Single stepping</a></li>
<li><a class="reference internal" href="#windows-debug-functionbp">17.7.1.2. <code class="docutils literal notranslate"><span class="pre">windows.debug.FunctionBP</span></code></a></li>
<li><a class="reference internal" href="#debugger-attach">17.7.1.3. <code class="docutils literal notranslate"><span class="pre">Debugger.attach</span></code></a></li>
<li><a class="reference internal" href="#native-code-tester">17.7.1.4. Native code tester</a></li>
</ul>
</li>
<li><a class="reference internal" href="#localdebugger">17.7.2. <code class="docutils literal notranslate"><span class="pre">LocalDebugger</span></code></a><ul>
<li><a class="reference internal" href="#in-current-process">17.7.2.1. In current process</a></li>
<li><a class="reference internal" href="#id1">17.7.2.2. In remote process</a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#wmi-requests">17.8. WMI requests</a></li>
<li><a class="reference internal" href="#using-com-inetfwpolicy2">17.9. using COM: <code class="docutils literal notranslate"><span class="pre">INetFwPolicy2</span></code></a></li>
<li><a class="reference internal" href="#windows-crypto">17.10. <code class="docutils literal notranslate"><span class="pre">windows.crypto</span></code></a><ul>
<li><a class="reference internal" href="#encryption-demo">17.10.1. Encryption demo</a></li>
<li><a class="reference internal" href="#certificate-demo">17.10.2. Certificate demo</a></li>
</ul>
</li>
<li><a class="reference internal" href="#windows-alpc">17.11. <code class="docutils literal notranslate"><span class="pre">windows.alpc</span></code></a><ul>
<li><a class="reference internal" href="#simple-alpc-communication">17.11.1. simple alpc communication</a></li>
<li><a class="reference internal" href="#advanced-alpc-communication">17.11.2. advanced alpc communication</a></li>
</ul>
</li>
<li><a class="reference internal" href="#windows-rpc">17.12. <code class="docutils literal notranslate"><span class="pre">windows.rpc</span></code></a><ul>
<li><a class="reference internal" href="#manual-uac">17.12.1. Manual UAC</a></li>
<li><a class="reference internal" href="#manual-lsarenumerateprivileges">17.12.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">17.13. <code class="docutils literal notranslate"><span class="pre">windows.pipe</span></code></a><ul>
<li><a class="reference internal" href="#communication-with-an-injected-process">17.13.1. Communication with an injected process</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>Previous topic</h4>
<p class="topless"><a href="internals.html"
title="previous chapter">16. Internals</a></p>
<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>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</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="internals.html" title="16. Internals"
>previous</a> |</li>
<li class="nav-item nav-item-0"><a href="index.html">PythonForWindows 0.3 documentation</a> &#187;</li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2015, Clement Rouault.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.7.1.
</div>
</body>
</html>