Skip to content

Commit 83f4b0c

Browse files
committed
Fixing some doc / samples
1 parent b88ce36 commit 83f4b0c

33 files changed

Lines changed: 9307 additions & 4414 deletions

TODO

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ TODO:
3434
- winobject\exception.py
3535
- large part could be rewritten with ctypes-generation extended-def
3636

37-
- add wonobject/window.py + wonobject/kernobj.py to System()
37+
- add winobject/window.py + winobject/kernobj.py to System()
3838
- Some test/doc on both
3939

4040

@@ -44,6 +44,12 @@ TODO:
4444
- COM:
4545
- test https://msdn.microsoft.com/en-us/library/vs/alm/hh846255(v=vs.85).aspx
4646

47+
- Hook
48+
- Probleme with enabled hook + gc
49+
- Prevent GC of enabled hook ?
50+
- Raise on deletion of enabled hook ?
51+
- if I implem __del__ -> we have a __del__ cycle -> no gc (gc.garbage instead..)
52+
4753

4854
Documentation
4955
* verif samples

docs/build/html/_modules/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ <h3>Navigation</h3>
3838
<h1>All modules for which code is available</h1>
3939
<ul><li><a href="ctypes.html">ctypes</a></li>
4040
<li><a href="windows/alpc.html">windows.alpc</a></li>
41+
<li><a href="windows/com.html">windows.com</a></li>
4142
<li><a href="windows/crypto/certificate.html">windows.crypto.certificate</a></li>
4243
<li><a href="windows/crypto/cryptmsg.html">windows.crypto.cryptmsg</a></li>
4344
<li><a href="windows/crypto/encrypt_decrypt.html">windows.crypto.encrypt_decrypt</a></li>

docs/build/html/_modules/windows/com.html

Lines changed: 335 additions & 0 deletions
Large diffs are not rendered by default.

docs/build/html/_modules/windows/debug/debugger.html

Lines changed: 25 additions & 2 deletions
Large diffs are not rendered by default.

docs/build/html/_modules/windows/generated_def/winstructs.html

Lines changed: 838 additions & 448 deletions
Large diffs are not rendered by default.

docs/build/html/_modules/windows/hooks.html

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ <h1>Source code for windows.hooks</h1><div class="highlight"><pre>
9090

9191
<div class="viewcode-block" id="IATHook"><a class="viewcode-back" href="../../iat_hook.html#windows.hooks.IATHook">[docs]</a><span class="k">class</span> <span class="nc">IATHook</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
9292
<span class="sd">&quot;&quot;&quot;Look at my hook &lt;3&quot;&quot;&quot;</span>
93-
<span class="n">yolo</span> <span class="o">=</span> <span class="p">[]</span>
93+
<span class="c1"># yolo = []</span>
9494

9595
<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">IAT_entry</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">types</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
9696
<span class="k">if</span> <span class="n">types</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
@@ -101,10 +101,16 @@ <h1>Source code for windows.hooks</h1><div class="highlight"><pre>
101101
<span class="bp">self</span><span class="o">.</span><span class="n">callback_types</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">transform_arguments</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">original_types</span><span class="p">)</span>
102102
<span class="bp">self</span><span class="o">.</span><span class="n">entry</span> <span class="o">=</span> <span class="n">IAT_entry</span>
103103
<span class="bp">self</span><span class="o">.</span><span class="n">callback</span> <span class="o">=</span> <span class="n">callback</span>
104+
<span class="c1">## No more circular ref -&gt; but stub is destroyed -&gt; segv :(</span>
104105
<span class="bp">self</span><span class="o">.</span><span class="n">stub</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">WINFUNCTYPE</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">callback_types</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">hook_callback</span><span class="p">)</span>
105-
<span class="bp">self</span><span class="o">.</span><span class="n">stub_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="bp">self</span><span class="o">.</span><span class="n">stub</span><span class="p">,</span> <span class="n">PVOID</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
106+
<span class="c1"># stub = ctypes.WINFUNCTYPE(*self.callback_types)(self.hook_callback)</span>
107+
<span class="c1"># self.stub_addr = ctypes.cast(stub, PVOID) # Same problem as keep stub... (GC..)</span>
108+
<span class="bp">self</span><span class="o">.</span><span class="n">stub_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="bp">self</span><span class="o">.</span><span class="n">stub</span><span class="p">,</span> <span class="n">PVOID</span><span class="p">)</span><span class="o">.</span><span class="n">value</span> <span class="c1"># Same problem as keep stub... (GC..)</span>
109+
<span class="c1"># IAT_entry.stub = stub</span>
110+
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stub_addr</span><span class="p">)</span>
106111
<span class="bp">self</span><span class="o">.</span><span class="n">realfunction</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">WINFUNCTYPE</span><span class="p">(</span><span class="o">*</span><span class="n">types</span><span class="p">)(</span><span class="n">IAT_entry</span><span class="o">.</span><span class="n">nonhookvalue</span><span class="p">)</span>
107112
<span class="bp">self</span><span class="o">.</span><span class="n">is_enable</span> <span class="o">=</span> <span class="kc">False</span>
113+
<span class="c1"># import pdb;pdb.set_trace()</span>
108114
<span class="c1">#IATHook.yolo.append(self)</span>
109115

