mirror of
https://github.com/hakril/PythonForWindows
synced 2026-06-08 14:31:45 +00:00
446 lines
69 KiB
HTML
446 lines
69 KiB
HTML
<!DOCTYPE html>
|
|
|
|
<html lang="en" data-content_root="../../">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>windows.syswow64 — PythonForWindows 1.0.3 documentation</title>
|
|
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=fa44fd50" />
|
|
<link rel="stylesheet" type="text/css" href="../../_static/classic.css?v=def86cc0" />
|
|
<link rel="stylesheet" type="text/css" href="../../_static/css/mbasic.css?v=957880af" />
|
|
|
|
<script src="../../_static/documentation_options.js?v=baaebd52"></script>
|
|
<script src="../../_static/doctools.js?v=9a2dae69"></script>
|
|
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
|
|
|
|
<link rel="index" title="Index" href="../../genindex.html" />
|
|
<link rel="search" title="Search" href="../../search.html" />
|
|
</head><body>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../genindex.html" title="General Index"
|
|
accesskey="I">index</a></li>
|
|
<li class="right" >
|
|
<a href="../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../index.html">PythonForWindows 1.0.3 documentation</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">windows.syswow64</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="document">
|
|
<div class="documentwrapper">
|
|
<div class="bodywrapper">
|
|
<div class="body" role="main">
|
|
|
|
<h1>Source code for windows.syswow64</h1><div class="highlight"><pre>
|
|
<span></span><span class="kn">import</span> <span class="nn">struct</span>
|
|
<span class="kn">import</span> <span class="nn">ctypes</span>
|
|
<span class="kn">from</span> <span class="nn">ctypes</span> <span class="kn">import</span> <span class="n">byref</span>
|
|
<span class="kn">import</span> <span class="nn">codecs</span>
|
|
<span class="kn">import</span> <span class="nn">functools</span>
|
|
<span class="kn">import</span> <span class="nn">threading</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="kn">from</span> <span class="nn">.generated_def.winstructs</span> <span class="kn">import</span> <span class="o">*</span>
|
|
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">process</span>
|
|
<span class="kn">from</span> <span class="nn">windows</span> <span class="kn">import</span> <span class="n">winproxy</span>
|
|
<span class="kn">from</span> <span class="nn">.winproxy</span> <span class="kn">import</span> <span class="n">NeededParameter</span>
|
|
<span class="kn">from</span> <span class="nn">.pycompat</span> <span class="kn">import</span> <span class="n">int_types</span>
|
|
|
|
<span class="c1"># Special code for syswow64 process</span>
|
|
<span class="n">CS_32bits</span> <span class="o">=</span> <span class="mh">0x23</span>
|
|
<span class="n">CS_64bits</span> <span class="o">=</span> <span class="mh">0x33</span>
|
|
|
|
<span class="c1"># Allow to keep per-thread state of asm stub</span>
|
|
<span class="k">class</span> <span class="nc">ThreadState</span><span class="p">(</span><span class="n">threading</span><span class="o">.</span><span class="n">local</span><span class="p">):</span>
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># Called once per thread</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">allocator</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">native_function</span><span class="o">.</span><span class="n">CustomAllocator</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">raw_call_per_function</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">current_original_args</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="n">thread_state</span> <span class="o">=</span> <span class="n">ThreadState</span><span class="p">()</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">generate_64bits_execution_stub_from_syswow</span><span class="p">(</span><span class="n">x64shellcode</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""shellcode must NOT end by a ret"""</span>
|
|
<span class="n">current_process</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">current_process</span><span class="o">.</span><span class="n">is_wow_64</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Calling generate_64bits_execution_stub_from_syswow from non-syswow process"</span><span class="p">)</span>
|
|
|
|
<span class="n">transition64</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">transition64</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Call</span><span class="p">(</span><span class="s2">":TOEXEC"</span><span class="p">)</span>
|
|
<span class="n">transition64</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">"RDX"</span><span class="p">,</span> <span class="s2">"RAX"</span><span class="p">)</span>
|
|
<span class="n">transition64</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Shr</span><span class="p">(</span><span class="s2">"RDX"</span><span class="p">,</span> <span class="mi">32</span><span class="p">)</span>
|
|
<span class="n">transition64</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Retf32</span><span class="p">()</span> <span class="c1"># 32 bits return addr</span>
|
|
<span class="n">transition64</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Label</span><span class="p">(</span><span class="s2">":TOEXEC"</span><span class="p">)</span>
|
|
<span class="n">x64shellcodeaddr</span> <span class="o">=</span> <span class="n">thread_state</span><span class="o">.</span><span class="n">allocator</span><span class="o">.</span><span class="n">write_code</span><span class="p">(</span><span class="n">transition64</span><span class="o">.</span><span class="n">get_code</span><span class="p">()</span> <span class="o">+</span> <span class="n">x64shellcode</span><span class="p">)</span>
|
|
|
|
<span class="n">transition</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">transition</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Call</span><span class="p">(</span><span class="n">CS_64bits</span><span class="p">,</span> <span class="n">x64shellcodeaddr</span><span class="p">)</span>
|
|
<span class="c1"># Reset the SS segment selector.</span>
|
|
<span class="c1"># We need to do that due to a bug in AMD CPUs with RETF & SS</span>
|
|
<span class="c1"># https://github.com/hakril/PythonForWindows/issues/10</span>
|
|
<span class="c1"># http://blog.rewolf.pl/blog/?p=1484</span>
|
|
<span class="n">transition</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">"ECX"</span><span class="p">,</span> <span class="s2">"SS"</span><span class="p">)</span>
|
|
<span class="n">transition</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">"SS"</span><span class="p">,</span> <span class="s2">"ECX"</span><span class="p">)</span>
|
|
<span class="n">transition</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">stubaddr</span> <span class="o">=</span> <span class="n">thread_state</span><span class="o">.</span><span class="n">allocator</span><span class="o">.</span><span class="n">write_code</span><span class="p">(</span><span class="n">transition</span><span class="o">.</span><span class="n">get_code</span><span class="p">())</span>
|
|
<span class="n">exec_stub</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">CFUNCTYPE</span><span class="p">(</span><span class="n">ULONG64</span><span class="p">)(</span><span class="n">stubaddr</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">exec_stub</span>
|
|
|
|
<div class="viewcode-block" id="execute_64bits_code_from_syswow">
|
|
<a class="viewcode-back" href="../../internals.html#windows.syswow64.execute_64bits_code_from_syswow">[docs]</a>
|
|
<span class="k">def</span> <span class="nf">execute_64bits_code_from_syswow</span><span class="p">(</span><span class="n">x64shellcode</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">generate_64bits_execution_stub_from_syswow</span><span class="p">(</span><span class="n">x64shellcode</span><span class="p">)()</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="generate_syswow64_call">
|
|
<a class="viewcode-back" href="../../internals.html#windows.syswow64.generate_syswow64_call">[docs]</a>
|
|
<span class="k">def</span> <span class="nf">generate_syswow64_call</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">errcheck</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="n">nb_args</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">prototype</span><span class="o">.</span><span class="n">_argtypes_</span><span class="p">)</span>
|
|
<span class="n">target_addr</span> <span class="o">=</span> <span class="n">get_syswow_ntdll_exports</span><span class="p">()[</span><span class="n">target</span><span class="o">.</span><span class="vm">__name__</span><span class="p">]</span>
|
|
<span class="n">argument_buffer_len</span> <span class="o">=</span> <span class="p">(</span><span class="n">nb_args</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span>
|
|
<span class="n">argument_buffer</span> <span class="o">=</span> <span class="n">thread_state</span><span class="o">.</span><span class="n">allocator</span><span class="o">.</span><span class="n">reserve_size</span><span class="p">(</span><span class="n">argument_buffer_len</span><span class="p">)</span>
|
|
<span class="n">alignement_information</span> <span class="o">=</span> <span class="n">thread_state</span><span class="o">.</span><span class="n">allocator</span><span class="o">.</span><span class="n">reserve_size</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
|
|
|
|
<span class="n">nb_args_on_stack</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">nb_args</span> <span class="o">-</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
|
|
|
<span class="n">code_64b</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="c1"># Save registers</span>
|
|
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'RBX'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'RCX'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'RDX'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'RSI'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'RDI'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'R8'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'R9'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'R10'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'R11'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'R12'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'R13'</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Alignment stuff :)</span>
|
|
<span class="n">code_64b</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">'RCX'</span><span class="p">,</span> <span class="s1">'RSP'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">And</span><span class="p">(</span><span class="s1">'RCX'</span><span class="p">,</span> <span class="mh">0x0f</span><span class="p">)</span>
|
|
<span class="n">code_64b</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">deref</span><span class="p">(</span><span class="n">alignement_information</span><span class="p">),</span> <span class="s1">'RCX'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Sub</span><span class="p">(</span><span class="s1">'RSP'</span><span class="p">,</span> <span class="s1">'RCX'</span><span class="p">)</span>
|
|
<span class="c1"># retrieve argument from the argument buffer</span>
|
|
<span class="k">if</span> <span class="n">nb_args</span> <span class="o">>=</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">code_64b</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">'RCX'</span><span class="p">,</span> <span class="n">x64</span><span class="o">.</span><span class="n">create_displacement</span><span class="p">(</span><span class="n">disp</span><span class="o">=</span><span class="n">argument_buffer</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="n">nb_args</span> <span class="o">>=</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="n">code_64b</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">'RDX'</span><span class="p">,</span> <span class="n">x64</span><span class="o">.</span><span class="n">create_displacement</span><span class="p">(</span><span class="n">disp</span><span class="o">=</span><span class="n">argument_buffer</span> <span class="o">+</span> <span class="p">(</span><span class="mi">8</span> <span class="o">*</span> <span class="mi">1</span><span class="p">)))</span>
|
|
<span class="k">if</span> <span class="n">nb_args</span> <span class="o">>=</span> <span class="mi">3</span><span class="p">:</span>
|
|
<span class="n">code_64b</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">'R8'</span><span class="p">,</span> <span class="n">x64</span><span class="o">.</span><span class="n">create_displacement</span><span class="p">(</span><span class="n">disp</span><span class="o">=</span><span class="n">argument_buffer</span> <span class="o">+</span> <span class="p">(</span><span class="mi">8</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)))</span>
|
|
<span class="k">if</span> <span class="n">nb_args</span> <span class="o">>=</span> <span class="mi">4</span><span class="p">:</span>
|
|
<span class="n">code_64b</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">'R9'</span><span class="p">,</span> <span class="n">x64</span><span class="o">.</span><span class="n">create_displacement</span><span class="p">(</span><span class="n">disp</span><span class="o">=</span><span class="n">argument_buffer</span> <span class="o">+</span> <span class="p">(</span><span class="mi">8</span> <span class="o">*</span> <span class="mi">3</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="n">nb_args_on_stack</span><span class="p">):</span>
|
|
<span class="n">code_64b</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">'RAX'</span><span class="p">,</span> <span class="n">x64</span><span class="o">.</span><span class="n">create_displacement</span><span class="p">(</span><span class="n">disp</span><span class="o">=</span><span class="n">argument_buffer</span> <span class="o">+</span> <span class="mi">8</span> <span class="o">*</span> <span class="p">(</span><span class="n">nb_args</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">i</span><span class="p">)))</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'RAX'</span><span class="p">)</span>
|
|
<span class="c1"># reserve space for register (calling convention)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'R9'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'R8'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'RDX'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Push</span><span class="p">(</span><span class="s1">'RCX'</span><span class="p">)</span>
|
|
<span class="c1"># Call</span>
|
|
<span class="n">code_64b</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">'R13'</span><span class="p">,</span> <span class="n">target_addr</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Call</span><span class="p">(</span><span class="s1">'R13'</span><span class="p">)</span>
|
|
<span class="c1"># Realign stack :)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="s1">'RSP'</span><span class="p">,</span> <span class="n">x64</span><span class="o">.</span><span class="n">deref</span><span class="p">(</span><span class="n">alignement_information</span><span class="p">))</span>
|
|
<span class="c1"># Clean stack</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="s1">'RSP'</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span> <span class="o">+</span> <span class="n">nb_args_on_stack</span><span class="p">)</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Pop</span><span class="p">(</span><span class="s1">'R13'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Pop</span><span class="p">(</span><span class="s1">'R12'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Pop</span><span class="p">(</span><span class="s1">'R11'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Pop</span><span class="p">(</span><span class="s1">'R10'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Pop</span><span class="p">(</span><span class="s1">'R9'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Pop</span><span class="p">(</span><span class="s1">'R8'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Pop</span><span class="p">(</span><span class="s1">'RDI'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Pop</span><span class="p">(</span><span class="s1">'RSI'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Pop</span><span class="p">(</span><span class="s1">'RDX'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Pop</span><span class="p">(</span><span class="s1">'RCX'</span><span class="p">)</span>
|
|
<span class="n">code_64b</span> <span class="o">+=</span> <span class="n">x64</span><span class="o">.</span><span class="n">Pop</span><span class="p">(</span><span class="s1">'RBX'</span><span class="p">)</span>
|
|
<span class="n">code_64b</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="k">return</span> <span class="n">try_generate_stub_target</span><span class="p">(</span><span class="n">code_64b</span><span class="o">.</span><span class="n">get_code</span><span class="p">(),</span> <span class="n">argument_buffer</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">errcheck</span><span class="o">=</span><span class="n">errcheck</span><span class="p">)</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="try_generate_stub_target">
|
|
<a class="viewcode-back" href="../../internals.html#windows.syswow64.try_generate_stub_target">[docs]</a>
|
|
<span class="k">def</span> <span class="nf">try_generate_stub_target</span><span class="p">(</span><span class="n">shellcode</span><span class="p">,</span> <span class="n">argument_buffer</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">errcheck</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">is_wow_64</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Calling execute_64bits_code_from_syswow from non-syswow process"</span><span class="p">)</span>
|
|
<span class="n">native_caller</span> <span class="o">=</span> <span class="n">generate_64bits_execution_stub_from_syswow</span><span class="p">(</span><span class="n">shellcode</span><span class="p">)</span>
|
|
<span class="n">native_caller</span><span class="o">.</span><span class="n">errcheck</span> <span class="o">=</span> <span class="n">errcheck</span> <span class="k">if</span> <span class="n">errcheck</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">target</span><span class="o">.</span><span class="n">errcheck</span>
|
|
<span class="c1"># Generate the wrapper function that fill the argument_buffer</span>
|
|
<span class="n">expected_arguments_number</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">prototype</span><span class="o">.</span><span class="n">_argtypes_</span><span class="p">)</span>
|
|
<span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">!=</span> <span class="n">expected_arguments_number</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"</span><span class="si">{0}</span><span class="s2"> syswow accept </span><span class="si">{1}</span><span class="s2"> args (</span><span class="si">{2}</span><span class="s2"> given)"</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="vm">__name__</span><span class="p">,</span> <span class="n">expected_arguments_number</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)))</span>
|
|
<span class="c1"># Transform args (ctypes byref possibly) to int</span>
|
|
<span class="n">writable_args</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">int_types</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">value</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">value</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="k">except</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">ArgumentError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">ArgumentError</span><span class="p">(</span><span class="s2">"Argument </span><span class="si">{0}</span><span class="s2">: wrong type <</span><span class="si">{1}</span><span class="s2">>"</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">type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">))</span>
|
|
<span class="n">writable_args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
<span class="c1"># Build buffer</span>
|
|
<span class="n">buffer</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">"<"</span> <span class="o">+</span> <span class="s2">"Q"</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">writable_args</span><span class="p">),</span> <span class="o">*</span><span class="n">writable_args</span><span class="p">)</span>
|
|
<span class="n">ctypes</span><span class="o">.</span><span class="n">memmove</span><span class="p">(</span><span class="n">argument_buffer</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">buffer</span><span class="p">))</span>
|
|
<span class="c1"># Copy origincal args in function, for errcheck if needed</span>
|
|
<span class="n">thread_state</span><span class="o">.</span><span class="n">current_original_args</span> <span class="o">=</span> <span class="n">args</span>
|
|
|
|
<span class="k">return</span> <span class="n">native_caller</span><span class="p">()</span>
|
|
<span class="n">wrapper</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{0}</span><span class="s2"><syswow64>"</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="vm">__name__</span><span class="p">,)</span>
|
|
<span class="n">wrapper</span><span class="o">.</span><span class="vm">__doc__</span> <span class="o">=</span> <span class="s2">"This is a wrapper to </span><span class="si">{0}</span><span class="s2"> in 64b mode, it accept <</span><span class="si">{1}</span><span class="s2">> args"</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="vm">__name__</span><span class="p">,</span> <span class="n">expected_arguments_number</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">wrapper</span></div>
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">get_current_process_syswow_peb_addr</span><span class="p">():</span>
|
|
<span class="n">get_peb_64_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="s2">"mov rax, gs:[0x60]; ret"</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">execute_64bits_code_from_syswow</span><span class="p">(</span><span class="n">get_peb_64_code</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">get_current_process_syswow_peb</span><span class="p">():</span>
|
|
<span class="n">current_process</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span>
|
|
<span class="n">peb_addr</span> <span class="o">=</span> <span class="n">get_current_process_syswow_peb_addr</span><span class="p">()</span>
|
|
<span class="k">return</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">RemotePEB64</span><span class="p">(</span><span class="n">peb_addr</span><span class="p">,</span> <span class="n">CurrentProcessReadSyswow</span><span class="p">())</span>
|
|
|
|
<span class="k">class</span> <span class="nc">CurrentProcessReadSyswow</span><span class="p">(</span><span class="n">process</span><span class="o">.</span><span class="n">Process</span><span class="p">):</span>
|
|
<span class="n">bitness</span> <span class="o">=</span> <span class="mi">64</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_get_handle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="c1"># GetCurrentProcess() is not accepted for NtWow64ReadVirtualMemory64 :(</span>
|
|
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">OpenProcess</span><span class="p">(</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="k">def</span> <span class="nf">read_memory</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">size</span><span class="p">):</span>
|
|
<span class="n">buffer_addr</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">create_string_buffer</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtWow64ReadVirtualMemory64</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">buffer_addr</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">buffer_addr</span><span class="p">[:]</span>
|
|
|
|
<span class="k">class</span> <span class="nc">ReadSyswow64Process</span><span class="p">(</span><span class="n">process</span><span class="o">.</span><span class="n">Process</span><span class="p">):</span>
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="n">target</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_bitness</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">bitness</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_get_handle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">handle</span>
|
|
|
|
<span class="k">def</span> <span class="nf">read_memory</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">size</span><span class="p">):</span>
|
|
<span class="n">buffer_addr</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">create_string_buffer</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtWow64ReadVirtualMemory64</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">buffer_addr</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">buffer_addr</span><span class="p">[:]</span>
|
|
|
|
<span class="c1">#read_string = process.Process.read_string</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">get_syswow_ntdll_exports</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="n">get_syswow_ntdll_exports</span><span class="o">.</span><span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">get_syswow_ntdll_exports</span><span class="o">.</span><span class="n">value</span>
|
|
<span class="n">peb64</span> <span class="o">=</span> <span class="n">get_current_process_syswow_peb</span><span class="p">()</span>
|
|
<span class="n">ntdll64</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">peb64</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="s2">"ntdll.dll"</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">ntdll64</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Could not find ntdll.dll in syswow peb"</span><span class="p">)</span>
|
|
<span class="n">ntdll64</span> <span class="o">=</span> <span class="n">ntdll64</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">exports</span> <span class="o">=</span> <span class="n">ntdll64</span><span class="o">.</span><span class="n">pe</span><span class="o">.</span><span class="n">exports</span>
|
|
<span class="n">get_syswow_ntdll_exports</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">exports</span>
|
|
<span class="k">return</span> <span class="n">exports</span>
|
|
<span class="n">get_syswow_ntdll_exports</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
|
|
<div class="viewcode-block" id="Syswow64ApiProxy">
|
|
<a class="viewcode-back" href="../../internals.html#windows.syswow64.Syswow64ApiProxy">[docs]</a>
|
|
<span class="k">class</span> <span class="nc">Syswow64ApiProxy</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Create a python wrapper around a function"""</span>
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">winproxy_function</span><span class="p">,</span> <span class="n">errcheck</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">winproxy_function</span> <span class="o">=</span> <span class="n">winproxy_function</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">errcheck</span> <span class="o">=</span> <span class="n">errcheck</span>
|
|
<span class="k">if</span> <span class="n">winproxy_function</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">params_name</span> <span class="o">=</span> <span class="p">[</span><span class="n">param</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">winproxy_function</span><span class="o">.</span><span class="n">params</span><span class="p">]</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">python_proxy</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">is_implemented</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">winproxy_function</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
|
|
<span class="k">def</span> <span class="nf">force_resolution</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">winproxy_function</span> <span class="ow">in</span> <span class="n">thread_state</span><span class="o">.</span><span class="n">raw_call_per_function</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">stub</span> <span class="o">=</span> <span class="n">generate_syswow64_call</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">winproxy_function</span><span class="p">,</span> <span class="n">errcheck</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">errcheck</span><span class="p">)</span>
|
|
<span class="n">thread_state</span><span class="o">.</span><span class="n">raw_call_per_function</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">winproxy_function</span><span class="p">]</span> <span class="o">=</span> <span class="n">stub</span>
|
|
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">ExportNotFound</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">winproxy_function</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="s2">"SysWow[ntdll64]"</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">perform_call</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">params_name</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR:"</span><span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Expected params: </span><span class="si">{0}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">params_name</span><span class="p">))</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Just Got params: </span><span class="si">{0}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">args</span><span class="p">))</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"I do not have all parameters: how is that possible ?"</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">param_name</span><span class="p">,</span> <span class="n">param_value</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">params_name</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">param_value</span> <span class="ow">is</span> <span class="n">NeededParameter</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"</span><span class="si">{0}</span><span class="s2">: Missing Mandatory parameter <</span><span class="si">{1}</span><span class="s2">>"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">winproxy_function</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">param_name</span><span class="p">))</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">winproxy_function</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">thread_state</span><span class="o">.</span><span class="n">raw_call_per_function</span><span class="p">:</span>
|
|
<span class="n">force_resolution</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="n">thread_state</span><span class="o">.</span><span class="n">raw_call_per_function</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">winproxy_function</span><span class="p">](</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
|
|
|
|
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="n">python_proxy</span><span class="p">,</span> <span class="s2">"ctypes_function"</span><span class="p">,</span> <span class="n">perform_call</span><span class="p">)</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="n">python_proxy</span><span class="p">,</span> <span class="s2">"force_resolution"</span><span class="p">,</span> <span class="n">force_resolution</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">python_proxy</span></div>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">ntquerysysteminformation_syswow64_error_check</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="n">thread_state</span><span class="o">.</span><span class="n">current_original_args</span>
|
|
<span class="k">if</span> <span class="n">result</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">args</span>
|
|
<span class="c1"># Ignore STATUS_INFO_LENGTH_MISMATCH if SystemInformation is None</span>
|
|
<span class="k">if</span> <span class="n">result</span> <span class="o">==</span> <span class="n">STATUS_INFO_LENGTH_MISMATCH</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
|
|
<span class="k">return</span> <span class="n">args</span>
|
|
<span class="k">raise</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">WinproxyError</span><span class="p">(</span><span class="s2">"NtQuerySystemInformation failed with NTStatus </span><span class="si">{0}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">result</span><span class="p">)))</span>
|
|
|
|
<span class="nd">@Syswow64ApiProxy</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtQuerySystemInformation</span><span class="p">,</span> <span class="n">errcheck</span><span class="o">=</span><span class="n">ntquerysysteminformation_syswow64_error_check</span><span class="p">)</span>
|
|
<span class="c1"># @Syswow64ApiProxy(winproxy.NtQuerySystemInformation)</span>
|
|
<span class="k">def</span> <span class="nf">NtQuerySystemInformation_32_to_64</span><span class="p">(</span><span class="n">SystemInformationClass</span><span class="p">,</span> <span class="n">SystemInformation</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">SystemInformationLength</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">ReturnLength</span><span class="o">=</span><span class="n">NeededParameter</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">SystemInformation</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">SystemInformationLength</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">SystemInformationLength</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">SystemInformation</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">SystemInformation</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">SystemInformation</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">return</span> <span class="n">NtQuerySystemInformation_32_to_64</span><span class="o">.</span><span class="n">ctypes_function</span><span class="p">(</span><span class="n">SystemInformationClass</span><span class="p">,</span> <span class="n">SystemInformation</span><span class="p">,</span> <span class="n">SystemInformationLength</span><span class="p">,</span> <span class="n">ReturnLength</span><span class="p">)</span>
|
|
|
|
|
|
<div class="viewcode-block" id="NtCreateThreadEx_32_to_64">
|
|
<a class="viewcode-back" href="../../internals.html#windows.syswow64.NtCreateThreadEx_32_to_64">[docs]</a>
|
|
<span class="nd">@Syswow64ApiProxy</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtCreateThreadEx</span><span class="p">)</span>
|
|
<span class="k">def</span> <span class="nf">NtCreateThreadEx_32_to_64</span><span class="p">(</span><span class="n">ThreadHandle</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">DesiredAccess</span><span class="o">=</span><span class="mh">0x1fffff</span><span class="p">,</span> <span class="n">ObjectAttributes</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">ProcessHandle</span><span class="o">=</span><span class="n">NeededParameter</span><span class="p">,</span> <span class="n">lpStartAddress</span><span class="o">=</span><span class="n">NeededParameter</span><span class="p">,</span> <span class="n">lpParameter</span><span class="o">=</span><span class="n">NeededParameter</span><span class="p">,</span> <span class="n">CreateSuspended</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">dwStackSize</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">Unknown1</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">Unknown2</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">Unknown3</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">ThreadHandle</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">ThreadHandle</span> <span class="o">=</span> <span class="n">byref</span><span class="p">(</span><span class="n">HANDLE</span><span class="p">())</span>
|
|
<span class="k">return</span> <span class="n">NtCreateThreadEx_32_to_64</span><span class="o">.</span><span class="n">ctypes_function</span><span class="p">(</span><span class="n">ThreadHandle</span><span class="p">,</span> <span class="n">DesiredAccess</span><span class="p">,</span> <span class="n">ObjectAttributes</span><span class="p">,</span> <span class="n">ProcessHandle</span><span class="p">,</span> <span class="n">lpStartAddress</span><span class="p">,</span> <span class="n">lpParameter</span><span class="p">,</span> <span class="n">CreateSuspended</span><span class="p">,</span> <span class="n">dwStackSize</span><span class="p">,</span> <span class="n">Unknown1</span><span class="p">,</span> <span class="n">Unknown2</span><span class="p">,</span> <span class="n">Unknown3</span><span class="p">)</span></div>
|
|
|
|
|
|
|
|
<span class="n">ProcessBasicInformation</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<div class="viewcode-block" id="NtQueryInformationProcess_32_to_64">
|
|
<a class="viewcode-back" href="../../internals.html#windows.syswow64.NtQueryInformationProcess_32_to_64">[docs]</a>
|
|
<span class="nd">@Syswow64ApiProxy</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryInformationProcess</span><span class="p">)</span>
|
|
<span class="k">def</span> <span class="nf">NtQueryInformationProcess_32_to_64</span><span class="p">(</span><span class="n">ProcessHandle</span><span class="p">,</span> <span class="n">ProcessInformationClass</span><span class="o">=</span><span class="n">ProcessBasicInformation</span><span class="p">,</span> <span class="n">ProcessInformation</span><span class="o">=</span><span class="n">NeededParameter</span><span class="p">,</span> <span class="n">ProcessInformationLength</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">ReturnLength</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">ProcessInformation</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">ProcessInformationLength</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">ProcessInformationLength</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">ProcessInformation</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">ProcessInformation</span><span class="p">)</span> <span class="o">==</span> <span class="n">PROCESS_BASIC_INFORMATION</span><span class="p">:</span>
|
|
<span class="n">ProcessInformation</span> <span class="o">=</span> <span class="n">byref</span><span class="p">(</span><span class="n">ProcessInformation</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">ReturnLength</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">ReturnLength</span> <span class="o">=</span> <span class="n">byref</span><span class="p">(</span><span class="n">ULONG</span><span class="p">())</span>
|
|
<span class="k">return</span> <span class="n">NtQueryInformationProcess_32_to_64</span><span class="o">.</span><span class="n">ctypes_function</span><span class="p">(</span><span class="n">ProcessHandle</span><span class="p">,</span> <span class="n">ProcessInformationClass</span><span class="p">,</span> <span class="n">ProcessInformation</span><span class="p">,</span> <span class="n">ProcessInformationLength</span><span class="p">,</span> <span class="n">ReturnLength</span><span class="p">)</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="NtQueryInformationThread_32_to_64">
|
|
<a class="viewcode-back" href="../../internals.html#windows.syswow64.NtQueryInformationThread_32_to_64">[docs]</a>
|
|
<span class="nd">@Syswow64ApiProxy</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryInformationThread</span><span class="p">)</span>
|
|
<span class="k">def</span> <span class="nf">NtQueryInformationThread_32_to_64</span><span class="p">(</span><span class="n">ThreadHandle</span><span class="p">,</span> <span class="n">ThreadInformationClass</span><span class="p">,</span> <span class="n">ThreadInformation</span><span class="p">,</span> <span class="n">ThreadInformationLength</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">ReturnLength</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">ReturnLength</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">ReturnLength</span> <span class="o">=</span> <span class="n">byref</span><span class="p">(</span><span class="n">ULONG</span><span class="p">())</span>
|
|
<span class="k">if</span> <span class="n">ThreadInformation</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">ThreadInformationLength</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">ThreadInformationLength</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">ThreadInformation</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">NtQueryInformationThread_32_to_64</span><span class="o">.</span><span class="n">ctypes_function</span><span class="p">(</span><span class="n">ThreadHandle</span><span class="p">,</span> <span class="n">ThreadInformationClass</span><span class="p">,</span> <span class="n">ThreadInformation</span><span class="p">,</span> <span class="n">ThreadInformationLength</span><span class="p">,</span> <span class="n">ReturnLength</span><span class="p">)</span></div>
|
|
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="NtQueryVirtualMemory_32_to_64">
|
|
<a class="viewcode-back" href="../../internals.html#windows.syswow64.NtQueryVirtualMemory_32_to_64">[docs]</a>
|
|
<span class="nd">@Syswow64ApiProxy</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryVirtualMemory</span><span class="p">)</span>
|
|
<span class="k">def</span> <span class="nf">NtQueryVirtualMemory_32_to_64</span><span class="p">(</span><span class="n">ProcessHandle</span><span class="p">,</span> <span class="n">BaseAddress</span><span class="p">,</span> <span class="n">MemoryInformationClass</span><span class="p">,</span> <span class="n">MemoryInformation</span><span class="o">=</span><span class="n">NeededParameter</span><span class="p">,</span> <span class="n">MemoryInformationLength</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">ReturnLength</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">ReturnLength</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">ReturnLength</span> <span class="o">=</span> <span class="n">byref</span><span class="p">(</span><span class="n">ULONG</span><span class="p">())</span>
|
|
<span class="k">if</span> <span class="n">MemoryInformation</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">MemoryInformationLength</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">MemoryInformationLength</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">MemoryInformation</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">MemoryInformation</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">Structure</span><span class="p">):</span>
|
|
<span class="n">MemoryInformation</span> <span class="o">=</span> <span class="n">byref</span><span class="p">(</span><span class="n">MemoryInformation</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">NtQueryVirtualMemory_32_to_64</span><span class="o">.</span><span class="n">ctypes_function</span><span class="p">(</span><span class="n">ProcessHandle</span><span class="p">,</span> <span class="n">BaseAddress</span><span class="p">,</span> <span class="n">MemoryInformationClass</span><span class="p">,</span> <span class="n">MemoryInformation</span><span class="p">,</span> <span class="n">MemoryInformationLength</span><span class="p">,</span> <span class="n">ReturnLength</span><span class="p">)</span></div>
|
|
|
|
|
|
|
|
<span class="nd">@Syswow64ApiProxy</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtProtectVirtualMemory</span><span class="p">)</span>
|
|
<span class="k">def</span> <span class="nf">NtProtectVirtualMemory_32_to_64</span><span class="p">(</span><span class="n">ProcessHandle</span><span class="p">,</span> <span class="n">BaseAddress</span><span class="p">,</span> <span class="n">NumberOfBytesToProtect</span><span class="p">,</span> <span class="n">NewAccessProtection</span><span class="p">,</span> <span class="n">OldAccessProtection</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">OldAccessProtection</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">XOldAccessProtection</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
|
|
<span class="n">OldAccessProtection</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="n">XOldAccessProtection</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">NtProtectVirtualMemory_32_to_64</span><span class="o">.</span><span class="n">ctypes_function</span><span class="p">(</span><span class="n">ProcessHandle</span><span class="p">,</span> <span class="n">BaseAddress</span><span class="p">,</span> <span class="n">NumberOfBytesToProtect</span><span class="p">,</span> <span class="n">NewAccessProtection</span><span class="p">,</span> <span class="n">OldAccessProtection</span><span class="p">)</span>
|
|
|
|
|
|
<div class="viewcode-block" id="NtGetContextThread_32_to_64">
|
|
<a class="viewcode-back" href="../../internals.html#windows.syswow64.NtGetContextThread_32_to_64">[docs]</a>
|
|
<span class="nd">@Syswow64ApiProxy</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtGetContextThread</span><span class="p">)</span>
|
|
<span class="k">def</span> <span class="nf">NtGetContextThread_32_to_64</span><span class="p">(</span><span class="n">hThread</span><span class="p">,</span> <span class="n">lpContext</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">lpContext</span><span class="p">)</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">exception</span><span class="o">.</span><span class="n">ECONTEXT64</span><span class="p">:</span>
|
|
<span class="n">lpContext</span> <span class="o">=</span> <span class="n">byref</span><span class="p">(</span><span class="n">lpContext</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">NtGetContextThread_32_to_64</span><span class="o">.</span><span class="n">ctypes_function</span><span class="p">(</span><span class="n">hThread</span><span class="p">,</span> <span class="n">lpContext</span><span class="p">)</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="LdrLoadDll_32_to_64">
|
|
<a class="viewcode-back" href="../../internals.html#windows.syswow64.LdrLoadDll_32_to_64">[docs]</a>
|
|
<span class="nd">@Syswow64ApiProxy</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">LdrLoadDll</span><span class="p">)</span>
|
|
<span class="k">def</span> <span class="nf">LdrLoadDll_32_to_64</span><span class="p">(</span><span class="n">PathToFile</span><span class="p">,</span> <span class="n">Flags</span><span class="p">,</span> <span class="n">ModuleFileName</span><span class="p">,</span> <span class="n">ModuleHandle</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">LdrLoadDll_32_to_64</span><span class="o">.</span><span class="n">ctypes_function</span><span class="p">(</span><span class="n">PathToFile</span><span class="p">,</span> <span class="n">Flags</span><span class="p">,</span> <span class="n">ModuleFileName</span><span class="p">,</span> <span class="n">ModuleHandle</span><span class="p">)</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="NtSetContextThread_32_to_64">
|
|
<a class="viewcode-back" href="../../internals.html#windows.syswow64.NtSetContextThread_32_to_64">[docs]</a>
|
|
<span class="nd">@Syswow64ApiProxy</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtSetContextThread</span><span class="p">)</span>
|
|
<span class="k">def</span> <span class="nf">NtSetContextThread_32_to_64</span><span class="p">(</span><span class="n">hThread</span><span class="p">,</span> <span class="n">lpContext</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">NtSetContextThread_32_to_64</span><span class="o">.</span><span class="n">ctypes_function</span><span class="p">(</span><span class="n">hThread</span><span class="p">,</span> <span class="n">lpContext</span><span class="p">)</span></div>
|
|
|
|
</pre></div>
|
|
|
|
<div class="clearer"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
<div class="sphinxsidebarwrapper">
|
|
<search id="searchbox" style="display: none" role="search">
|
|
<h3 id="searchlabel">Quick search</h3>
|
|
<div class="searchformwrapper">
|
|
<form class="search" action="../../search.html" method="get">
|
|
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
|
|
<input type="submit" value="Go" />
|
|
</form>
|
|
</div>
|
|
</search>
|
|
<script>document.getElementById('searchbox').style.display = "block"</script>
|
|
</div>
|
|
</div>
|
|
<div class="clearer"></div>
|
|
</div>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../genindex.html" title="General Index"
|
|
>index</a></li>
|
|
<li class="right" >
|
|
<a href="../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../index.html">PythonForWindows 1.0.3 documentation</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">windows.syswow64</a></li>
|
|
</ul>
|
|
</div>
|
|
<div class="footer" role="contentinfo">
|
|
© Copyright 2015-2020, Clement Rouault.
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
|
|
</div>
|
|
</body>
|
|
</html> |