110116
<span class="k">def</span> <span class="nf">transform_arguments</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">types</span><span class="p">):</span>
@@ -119,14 +125,17 @@ <h1>Source code for windows.hooks</h1><div class="highlight"><pre>
119125
<div class="viewcode-block" id="IATHook.enable"><a class="viewcode-back" href="../../iat_hook.html#windows.hooks.IATHook.enable">[docs]</a> <span class="k">def</span> <span class="nf">enable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
120126
<span class="sd">&quot;&quot;&quot;Enable the IAT hook: you MUST keep a reference to the IATHook while the hook is enabled&quot;&quot;&quot;</span>
121127
<span class="k">with</span> <span class="n">utils</span><span class="o">.</span><span class="n">VirtualProtected</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">addr</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">PVOID</span><span class="p">),</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">):</span>
122-
<span class="bp">self</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stub_addr</span></div>
123-
<span class="bp">self</span><span class="o">.</span><span class="n">is_enable</span> <span class="o">=</span> <span class="kc">True</span>
128+
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stub_addr</span><span class="p">)</span>
129+
<span class="bp">self</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stub_addr</span>
130+
<span class="bp">self</span><span class="o">.</span><span class="n">is_enable</span> <span class="o">=</span> <span class="kc">True</span></div>
131+
<span class="bp">self</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">enabled</span> <span class="o">=</span> <span class="kc">True</span>
124132

125133
<div class="viewcode-block" id="IATHook.disable"><a class="viewcode-back" href="../../iat_hook.html#windows.hooks.IATHook.disable">[docs]</a> <span class="k">def</span> <span class="nf">disable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
126134
<span class="sd">&quot;&quot;&quot;Disable the IAT hook&quot;&quot;&quot;</span>
127135
<span class="k">with</span> <span class="n">utils</span><span class="o">.</span><span class="n">VirtualProtected</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">addr</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">PVOID</span><span class="p">),</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">):</span>
128-
<span class="bp">self</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">nonhookvalue</span></div>
129-
<span class="bp">self</span><span class="o">.</span><span class="n">is_enable</span> <span class="o">=</span> <span class="kc">False</span>
136+
<span class="bp">self</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">nonhookvalue</span>
137+
<span class="bp">self</span><span class="o">.</span><span class="n">is_enable</span> <span class="o">=</span> <span class="kc">False</span></div>
138+
<span class="bp">self</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">enabled</span> <span class="o">=</span> <span class="kc">True</span>
130139

131140
<span class="k">def</span> <span class="nf">hook_callback</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>
132141
<span class="n">adapted_args</span> <span class="o">=</span> <span class="p">[]</span>
@@ -145,9 +154,10 @@ <h1>Source code for windows.hooks</h1><div class="highlight"><pre>
145154
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="o">*</span><span class="n">adapted_args</span><span class="p">,</span> <span class="n">real_function</span><span class="o">=</span><span class="n">real_function</span><span class="p">)</span>
146155

147156
<span class="c1"># Use this tricks to prevent garbage collection of hook ?</span>
148-
<span class="c1">#def __del__(self):</span>
149-
<span class="c1"># pass</span>
150-
157+
<span class="c1"># That&#39;s dirty..</span>
158+
<span class="c1"># def __del__(self):</span>
159+
<span class="c1"># print(&quot;HAHAHA {0}&quot;.format(self.is_enable))</span>
160+
<span class="c1"># print(&quot;HELLO&quot;)</span>
151161

152162
<span class="c1">## New simple hook API based on winproxy</span>
153163
<span class="k">def</span> <span class="nf">setup_hook</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">hook</span><span class="p">,</span> <span class="n">dll_to_hook</span><span class="p">):</span>

docs/build/html/_modules/windows/pe_parse.html

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -500,15 +500,21 @@ <h1>Source code for windows.pe_parse</h1><div class="highlight"><pre>
500500
<span class="k">return</span> <span class="bp">self</span>
501501

502502

503+
<span class="k">class</span> <span class="nc">IATPtr</span><span class="p">(</span><span class="n">PVOID</span><span class="p">):</span>
504+
<span class="nd">@classmethod</span>
505+
<span class="k">def</span> <span class="nf">from_iatentry</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">iat_entry</span><span class="p">):</span>
506+
<span class="bp">self</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">iat_entry</span><span class="o">.</span><span class="n">addr</span><span class="p">)</span>
507+
<span class="bp">self</span><span class="o">.</span><span class="n">addr</span> <span class="o">=</span> <span class="n">iat_entry</span><span class="o">.</span><span class="n">addr</span>
508+
<span class="bp">self</span><span class="o">.</span><span class="n">nonhookvalue</span> <span class="o">=</span> <span class="n">iat_entry</span><span class="o">.</span><span class="n">nonhookvalue</span>
509+
<span class="k">return</span> <span class="bp">self</span>
510+
503511
<div class="viewcode-block" id="IATEntry"><a class="viewcode-back" href="../../process.html#windows.pe_parse.IATEntry">[docs]</a><span class="k">class</span> <span class="nc">IATEntry</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">Structure</span><span class="p">):</span>
504512
<span class="sd">&quot;&quot;&quot;Represent an entry in the IAT of a module</span>
505513
<span class="sd"> Can be used to get resolved value and setup hook</span>
506514
<span class="sd"> &quot;&quot;&quot;</span>
507515
<span class="n">_fields_</span> <span class="o">=</span> <span class="p">[</span>
508516
<span class="p">(</span><span class="s2">&quot;value&quot;</span><span class="p">,</span> <span class="n">PVOID</span><span class="p">)]</span>
509517

510-
511-
512518
<span class="nd">@classmethod</span>
513519
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="nb">ord</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">transformers</span><span class="p">):</span>
514520
<span class="bp">self</span> <span class="o">=</span> <span class="n">transformers</span><span class="o">.</span><span class="n">create_structure_at</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">addr</span><span class="p">)</span>
@@ -543,10 +549,18 @@ <h1>Source code for windows.pe_parse</h1><div class="highlight"><pre>
543549
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">&quot;Setting hook in remote process (use python code injection)&quot;</span><span class="p">)</span>
544550

545551
<span class="n">hook</span> <span class="o">=</span> <span class="n">hooks</span><span class="o">.</span><span class="n">IATHook</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">types</span><span class="p">)</span>
552+
<span class="kn">import</span> <span class="nn">weakref</span>
553+
<span class="bp">self</span><span class="o">.</span><span class="n">whook</span> <span class="o">=</span> <span class="n">weakref</span><span class="o">.</span><span class="n">ref</span><span class="p">(</span><span class="n">hook</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_destroy</span><span class="p">)</span>
546554
<span class="bp">self</span><span class="o">.</span><span class="n">hook</span> <span class="o">=</span> <span class="n">hook</span>
547555
<span class="n">hook</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span></div>
548556
<span class="k">return</span> <span class="n">hook</span>
549557

558+
<span class="k">def</span> <span class="nf">on_destroy</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>
559+
<span class="c1"># We cannot know if the hook was enabled here..</span>
560+
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;DESTROY: </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">args</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">enabled</span><span class="p">))</span>
561+
<span class="c1"># import pdb;pdb.set_trace()</span>
562+
<span class="c1"># print(args[0]())</span>
563+
550564
<div class="viewcode-block" id="IATEntry.remove_hook"><a class="viewcode-back" href="../../process.html#windows.pe_parse.IATEntry.remove_hook">[docs]</a> <span class="k">def</span> <span class="nf">remove_hook</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
551565
<span class="sd">&quot;&quot;&quot;Remove the hook on the entry&quot;&quot;&quot;</span>
552566
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">hook</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
@@ -555,6 +569,11 @@ <h1>Source code for windows.pe_parse</h1><div class="highlight"><pre>
555569
<span class="bp">self</span><span class="o">.</span><span class="n">hook</span> <span class="o">=</span> <span class="kc">None</span></div></div>
556570
<span class="k">return</span> <span class="kc">True</span>
557571

572+
<span class="c1"># def __del__(self):</span>
573+
<span class="c1"># print(self.hook)</span>
574+
<span class="c1"># if self.hook:</span>
575+
<span class="c1"># print(&quot;LOL BYE {0}&quot;.format(self.hook))</span>
576+
558577

559578
<span class="k">class</span> <span class="nc">IMAGE_IMPORT_DESCRIPTOR</span><span class="p">(</span><span class="n">IMAGE_IMPORT_DESCRIPTOR</span><span class="p">):</span> <span class="c1"># TODO: use explicite name winstructs.IMAGE_IMPORT_DESCRIPTOR</span>
560579
<span class="k">def</span> <span class="nf">get_INT</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>

0 commit comments

Comments
 (0)