<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>ja1e0&#39;s blog</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://blog.imjalen.top/"/>
  <updated>2021-12-26T16:00:00.000Z</updated>
  <id>http://blog.imjalen.top/</id>
  
  <author>
    <name>ja1e0</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Binary Emulation - Dumpulator</title>
    <link href="http://blog.imjalen.top/2021/12/27/2021-12-27-dumplator%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%A8%A1%E6%8B%9F/"/>
    <id>http://blog.imjalen.top/2021/12/27/2021-12-27-dumplator二进制模拟/</id>
    <published>2021-12-26T16:00:00.000Z</published>
    <updated>2021-12-26T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="Dumpulator"><a href="#Dumpulator" class="headerlink" title="Dumpulator"></a>Dumpulator</h1><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><p><a href="https://www.youtube.com/watch?v=4Pfu98Xx9Yo" target="_blank" rel="noopener">https://www.youtube.com/watch?v=4Pfu98Xx9Yo</a></p><p>sample SHA256: <a href="https://malshare.com/sample.php?action=detail&amp;hash=eeb13cd51faa7c23d9a40241d03beb239626fbf3efe1dbbfa3994fc10dea0827" target="_blank" rel="noopener">eeb13cd51faa7c23d9a40241d03beb239626fbf3efe1dbbfa3994fc10dea0827</a></p><h2 id="0x01-MiniDump"><a href="#0x01-MiniDump" class="headerlink" title="0x01 MiniDump"></a>0x01 MiniDump</h2><p>emulate this function instead of recreating it in python with Dumpulator module.</p><p><img src="/assets/blog/2021-12-27-dumplator二进制模拟/image-20211227165111831.png" alt="image-20211227165111831"></p><p>Load up x32dbg, and run this sample .Then we’ll break on EnrtyPoint and take a mini dump by <a href="https://github.com/mrexodia/MiniDumpPlugin" target="_blank" rel="noopener">Minidump plugin</a>. 、</p><a id="more"></a><p>Command <code>MiniDump emotet.dmp</code> and build a dump for it.</p><p>hasn’t executed anything,it’s done.It’s just set up its environment.</p><p><img src="/assets/blog/2021-12-27-dumplator二进制模拟/image-20211227171558793.png" alt="image-20211227171558793"></p><h2 id="0x02-Emulated"><a href="#0x02-Emulated" class="headerlink" title="0x02 Emulated"></a>0x02 Emulated</h2><p>Go over to Python shell</p><p>We’ll import Dumpulator and init Dumpulator class.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">from</span> dumpulator <span class="keyword">import</span> Dumpulator</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>dp = Dumpulator(<span class="string">"emotet.dmp"</span>)</span><br></pre></td></tr></table></figure><p><img src="/assets/blog/2021-12-27-dumplator二进制模拟/image-20211227205103487.png" alt="image-20211227205103487"></p><p>We can call deccrypt_string_function and pass it the offset to the beginning of the <code>.text</code> section.</p><p>For example，select  <code>dword_6A901218</code>,offset is 0x1218,<code>sub_6A917AF5</code> is xref to it.</p><p>Then we analysis Calling convention of this function, <code>__usercall</code>  = <code>__fastcall</code>.</p><p> <img src="/assets/blog/2021-12-27-dumplator二进制模拟/image-20211227215351471.png" alt="image-20211227215351471"></p><p>So We just passed last two arguments on the stack.</p><p><img src="/assets/blog/2021-12-27-dumplator二进制模拟/image-20211227215859211.png" alt="image-20211227215859211"></p><p>The Return Value are returned in the <code>EAX</code> register.</p><p><img src="/assets/blog/2021-12-27-dumplator二进制模拟/image-20211227220248238.png" alt="image-20211227220248238"></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#emluate function</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>dp.call(<span class="number">0x6A917AF5</span>,[<span class="number">0xE94E3</span>, <span class="number">0x6A901218</span>])</span><br><span class="line">emulation finished, cip = <span class="number">5000</span></span><br><span class="line"><span class="number">15491624</span></span><br><span class="line"><span class="comment"># Read the return value</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>dp.read(dp.regs.eax,<span class="number">256</span>)</span><br><span class="line">bytearray(<span class="string">b'C\x00o\x00n\x00t\x00e\x00n\x00t\x00-\x00T\x00y\x00p\x00e\x00:\x00 \x00m\x00u\x00l\x00t\x00i\x00p\x00a\x00r\x00t\x00/\x00f\x00o\x00r\x00m\x00-\x00d\x00a\x00t\x00a\x00;\x00 \x00b\x00o\x00u\x00n\x00d\x00a\x00r\x00y\x00=\x00%\x00s\x00\r\x00\n\x00\x00\x00\x14\x00C\x00V\x00\xab\xab\xab\xab\xab\xab\xab\xab\x00\x00\x00\x00\x00\x00\x00\x00\xea$\xf7\xbcHx\x00\x00\xc0\x00\xeb\x00h\xa9\xeb\x00\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe\xee\xfe'</span>)</span><br><span class="line"><span class="comment"># format strings</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>dp.read(dp.regs.eax,<span class="number">256</span>).split(<span class="string">b'\x00\x00'</span>)[<span class="number">0</span>].replace(<span class="string">b'\x00'</span>,<span class="string">b''</span>)</span><br><span class="line">bytearray(<span class="string">b'Content-Type: multipart/form-data; boundary=%s\r\n'</span>)</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;Dumpulator&quot;&gt;&lt;a href=&quot;#Dumpulator&quot; class=&quot;headerlink&quot; title=&quot;Dumpulator&quot;&gt;&lt;/a&gt;Dumpulator&lt;/h1&gt;&lt;h2 id=&quot;Reference&quot;&gt;&lt;a href=&quot;#Reference&quot; class=&quot;headerlink&quot; title=&quot;Reference&quot;&gt;&lt;/a&gt;Reference&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=4Pfu98Xx9Yo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=4Pfu98Xx9Yo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;sample SHA256: &lt;a href=&quot;https://malshare.com/sample.php?action=detail&amp;amp;hash=eeb13cd51faa7c23d9a40241d03beb239626fbf3efe1dbbfa3994fc10dea0827&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;eeb13cd51faa7c23d9a40241d03beb239626fbf3efe1dbbfa3994fc10dea0827&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;0x01-MiniDump&quot;&gt;&lt;a href=&quot;#0x01-MiniDump&quot; class=&quot;headerlink&quot; title=&quot;0x01 MiniDump&quot;&gt;&lt;/a&gt;0x01 MiniDump&lt;/h2&gt;&lt;p&gt;emulate this function instead of recreating it in python with Dumpulator module.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2021-12-27-dumplator二进制模拟/image-20211227165111831.png&quot; alt=&quot;image-20211227165111831&quot;&gt;&lt;/p&gt;
&lt;p&gt;Load up x32dbg, and run this sample .Then we’ll break on EnrtyPoint and take a mini dump by &lt;a href=&quot;https://github.com/mrexodia/MiniDumpPlugin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Minidump plugin&lt;/a&gt;. 、&lt;/p&gt;
    
    </summary>
    
      <category term="工具" scheme="http://blog.imjalen.top/categories/%E5%B7%A5%E5%85%B7/"/>
    
    
      <category term="Dumpulator" scheme="http://blog.imjalen.top/tags/Dumpulator/"/>
    
      <category term="python" scheme="http://blog.imjalen.top/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>0x2 Modern_Windows_Exploit_Development_Mona2</title>
    <link href="http://blog.imjalen.top/2021/12/22/2021-12-22-MWED-Mona2/"/>
    <id>http://blog.imjalen.top/2021/12/22/2021-12-22-MWED-Mona2/</id>
    <published>2021-12-21T16:00:00.000Z</published>
    <updated>2021-12-21T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><a href="https://github.com/aW3ikun/Modern_Windows_Exploit_Development" target="_blank" rel="noopener">https://github.com/aW3ikun/Modern_Windows_Exploit_Development</a></p><h2 id="0x0-Environment"><a href="#0x0-Environment" class="headerlink" title="0x0 Environment"></a>0x0 Environment</h2><p><code>Win10 21h2</code></p><p>run <code>Windbg Preview</code> as an administrator</p><h2 id="0x1-Mona2"><a href="#0x1-Mona2" class="headerlink" title="0x1 Mona2"></a>0x1 Mona2</h2><h3 id="0x11-Installation-in-Windbg-Preview"><a href="#0x11-Installation-in-Windbg-Preview" class="headerlink" title="0x11 Installation in Windbg Preview"></a>0x11 Installation in Windbg Preview</h3><p>Reference： <a href="https://whatdocumentary.tistory.com/67" target="_blank" rel="noopener">https://whatdocumentary.tistory.com/67</a></p><p>Save this WebPage as a PDF in Folder</p><ol><li><p>install Python2.7 (x64 and x86).</p><a id="more"></a><p>(if you analysis x86 file,u have to use python_x86, and so are the x64 edition )</p></li><li><p>install pykd modulde by pip.</p><p>check python version.Then install pykd.</p><p><code>py --list</code>.</p><p><img src="/assets/blog/2021-12-22-MWED-Mona2/image-20211220173936264.png" alt="image-20211220173936264"></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">py <span class="number">-2.7</span><span class="number">-64</span> -m pip install --upgrade pykd</span><br><span class="line">py <span class="number">-2.7</span><span class="number">-32</span> -m pip install --upgrade pykd</span><br></pre></td></tr></table></figure></li><li><p>Download mona、windbglib、pykd.dll.</p><ol><li><p>mona.py <a href="https://github.com/corelan/mona" target="_blank" rel="noopener">https://github.com/corelan/mona</a></p></li><li><p>windbglib  <a href="https://github.com/corelan/windbglib" target="_blank" rel="noopener">https://github.com/corelan/windbglib</a></p></li><li><p>pykd.dll(x64_edition And x86_edition,It is better to change the name to distinguish) <a href="https://githomelab.ru/pykd/pykd-ext/-/wikis/Downloads" target="_blank" rel="noopener">https://githomelab.ru/pykd/pykd-ext/-/wikis/Downloads</a></p><p><code>gsudo regsvr32.exe .\msdia120.dll</code>,Register msdia120.dll through the regsvr32.exe. u have to do it in cmd with administrator privileges.</p></li></ol></li><li><p>Use Mona.py</p><p>When Windbg launch x64 File。</p><ol><li><code>.extpath+ D:\dbgext</code></li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">0: kd&gt; .extpath  D:\dbgext</span><br><span class="line">Extension search path is: D:\dbgext</span><br></pre></td></tr></table></figure><ol start="2"><li><code>.load pykd_x64</code></li><li><code>!select -2.7</code> change python editon.<img src="/assets/blog/2021-12-22-MWED-Mona2/image-20211220184852828.png" alt="image-20211220184852828"></li><li><code>!py D:\dbgext\mona</code><img src="/assets/blog/2021-12-22-MWED-Mona2/image-20211221132413698.png" alt="image-20211221132413698"></li><li><code>!py D:\dbgext\mona update</code></li></ol></li><li><p>attach the x32 file,<code>pykd_x86.dll</code> loads well.</p><p><img src="/assets/blog/2021-12-22-MWED-Mona2/image-20211221171820633.png" alt="image-20211221171820633"></p><p>Python runs in 32-bit.<img src="/assets/blog/2021-12-22-MWED-Mona2/image-20211221171713235.png" alt="image-20211221171713235"></p></li><li><p>comment out these print.<img src="/assets/blog/2021-12-22-MWED-Mona2/image-20211222121034855.png" alt="image-20211222121034855"></p></li></ol><p>Or Run the Initiation script，use<code>$$&gt;a&lt;d:\dbgext\InitMona.txt x86</code> command.<img src="/assets/blog/2021-12-22-MWED-Mona2/image-20211221195335053.png" alt="image-20211221195335053" style="zoom:150%;"></p><h3 id="0x12-Configurationw"><a href="#0x12-Configurationw" class="headerlink" title="0x12 Configurationw"></a>0x12 Configurationw</h3><h4 id="0x121-Set-Working-directory"><a href="#0x121-Set-Working-directory" class="headerlink" title="0x121 Set Working directory"></a>0x121 Set Working directory</h4><p>dump data to files created in the mona’s working directory.</p><p>We can specify a working directory which depends on the process name and id by using the format specifiers <code>%p (process name)</code> and <code>%i    (process id)</code>.</p><p><code>!py d:\dbgext\mona config -set workingfolder &quot;d:\temp\mona_files\%p_%i&quot;</code></p><h4 id="0x123-Exclude-module"><a href="#0x123-Exclude-module" class="headerlink" title="0x123 Exclude module"></a>0x123 Exclude module</h4><p>exclude specific modules</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">!py d:\dbgext\mona  config -set excluded_modules <span class="string">"module1.dll,module2.dll"</span></span><br><span class="line">!py d:\dbgext\mona  config -add excluded_modules <span class="string">"module3.dll,module4.dll"</span></span><br></pre></td></tr></table></figure><h4 id="0x124-Set-the-author"><a href="#0x124-Set-the-author" class="headerlink" title="0x124 Set the author"></a>0x124 Set the author</h4><p><code>!py d:\dbgext\mona config -set author aWei</code></p><h3 id="0x13-Mona-Manual"><a href="#0x13-Mona-Manual" class="headerlink" title="0x13 Mona Manual"></a>0x13 Mona Manual</h3><p><a href="http://bbs.pediy.com/showthread.php?t=199198&amp;highlight=mona" target="_blank" rel="noopener">kanxue(Chinese Edition)</a></p><p><a href="https://www.corelan.be/index.php/2011/07/14/mona-py-the-manual/" target="_blank" rel="noopener">offical</a></p><h3 id="0x14-Example"><a href="#0x14-Example" class="headerlink" title="0x14 Example"></a>0x14 Example</h3><p><code>!py d:\dbgext\mona  findwild -s &quot;push r32 # * # pop eax # inc eax # * # retn&quot;</code></p><table><thead><tr><th>Command</th><th>Description</th></tr></thead><tbody><tr><td>findwild</td><td>find chains of instructions with a particular form</td></tr><tr><td>-s</td><td>specifies the shape of the chain</td></tr><tr><td>‘#’</td><td>instructions are separated with ‘#’</td></tr><tr><td>r32</td><td>is any 32-bit register</td></tr><tr><td>*</td><td>is any sequenece of instructions</td></tr><tr><td>-depth \&lt;nr></td><td>maximun length of the chain</td></tr><tr><td>-b \&lt;address></td><td>base address for the search</td></tr><tr><td>-t \&lt;address></td><td>top address for the search</td></tr><tr><td>-all</td><td>returns also chains which contain “bad” instruction that might break the chian(jumps,calls,..)</td></tr></tbody></table><h3 id="0x15-ROP-Chains"><a href="#0x15-ROP-Chains" class="headerlink" title="0x15 ROP Chains"></a>0x15 ROP Chains</h3><p>Mona can find  <code>ROP gadgets</code> and build <code>ROP chains</code>.</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;a href=&quot;https://github.com/aW3ikun/Modern_Windows_Exploit_Development&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/aW3ikun/Modern_Windows_Exploit_Development&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;0x0-Environment&quot;&gt;&lt;a href=&quot;#0x0-Environment&quot; class=&quot;headerlink&quot; title=&quot;0x0 Environment&quot;&gt;&lt;/a&gt;0x0 Environment&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Win10 21h2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;run &lt;code&gt;Windbg Preview&lt;/code&gt; as an administrator&lt;/p&gt;
&lt;h2 id=&quot;0x1-Mona2&quot;&gt;&lt;a href=&quot;#0x1-Mona2&quot; class=&quot;headerlink&quot; title=&quot;0x1 Mona2&quot;&gt;&lt;/a&gt;0x1 Mona2&lt;/h2&gt;&lt;h3 id=&quot;0x11-Installation-in-Windbg-Preview&quot;&gt;&lt;a href=&quot;#0x11-Installation-in-Windbg-Preview&quot; class=&quot;headerlink&quot; title=&quot;0x11 Installation in Windbg Preview&quot;&gt;&lt;/a&gt;0x11 Installation in Windbg Preview&lt;/h3&gt;&lt;p&gt;Reference： &lt;a href=&quot;https://whatdocumentary.tistory.com/67&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://whatdocumentary.tistory.com/67&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Save this WebPage as a PDF in Folder&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;install Python2.7 (x64 and x86).&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
    
    </summary>
    
      <category term="Modern_Windows_Exploit_Development" scheme="http://blog.imjalen.top/categories/Modern-Windows-Exploit-Development/"/>
    
    
      <category term="Windbg" scheme="http://blog.imjalen.top/tags/Windbg/"/>
    
  </entry>
  
  <entry>
    <title>0x1 Modern_Windows_Exploit_Development_Windbg</title>
    <link href="http://blog.imjalen.top/2021/12/14/2021-12-14-MWED-Windbg/"/>
    <id>http://blog.imjalen.top/2021/12/14/2021-12-14-MWED-Windbg/</id>
    <published>2021-12-13T16:00:00.000Z</published>
    <updated>2021-12-13T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="0x0-Environment"><a href="#0x0-Environment" class="headerlink" title="0x0 Environment"></a>0x0 Environment</h2><p><code>Vmware Workstation 16 Pro 16.1.2</code></p><p><code>Win7 x64 sp1</code></p><p><code>Windbg Preview</code></p><h2 id="0x1-Windbg"><a href="#0x1-Windbg" class="headerlink" title="0x1 Windbg"></a>0x1 Windbg</h2><p>refer to other’s blog that  《<a href="https://voidsec.com/windows-kernel-debugging-exploitation/" target="_blank" rel="noopener">Setting up kernel debugging using WinDbg and VMware</a>》。</p><ul><li><p>Setting symbol File Path</p><p>Windbg Preview </p><p>File -&gt;  Setting -&gt; Debugging Settings-&gt;Symbol path </p><p>enter <code>SRV*d:\\pdb*http://msdl.microsoft.com/download/symbols</code></p></li></ul><h3 id="0x11-symbol"><a href="#0x11-symbol" class="headerlink" title="0x11 symbol"></a>0x11 symbol</h3><a id="more"></a><table><thead><tr><th>Command/Example</th><th><strong>Description</strong></th></tr></thead><tbody><tr><td>!wow64exts.sw</td><td>Switches between x86 and native mode.</td></tr><tr><td>.sympath+ c:\symbolpath</td><td>append a symbol search path to the default one during debugging</td></tr><tr><td>.reload</td><td>reload the symbols</td></tr><tr><td>x *!* / x kernel32!virtual*</td><td>Checking Symbols</td></tr><tr><td>ld*</td><td>load symbols for all modules</td></tr><tr><td>.hh / .hh \&lt;command></td><td>get Help Or press F1</td></tr></tbody></table><h3 id="0x12-Modules"><a href="#0x12-Modules" class="headerlink" title="0x12 Modules"></a>0x12 Modules</h3><ul><li>Load an Executable or Attach to a Process</li></ul><table><thead><tr><th>Command</th><th>Description</th></tr></thead><tbody><tr><td>lmf</td><td>list the loader module</td></tr><tr><td>lmf m ntdll</td><td>list a specifc module</td></tr><tr><td>!dh ntdll/!dh 0x400000</td><td>get the image header (PE Info)</td></tr></tbody></table><h3 id="0x13-Expressions"><a href="#0x13-Expressions" class="headerlink" title="0x13 Expressions"></a>0x13 Expressions</h3><p>use register, symbol ,value.</p><table><thead><tr><th>Expressions</th><th>Description</th></tr></thead><tbody><tr><td>bp 0x70000 / bp eip+1</td><td>breakpoint</td></tr><tr><td>u ntdll!NtCommitTransaction+0x41</td><td>use symbol to disassembly</td></tr><tr><td>dd esp+4</td><td>use registers to Specifies value</td></tr></tbody></table><h3 id="0x14-Numbers"><a href="#0x14-Numbers" class="headerlink" title="0x14 Numbers"></a>0x14 Numbers</h3><p>are by default in base 16.</p><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>0x123</td><td>base 16 (hexadecimal)</td></tr><tr><td>0n123</td><td>base 10 (decimal)</td></tr><tr><td>0t123</td><td>base 8 (octal)</td></tr><tr><td>0y111</td><td>base 2 (binary)</td></tr><tr><td>.formats</td><td>display a value in mant formats</td></tr><tr><td>?eax+4 /?4+4</td><td>evaluate an expression</td></tr></tbody></table><h3 id="0x15-Pseudo-registers"><a href="#0x15-Pseudo-registers" class="headerlink" title="0x15 Pseudo-registers"></a>0x15 Pseudo-registers</h3><p>Pseudo-registers are indicated by the<br>prefix ‘$‘. </p><p>the prefix ‘@‘ which tells WinDbg that what follows is<br>a register and not a symbol. If ‘@‘ is not used, WinDbg will first try to interpret the name as a symbol.</p><p>$teb or @$teb (address of the TEB)<br>$peb or @$peb (address of the PEB)<br>$thread or @$thread (current thread)</p><h3 id="0x16-Exceptions"><a href="#0x16-Exceptions" class="headerlink" title="0x16 Exceptions"></a>0x16 Exceptions</h3><p><code>Single-chance</code> means that the exception hasn’t been sent to the debuggee yet.<br>When we resume the execution, WinDbg sends the exception to the debuggee. If the debuggee doesn’t<br>handle the exception, WinDbg stops again and says that there’s been a <code>second-chance exception</code></p><table><thead><tr><th>Command</th><th>Description</th></tr></thead><tbody><tr><td>sxe / sex ld <module 1 name>,…,<moudule 2 name n> / sxe ld user32</moudule></module></td><td>break when a moudule is loaded</td></tr><tr><td>sx</td><td>list of exceptions type</td></tr><tr><td>sxi / sxi ld /sxi sse</td><td>ignore an exception \ ignore load module \ ignore single-chance single step exceptions</td></tr></tbody></table><h3 id="0x17-Breakpoint"><a href="#0x17-Breakpoint" class="headerlink" title="0x17 Breakpoint"></a>0x17 Breakpoint</h3><h4 id="0x171-sofrware-brekpoint"><a href="#0x171-sofrware-brekpoint" class="headerlink" title="0x171 sofrware brekpoint"></a>0x171 sofrware brekpoint</h4><p>When you put a software breakpoint on one instruction, WinDbg saves to memory the first byte of the<br>instruction and overwrites it with 0xCC which is the opcode for “int 3“.<br>When the “int 3” is executed, the breakpoint is triggered, the execution stops and WinDbg restores the<br>instruction by restoring its first byte.</p><table><thead><tr><th>Command</th><th>Description</th></tr></thead><tbody><tr><td>bp 4110a3</td><td>breakpoint at the address 0x4110a3</td></tr><tr><td>bp 4110a3 3</td><td>breakpoint  ignored the first 2 times</td></tr><tr><td>g</td><td>resume the execution (go)</td></tr><tr><td>g \<code location\></code></td><td>run until a certain address <br>‘g’ puts a one-time software breakpoint.</td></tr></tbody></table><h4 id="0x172-hardware-breakpoint"><a href="#0x172-hardware-breakpoint" class="headerlink" title="0x172 hardware breakpoint"></a>0x172 hardware breakpoint</h4><p>use specific registers of the CPU。</p><p>can’t set more than 4 breakpoints.</p><p>It’s not possible to use hardware breakpoints for a process</p><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>ba \&lt;mode> \&lt;size> \&lt;address> <passes (default="1)"></passes></td><td></td></tr><tr><td>\&lt;mode></td><td>‘e’for execute <br>‘r’for read/write memory access <br>‘w’ for write memory access</td></tr><tr><td>\&lt;size></td><td>specifies the size of the location, in bytes, to monitor for access (it’s always 1 when \<mode>\ is ‘e‘).</mode></td></tr><tr><td>\&lt;address></td><td>the loction</td></tr><tr><td>\&lt;passes></td></tr></tbody></table><h4 id="0x173-Handling-Breakpoints"><a href="#0x173-Handling-Breakpoints" class="headerlink" title="0x173 Handling Breakpoints"></a>0x173 Handling Breakpoints</h4><table><thead><tr><th>Command</th><th>Description</th></tr></thead><tbody><tr><td>bl</td><td>breakpoint list</td></tr><tr><td>bd</td><td>disable a breakpoint</td></tr><tr><td>bc</td><td>delete a breakpoint</td></tr><tr><td>bc *</td><td>delete all the breakpoints</td></tr></tbody></table><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">0:016&gt; bl</span><br><span class="line">     0 e Disable Clear  04000000     0001 (0001)  0:**** uTools!v8_inspector::V8StackTraceId::IsInvalid+0x99b20</span><br></pre></td></tr></table></figure><ul><li>0 : breakpoint ID</li><li>e : breakpoint status; can be (e)nabled or (d)isabled</li><li>Disable : click Disable</li><li>Clear : click Clear</li><li>04000000 : memory address </li><li>0001(0001) : the number of passes</li><li>0:****  : the associated process and thread. The asterisks mean that the breakpoint is not thread-<br>specific</li><li>uTools!v8_inspector::V8StackTraceId::IsInvalid+0x99b20 : the moudule, function and offset where the breakpoint is located</li></ul><h4 id="0x174-Breakpoint-Commands"><a href="#0x174-Breakpoint-Commands" class="headerlink" title="0x174 Breakpoint Commands"></a>0x174 Breakpoint Commands</h4><p>example:</p><p><code>bp Main &quot;.echo \&quot;Here are the registers:\n\&quot;; r&quot;</code></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Here are the registers:</span><br><span class="line">eax=013b5f70 ebx=0117a000 ecx=00000001 edx=013b66e0 esi=00951023 edi=00951023</span><br><span class="line">eip=00951810 esp=0133f9d0 ebp=0133f9ec iopl=0         nv up ei pl nz na po nc</span><br><span class="line">cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202</span><br><span class="line">ConsoleApplication1!main:</span><br><span class="line">00951810 55              push    ebp</span><br></pre></td></tr></table></figure><p><code>bp 00951811   &quot;.printf \&quot;new Array Data: addr = 0x%p\\n\&quot;,eax;g&quot;</code></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">new Array Data: addr = 0x013b5f70</span><br></pre></td></tr></table></figure><h3 id="0x18-Stepping"><a href="#0x18-Stepping" class="headerlink" title="0x18 Stepping"></a>0x18 Stepping</h3><table><thead><tr><th>Command</th><th>Description</th></tr></thead><tbody><tr><td>t</td><td>step-in</td></tr><tr><td>p</td><td>step-over</td></tr><tr><td>gu</td><td>step-out</td></tr><tr><td>pa/ta \&lt;address></td><td>step/trace to address</td></tr><tr><td>pc/tc</td><td>step/trace to next call/int instruction</td></tr><tr><td>pt/tt</td><td>step/trace to next ret (discussed above at point 3</td></tr><tr><td>pct/tct</td><td>step/trace to next call/int or ret</td></tr><tr><td>ph/th</td><td>step/trace to next branching instruction</td></tr></tbody></table><h3 id="0x19-Memory"><a href="#0x19-Memory" class="headerlink" title="0x19 Memory"></a>0x19 Memory</h3><h4 id="0x191-Displaying-Memory"><a href="#0x191-Displaying-Memory" class="headerlink" title="0x191 Displaying Memory"></a>0x191 Displaying Memory</h4><table><thead><tr><th>Command \ d*</th><th>Description</th></tr></thead><tbody><tr><td>db</td><td>display bytes</td></tr><tr><td>dw</td><td>display words (2 bytes)</td></tr><tr><td>dd</td><td>display dwords (4 bytes)</td></tr><tr><td>dq</td><td>display qwords (8 bytes)</td></tr><tr><td>dyb</td><td>display bits</td></tr><tr><td>da</td><td>display null-terminated ASCII strings</td></tr><tr><td>du</td><td>display null-terminated Unicode strings</td></tr></tbody></table><p><strong>d* [range]</strong></p><table><thead><tr><th>[range]</th><th>Example</th></tr></thead><tbody><tr><td>\<start address> \<end address></end></start></td><td>db 77cac000 77cac0ff</td></tr><tr><td>\<start address> L\<number of elements></number></start></td><td>dd 77cac000  L10</td></tr><tr><td>\<start address></start></td><td>will display 128 bytes</td></tr></tbody></table><h4 id="0x192-Editing-Memory"><a href="#0x192-Editing-Memory" class="headerlink" title="0x192 Editing Memory"></a>0x192 Editing Memory</h4><p><code>e[d|w|b] &lt;address&gt; [&lt;new value 1&gt; ... &lt;new value N&gt;]</code></p><p>d = dword, w = word, b = byte</p><p><code>ed eip cc cc</code> This overwrites the first two dwords at the address in eip with the value 0xCC</p><h4 id="0x193-Searching-Memory"><a href="#0x193-Searching-Memory" class="headerlink" title="0x193 Searching Memory"></a>0x193 Searching Memory</h4><p><code>s [-d|-w|-b|-a|-u] &lt;start address&gt; L?&lt;number of elements&gt; &lt;search values&gt;</code></p><h3 id="0x1A-Miscellaneous-Commands"><a href="#0x1A-Miscellaneous-Commands" class="headerlink" title="0x1A Miscellaneous Commands"></a>0x1A Miscellaneous Commands</h3><h4 id="0x1A1-Pointer"><a href="#0x1A1-Pointer" class="headerlink" title="0x1A1 Pointer"></a>0x1A1 Pointer</h4><p><code>dd poi(ebp+4)</code></p><h4 id="0x1A2"><a href="#0x1A2" class="headerlink" title="0x1A2"></a>0x1A2</h4><table><thead><tr><th>Command</th><th>Description</th></tr></thead><tbody><tr><td>r</td><td>display the register</td></tr><tr><td>u</td><td>unassemble</td></tr><tr><td>u EIP L3</td><td>print the first 3 instrutions</td></tr><tr><td>k</td><td>display the call stack</td></tr></tbody></table><h4 id="0x1A3-Dumping-Structures"><a href="#0x1A3-Dumping-Structures" class="headerlink" title="0x1A3 Dumping Structures"></a>0x1A3 Dumping Structures</h4><table><thead><tr><th>Command</th><th>Description</th></tr></thead><tbody><tr><td>!teb</td><td>Displays the TEB (Thread Environment Block).</td></tr><tr><td>$teb</td><td>Address of the TEB.</td></tr><tr><td>!peb</td><td>Displays the PEB (Process Environment Block).</td></tr><tr><td>$peb</td><td>Address of the PEB.</td></tr><tr><td>!exchain</td><td>Displays the current exception handler chain.</td></tr><tr><td>!vadump</td><td>Displays the list of memory pages and info.</td></tr><tr><td>!lmi \<module name></module></td><td>Displays information for the specified module.</td></tr><tr><td>!slist \<address></address></td><td></td></tr><tr><td>[ \&lt;symbol> [\&lt;offset>] ]</td><td>Displays a singly-linked list, where: <br><address> is the address of the pointer to the first node of the list <br><br><br><symbol> is the name of the structure of the nodes <br><br><offset> is the offset of the field “next” within the node</offset></symbol></address></td></tr><tr><td>dt \<struct name></struct></td><td>Displays the structure <struct name>.</struct></td></tr><tr><td>dt \<struct name> \<field></field></struct></td><td>Displays the field <field> of the structure \<struct name>.</struct></field></td></tr><tr><td>dt \<struct name> \&lt;address></struct></td><td>Displays the data at \<address> as a structure of type \<struct name\> (you needsymbols for \<struct name\>).</struct></struct></address></td></tr><tr><td>dg \<first selector>[\<last selector\>]</last></first></td><td>Displays the segment descriptor for the specified selectors.</td></tr></tbody></table>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;0x0-Environment&quot;&gt;&lt;a href=&quot;#0x0-Environment&quot; class=&quot;headerlink&quot; title=&quot;0x0 Environment&quot;&gt;&lt;/a&gt;0x0 Environment&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Vmware Workstation 16 Pro 16.1.2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Win7 x64 sp1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Windbg Preview&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;0x1-Windbg&quot;&gt;&lt;a href=&quot;#0x1-Windbg&quot; class=&quot;headerlink&quot; title=&quot;0x1 Windbg&quot;&gt;&lt;/a&gt;0x1 Windbg&lt;/h2&gt;&lt;p&gt;refer to other’s blog that  《&lt;a href=&quot;https://voidsec.com/windows-kernel-debugging-exploitation/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Setting up kernel debugging using WinDbg and VMware&lt;/a&gt;》。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Setting symbol File Path&lt;/p&gt;
&lt;p&gt;Windbg Preview &lt;/p&gt;
&lt;p&gt;File -&amp;gt;  Setting -&amp;gt; Debugging Settings-&amp;gt;Symbol path &lt;/p&gt;
&lt;p&gt;enter &lt;code&gt;SRV*d:\\pdb*http://msdl.microsoft.com/download/symbols&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;0x11-symbol&quot;&gt;&lt;a href=&quot;#0x11-symbol&quot; class=&quot;headerlink&quot; title=&quot;0x11 symbol&quot;&gt;&lt;/a&gt;0x11 symbol&lt;/h3&gt;
    
    </summary>
    
      <category term="Modern_Windows_Exploit_Development" scheme="http://blog.imjalen.top/categories/Modern-Windows-Exploit-Development/"/>
    
    
      <category term="Windbg" scheme="http://blog.imjalen.top/tags/Windbg/"/>
    
  </entry>
  
  <entry>
    <title>类普通继承的内存模型</title>
    <link href="http://blog.imjalen.top/2021/11/12/2021-11-12-%E7%B1%BB%E6%99%AE%E9%80%9A%E7%BB%A7%E6%89%BF%E7%9A%84%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/"/>
    <id>http://blog.imjalen.top/2021/11/12/2021-11-12-类普通继承的内存模型/</id>
    <published>2021-11-11T16:00:00.000Z</published>
    <updated>2021-12-14T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="类普通继承的内存模型"><a href="#类普通继承的内存模型" class="headerlink" title="类普通继承的内存模型"></a>类普通继承的内存模型</h1><h3 id="测试环境"><a href="#测试环境" class="headerlink" title="测试环境"></a>测试环境</h3><p>VS2019 x64    </p><p>关闭优化、关闭仅支持我的代码调试</p><p>IDA7.6</p><h3 id="工具"><a href="#工具" class="headerlink" title="工具"></a>工具</h3><p>通过这两个工具查看内存模型</p><h4 id="开发者命令行"><a href="#开发者命令行" class="headerlink" title="开发者命令行"></a>开发者命令行</h4><p><img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211112181520820.png" alt="image-20211112181520820"></p><ol><li><p>cd {存储的<code>cpp</code>文件夹}</p></li><li><p>cl /d1reportSingleClassLayout{类名} Main.cpp</p><p><img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211112181839502.png" alt="image-20211112181839502"></p></li><li><p>根据文字结构图形，查看类的内存分布</p></li></ol><a id="more"></a><h3 id="VS自带调试器"><a href="#VS自带调试器" class="headerlink" title="VS自带调试器"></a>VS自带调试器</h3><p>自带模型分布结构和内存查看。</p><p><img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211112182436406.png" alt="image-20211112182436406"></p><h2 id="普通继承与多继承"><a href="#普通继承与多继承" class="headerlink" title="普通继承与多继承"></a>普通继承与多继承</h2><h3 id="类成员基础模型："><a href="#类成员基础模型：" class="headerlink" title="类成员基础模型："></a>类成员基础模型：</h3><p>了解类成员和类成员函数基础布局。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">NewBase</span> &#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Go</span><span class="params">()</span></span>&#123; <span class="built_in">cout</span> &lt;&lt; <span class="string">"this is Base  "</span> &lt;&lt; <span class="built_in">endl</span>; &#125;;</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="keyword">int</span> m_a;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span>* argv[])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">NewBase* base = <span class="keyword">new</span> NewBase( );</span><br><span class="line">base-&gt;Go( );</span><br><span class="line"></span><br><span class="line">system(<span class="string">"pause"</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>此类内部值包含了成员函数和一个成员类。且调用了一次GO();</p><p>而在内存对象模型中，该函数是直接静态绑定的。</p><p>通过调试器查看内存布局，内中只存在m_a，而函数GO（）不在。<img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211115104718063.png" alt="image-20211115104718063"></p><p>而在反汇编中可直接看到直接去调用的静态函数，并没有去使用指针什么的加上偏移值调用。</p><p><img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211115105147696.png" alt="image-20211115105147696"></p><h3 id="指针与直接调用类函数的区别1："><a href="#指针与直接调用类函数的区别1：" class="headerlink" title="指针与直接调用类函数的区别1："></a>指针与直接调用类函数的区别1：</h3><p>增加成员变量，查看指针调用和引用函数的不同。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">NewBase</span> &#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Go</span><span class="params">()</span></span>&#123; <span class="built_in">cout</span> &lt;&lt; <span class="string">"this is Base  "</span> &lt;&lt; <span class="built_in">endl</span>; &#125;;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="keyword">int</span> m_b;</span><br><span class="line"><span class="keyword">int</span> m_a;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span>* argv[])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">NewBasebase2;</span><br><span class="line">base2.m_b = <span class="number">0</span>;</span><br><span class="line">base2.m_a = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">auto</span> *pt = &amp;base2;</span><br><span class="line">pt-&gt;m_a = <span class="number">2</span>;</span><br><span class="line"></span><br><span class="line">base2.Go( );</span><br><span class="line">pt-&gt;Go( );</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>从调试器可知二者地址相同。<img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211115113646412.png" alt="image-20211115113646412">而在成员函数的二者也如初一致，通过首地址（this指针）加上偏移为成员变量进行赋值。函数调用上也是一致的，将指向类头部的地址赋予<code>rcx</code>（this指针)，然后进行调用。<img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211115124744020.png" alt="image-20211115124744020"></p><h3 id="指针与直接调用类函数的区别2："><a href="#指针与直接调用类函数的区别2：" class="headerlink" title="指针与直接调用类函数的区别2："></a>指针与直接调用类函数的区别2：</h3><p>根据《深入探索C++对象模型》3.3描述，当子类继承的是虚类（virtual base class），子类指针进行调用时，会出现延迟性绑定。什么是延迟性绑定写个测试样例看看汇编好了。</p><p><img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211115181119897.png" alt="image-20211115181119897"></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">NewBase</span> &#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="comment">//void Go()&#123; cout &lt;&lt; "this is Base  " &lt;&lt; endl; &#125;;</span></span><br><span class="line"><span class="function"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="title">Go</span><span class="params">( )</span> </span>= <span class="number">0</span>;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="keyword">int</span> m_b;</span><br><span class="line"><span class="keyword">int</span> m_a;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">NewSub</span>:</span><span class="keyword">public</span> NewBase</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="comment">//void Go( ) &#123; cout &lt;&lt; "this is NewSub  " &lt;&lt; endl; &#125;</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Go</span><span class="params">( )</span> </span>&#123; m_c += <span class="number">1</span>; &#125;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="keyword">int</span> m_c;</span><br><span class="line"></span><br><span class="line">&#125;;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span>* argv[])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"></span><br><span class="line">NewSubsub;</span><br><span class="line">sub.m_b = <span class="number">0</span>;</span><br><span class="line">sub.m_a = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">auto</span> *pt = &amp;sub;</span><br><span class="line">pt-&gt;m_c = <span class="number">2</span>;</span><br><span class="line"></span><br><span class="line">sub.Go( );</span><br><span class="line">pt-&gt;Go( );</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>着重看看MSVC编译后函数调用汇编代码。</p><p><img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211115181506161.png" alt="image-20211115181506161"></p><p>1号直接是直接通过NewSub类型进行调用，采用了静态绑定，直接call全局地址。</p><p>2号框通过两层偏移获取最后的rax，然后rcx=this指针，最后<code>call [rax]</code>。</p><p>从下图中可以看出大致的内存布局，头部有一个八字节的_vfptr虚表指针，剩余3个分别是四字节的成员。并且该成员的排布符合声明顺序，且基类的成员函数在前，可能也是为了之后的指针访问提供遍历。</p><p><img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211115191702161.png" alt="image-20211115191702161"></p><p>再看看虚表指针指向的结构，表中包含一个函数地址。<img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211116105509543.png" alt="image-20211116105509543"></p><p>从IDA反汇编再看，vftable的地址处上方有RTTI结构体，下方则是成员函数<img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211116110922669.png" alt="image-20211116110922669"></p><h3 id="虚函数与多次继承与多态的反汇编及内存模型："><a href="#虚函数与多次继承与多态的反汇编及内存模型：" class="headerlink" title="虚函数与多次继承与多态的反汇编及内存模型："></a>虚函数与多次继承与多态的反汇编及内存模型：</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">VirtualBase</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="comment">//Purevirtualfunctions</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">VirtualBase( )</span><br><span class="line">&#123;</span><br><span class="line">x = <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="title">Demon</span><span class="params">( )</span> </span>= <span class="number">0</span>;</span><br><span class="line"><span class="function"><span class="keyword">virtual</span><span class="keyword">void</span> <span class="title">Base</span><span class="params">( )</span> </span>&#123; <span class="built_in">cout</span> &lt;&lt; <span class="string">"this is father class"</span> &lt;&lt; <span class="built_in">endl</span>; &#125;</span><br><span class="line"><span class="function"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="title">Base2</span><span class="params">( )</span> </span>&#123; <span class="built_in">cout</span> &lt;&lt; <span class="string">"this is father2 class"</span> &lt;&lt; <span class="built_in">endl</span>; &#125;;</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="keyword">long</span>  x;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">VirtualBase2</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="comment">//Purevirtualfunctions</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="function"><span class="keyword">virtual</span><span class="keyword">void</span> <span class="title">Base</span><span class="params">( )</span> </span>&#123; <span class="built_in">cout</span> &lt;&lt; <span class="string">"this is father class"</span> &lt;&lt; <span class="built_in">endl</span>; &#125;</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="keyword">long</span>  n = <span class="number">5</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">SubVirtual</span> :</span><span class="keyword">public</span> VirtualBase &#123;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"></span><br><span class="line">SubVirtual( )</span><br><span class="line">&#123;</span><br><span class="line">y = <span class="number">2</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Demon</span><span class="params">( )</span> </span>&#123; <span class="built_in">cout</span> &lt;&lt; <span class="string">"SubVirtual Demon"</span> &lt;&lt; <span class="built_in">endl</span>; &#125;;</span><br><span class="line"><span class="comment">//void Base( ) &#123; cout &lt;&lt; "this is SubVirtual class" &lt;&lt; endl; &#125;;</span></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="keyword">long</span>  y;</span><br><span class="line"></span><br><span class="line">&#125;;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">SubVirtual2</span> :</span><span class="keyword">public</span> VirtualBase &#123;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">SubVirtual2( )</span><br><span class="line">&#123;</span><br><span class="line">z = <span class="number">3</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Demon</span><span class="params">( )</span> </span>&#123; <span class="built_in">cout</span> &lt;&lt; <span class="string">"SubVirtual2 Demon"</span> &lt;&lt; <span class="built_in">endl</span>; &#125;;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Base</span><span class="params">( )</span> </span>&#123; <span class="built_in">cout</span> &lt;&lt; <span class="string">"this is SubVirtual2 class"</span> &lt;&lt; <span class="built_in">endl</span>; &#125;;</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="keyword">long</span>  z;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">SubVirtual3</span> :</span>  <span class="keyword">public</span>  VirtualBase,<span class="keyword">public</span> VirtualBase2 &#123;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">SubVirtual3( )</span><br><span class="line">&#123;</span><br><span class="line">m = <span class="number">4</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Demon</span><span class="params">( )</span> </span>&#123; <span class="built_in">cout</span> &lt;&lt; <span class="string">"this is SubVirtual3 class"</span> &lt;&lt; <span class="built_in">endl</span>; &#125;;</span><br><span class="line">       <span class="function"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="title">VirtualFunction</span><span class="params">( )</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"111"</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="keyword">long</span>  m;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">call</span><span class="params">(VirtualBase* vb)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">vb-&gt;Demon( );</span><br><span class="line">vb-&gt;Base( );</span><br><span class="line">vb-&gt;Base2( );</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span>  <span class="title">main</span><span class="params">(<span class="keyword">long</span>  argc, <span class="keyword">char</span>* argv[])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"></span><br><span class="line">VirtualBase* sv = <span class="keyword">new</span>SubVirtual( );</span><br><span class="line">VirtualBase* sv2 = <span class="keyword">new</span>SubVirtual2( );</span><br><span class="line">SubVirtual3* sv3 = <span class="keyword">new</span>SubVirtual3( );</span><br><span class="line"></span><br><span class="line">sv3-&gt;VirtualFunction( );</span><br><span class="line">    </span><br><span class="line">call(sv);</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"======================"</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">call(sv2);</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"======================"</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">call(sv3);</span><br><span class="line"></span><br><span class="line">system(<span class="string">"pause"</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="使用VS查看类的内存空间分布"><a href="#使用VS查看类的内存空间分布" class="headerlink" title="使用VS查看类的内存空间分布"></a>使用VS查看类的内存空间分布</h3><p>通过在<code>call</code>函数头部打上断点，查看传入进来的对象。</p><h4 id="sv"><a href="#sv" class="headerlink" title="sv"></a>sv</h4><p>只是去实现了Demon虚函数，和上述内存结构一致。</p><p><img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211116114651400.png" alt="image-20211116114651400"></p><h4 id="sv2"><a href="#sv2" class="headerlink" title="sv2"></a>sv2</h4><p>与sv差距不大，重点看看虚表的不同：<img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211116131258539.png" alt="image-20211116131258539"></p><p>SubVirtual2比SubVirtual多实现了一个Base（）虚函数。从__vfptr的指针我们可以看出，两个类<strong>分别维护</strong>了一个指向三个函数的虚表，且虚函数<code>Base2( )</code>都是没有实现的，所以指向的同一函数地址。虚表中存储的函数属于是按照基类的声明顺序存储。最后相当于访问vfptr指向的函数指针数组。</p><h4 id="sv3"><a href="#sv3" class="headerlink" title="sv3"></a>sv3</h4><p>sv3使用了两个基类进行多重继承，结构简单明了,重叠结构通过内存查看即可得知简单的重叠结构，却发现自有的虚函数不见踪影。</p><p><img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211215163042232.png" alt="image-20211215163042232"></p><p>查看该虚函数的调用过程可知自有的虚函数是在第一个的虚表指针中，偏移地址是第4个。</p><p><img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211215163210947.png" alt="image-20211215163210947"></p><p><img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211215163549537.png" alt="image-20211215163549537"></p><p>开发者命令行能完整地显示出来</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">Main.cpp</span><br><span class="line"></span><br><span class="line">class SubVirtual3       size(20):</span><br><span class="line">        +---</span><br><span class="line"> 0      | +--- (base class VirtualBase)</span><br><span class="line"> 0      | | &#123;vfptr&#125;</span><br><span class="line"> 4      | | x</span><br><span class="line">         | +---</span><br><span class="line"> 8      | +--- (base class VirtualBase2)</span><br><span class="line"> 8      | | &#123;vfptr&#125;</span><br><span class="line">12     | | n</span><br><span class="line">         | +---</span><br><span class="line">16     | m</span><br><span class="line">        +---</span><br><span class="line"></span><br><span class="line">SubVirtual3::$vftable@VirtualBase@:</span><br><span class="line">         | &amp;SubVirtual3_meta</span><br><span class="line">         |  0</span><br><span class="line"> 0      | &amp;SubVirtual3::Demon</span><br><span class="line"> 1      | &amp;VirtualBase::Base</span><br><span class="line"> 2      | &amp;VirtualBase::Base2</span><br><span class="line"> 3      | &amp;SubVirtual3::VirtualFunction</span><br><span class="line"></span><br><span class="line">SubVirtual3::$vftable@VirtualBase2@:</span><br><span class="line">         | -8</span><br><span class="line"> 0      | &amp;VirtualBase2::Base</span><br></pre></td></tr></table></figure><h4 id="VirtualBase"><a href="#VirtualBase" class="headerlink" title="VirtualBase"></a>VirtualBase</h4><p>VirtualBase存在一个纯虚函数，从IDA中我们可以看到在这个RTTI的结构体下方有一个导入的purecall函数，根据和源码的对比可以发现这就是Demon纯虚函数的位置。根据官方解释，<code>The default pure virtual function call error handler. The compiler generates code to call this function when a pure virtual member function is called.</code>默认<code>_purecall</code>函数回去访问错误处理程序，也就是该函数被意外调用时，能处理掉异常。</p><p><img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211116133247298.png" alt="image-20211116133247298"></p><h4 id="Call"><a href="#Call" class="headerlink" title="Call()"></a>Call()</h4><p>写了一个Call去满足多态调用。多态我觉得简单来说就是。子类实现了基类的虚拟函数，然后用父类指针调用这些虚拟函数（接口）。因为有不同的子类函数实现，也就呈现了虚拟函数多种形态（多态）。</p><p>接下来看看Call的汇编，红框是获取虚表首地址和this指针，然后通过固定偏移Call函数。这符合VirtualBase的调用结构。</p><p>同时因为上述虚表指针都是在实体类的头部，按顺序维护着虚函数的实现，进一步方便了多态的实现与调用。</p><p><img src="/assets/blog/2021-11-12-类普通继承的内存模型/image-20211116164201720.png" alt="image-20211116164201720"></p>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;类普通继承的内存模型&quot;&gt;&lt;a href=&quot;#类普通继承的内存模型&quot; class=&quot;headerlink&quot; title=&quot;类普通继承的内存模型&quot;&gt;&lt;/a&gt;类普通继承的内存模型&lt;/h1&gt;&lt;h3 id=&quot;测试环境&quot;&gt;&lt;a href=&quot;#测试环境&quot; class=&quot;headerlink&quot; title=&quot;测试环境&quot;&gt;&lt;/a&gt;测试环境&lt;/h3&gt;&lt;p&gt;VS2019 x64    &lt;/p&gt;
&lt;p&gt;关闭优化、关闭仅支持我的代码调试&lt;/p&gt;
&lt;p&gt;IDA7.6&lt;/p&gt;
&lt;h3 id=&quot;工具&quot;&gt;&lt;a href=&quot;#工具&quot; class=&quot;headerlink&quot; title=&quot;工具&quot;&gt;&lt;/a&gt;工具&lt;/h3&gt;&lt;p&gt;通过这两个工具查看内存模型&lt;/p&gt;
&lt;h4 id=&quot;开发者命令行&quot;&gt;&lt;a href=&quot;#开发者命令行&quot; class=&quot;headerlink&quot; title=&quot;开发者命令行&quot;&gt;&lt;/a&gt;开发者命令行&lt;/h4&gt;&lt;p&gt;&lt;img src=&quot;/assets/blog/2021-11-12-类普通继承的内存模型/image-20211112181520820.png&quot; alt=&quot;image-20211112181520820&quot;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;cd {存储的&lt;code&gt;cpp&lt;/code&gt;文件夹}&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cl /d1reportSingleClassLayout{类名} Main.cpp&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2021-11-12-类普通继承的内存模型/image-20211112181839502.png&quot; alt=&quot;image-20211112181839502&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;根据文字结构图形，查看类的内存分布&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
    
    </summary>
    
      <category term="C++对象模型" scheme="http://blog.imjalen.top/categories/C-%E5%AF%B9%E8%B1%A1%E6%A8%A1%E5%9E%8B/"/>
    
    
      <category term="类继承" scheme="http://blog.imjalen.top/tags/%E7%B1%BB%E7%BB%A7%E6%89%BF/"/>
    
  </entry>
  
  <entry>
    <title>SysMon与Powershell</title>
    <link href="http://blog.imjalen.top/2021/10/28/2021-10-28-SysMon%E4%B8%8EPowershell/"/>
    <id>http://blog.imjalen.top/2021/10/28/2021-10-28-SysMon与Powershell/</id>
    <published>2021-10-27T16:00:00.000Z</published>
    <updated>2021-10-27T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="SysMon与Powershell"><a href="#SysMon与Powershell" class="headerlink" title="SysMon与Powershell"></a>SysMon与Powershell</h1><blockquote><p><a href="https://www.socinvestigation.com/threat-hunting-using-sysmon-advanced-log-analysis-for-windows/" target="_blank" rel="noopener">https://www.socinvestigation.com/threat-hunting-using-sysmon-advanced-log-analysis-for-windows/</a></p></blockquote><blockquote><p><a href="https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon" target="_blank" rel="noopener">https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon</a></p></blockquote><p>通过引用的文章进行相关学习。</p><h3 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h3><p>Windows 10.0.19043</p><p>PowerShell 7.1.3</p><h3 id="SysMon作用"><a href="#SysMon作用" class="headerlink" title="SysMon作用"></a>SysMon作用</h3><p>监控进程所有活动</p><ol><li>进程创建（完整命令行和hash)</li><li>进程终止</li><li>网络连接</li><li>驱动程序/DLL加载</li><li>文件创建时间戳改变</li><li>远程线程创建</li><li>磁盘写入</li><li>内存访问</li></ol><h3 id="SysMon简单原理"><a href="#SysMon简单原理" class="headerlink" title="SysMon简单原理"></a>SysMon简单原理</h3><h4 id="SysMon-exe"><a href="#SysMon-exe" class="headerlink" title="SysMon.exe"></a>SysMon.exe</h4><p>通过自身释放驱动文件，进行释放拷贝注册驱动运行。</p><p>获取到IRP的数据后，写入到日志中。</p><a id="more"></a><p><img src="/assets/blog/2021-10-28-SysMon与Powershell/image-20211028114145360.png" alt="image-20211028114145360"></p><h4 id="SysmonDrv-sys"><a href="#SysmonDrv-sys" class="headerlink" title="SysmonDrv.sys"></a>SysmonDrv.sys</h4><p>通过微过滤框架，回调和通知进行日志记录。</p><p><img src="/assets/blog/2021-10-28-SysMon与Powershell/image-20211028115538907.png" alt="image-20211028115538907"></p><p><img src="/assets/blog/2021-10-28-SysMon与Powershell/image-20211028115254562.png" alt="image-20211028115254562"></p><p>SysMon增强与开源版本的SysMonX架构图如下：</p><blockquote><p><a href="https://github.com/marcosd4h/sysmonx" target="_blank" rel="noopener">https://github.com/marcosd4h/sysmonx</a></p></blockquote><p><img src="/assets/blog/2021-10-28-SysMon与Powershell/image-20211028114903283.png" alt="image-20211028114903283"></p><h3 id="运行SysMon与监控流程"><a href="#运行SysMon与监控流程" class="headerlink" title="运行SysMon与监控流程"></a>运行SysMon与监控流程</h3><h4 id="SysMon下载"><a href="#SysMon下载" class="headerlink" title="SysMon下载"></a>SysMon下载</h4><p><a href="https://www.ibm.com/links?url=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fsysinternals%2Fdownloads%2Fsysmon" target="_blank" rel="noopener">https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon</a>.</p><h3 id="SysMon运行"><a href="#SysMon运行" class="headerlink" title="SysMon运行"></a>SysMon运行</h3><p>管理员模式下运行<code>.\Sysmon.exe -i -a -accepteula</code></p><p><img src="/assets/blog/2021-10-28-SysMon与Powershell/image-20211028150805938.png" alt="image-20211028150805938"></p><h3 id="事件ID描述参考"><a href="#事件ID描述参考" class="headerlink" title="事件ID描述参考"></a>事件ID描述参考</h3><table><thead><tr><th><strong>ID</strong></th><th style="text-align:left"><strong>Tag</strong></th></tr></thead><tbody><tr><td><strong>1</strong> ProcessCreate</td><td style="text-align:left">Process Create : A detailed information about the process created</td></tr><tr><td><strong>2</strong> FileCreateTime</td><td style="text-align:left">File creation time Used to check integrity of file creationtime</td></tr><tr><td><strong>3</strong> NetworkConnect</td><td style="text-align:left">Network connection detected : Event logs TCP/UDP connections on the machine</td></tr><tr><td>4 Sysmon service state changed</td><td style="text-align:left">Sysmon service state change : The service state change event reports the state of the Sysmon service (started or stopped).</td></tr><tr><td><strong>5</strong> ProcessTerminate</td><td style="text-align:left">Process terminated : A detailed information about the process termination</td></tr><tr><td><strong>6</strong> DriverLoad</td><td style="text-align:left">Driver Loaded : A detailed information about the drive installed in addition with HASH value</td></tr><tr><td><strong>7</strong> ImageLoad</td><td style="text-align:left">Image loaded : The image loaded event logs when a module is loaded in a specific process</td></tr><tr><td><strong>8</strong> CreateRemoteThread</td><td style="text-align:left">CreateRemoteThread detected : Event detects when a process creates a thread in another process. This technique is used by malware to inject code and hide in other processes</td></tr><tr><td><strong>9</strong> RawAccessRead</td><td style="text-align:left">RawAccessRead detected : The RawAccessRead event detects when a process conducts reading operations from the drive using the \.\ denotation.</td></tr><tr><td><strong>10</strong> ProcessAccess</td><td style="text-align:left">Process accessed : The event reports when a process opens another process</td></tr><tr><td><strong>11</strong> FileCreate</td><td style="text-align:left">File created : File create operations are logged when a file is created or overwritte</td></tr><tr><td><strong>12</strong> RegistryEvent</td><td style="text-align:left">Registry object added or deleted : Registry key and value create and delete operations map to this event type,</td></tr><tr><td><strong>13</strong> RegistryEvent</td><td style="text-align:left">Registry value set : This Registry event type identifies Registry value modifications.</td></tr><tr><td><strong>14</strong> RegistryEvent</td><td style="text-align:left">Registry object renamed : This Registry event type identifies Registry value renamed</td></tr><tr><td><strong>15</strong> FileCreateStreamHash</td><td style="text-align:left">File stream created : This event logs when a named file stream is created, and it generates events that log the hash of the contents of the file to which the stream is assigned (the unnamed stream), as well as the contents of the named stream.</td></tr><tr><td><strong>16</strong> ServiceConfigurationChange</td><td style="text-align:left">Sysmon configuration change : Event triggered when Sysmon configuration change</td></tr><tr><td><strong>17</strong> PipeEvent</td><td style="text-align:left">Named pipe created : This event generates when a named pipe is created.</td></tr><tr><td><strong>18</strong> PipeEvent</td><td style="text-align:left">Named pipe connected : This event logs when a named pipe connection is made between a client and a server.</td></tr><tr><td><strong>19</strong> WmiEvent</td><td style="text-align:left">WMI filter : When a WMI event filter is registered</td></tr><tr><td><strong>20</strong> WmiEvent</td><td style="text-align:left">WMI consumer : This event logs the registration of WMI consumers</td></tr><tr><td><strong>21</strong> WmiEvent</td><td style="text-align:left">WMI consumer filter : When a consumer binds to a filter, this event logs the consumer name and filter path.</td></tr><tr><td><strong>22</strong> DNSQuery</td><td style="text-align:left">DNS query : This event is generated when a process executes a DNS query</td></tr><tr><td><strong>23</strong> FileDelete</td><td style="text-align:left">File Delete archived : A file was deleted. Additionally to logging the event, the deleted file is also saved in the ArchiveDirectory</td></tr><tr><td><strong>24</strong> ClipboardChange</td><td style="text-align:left">New content in the clipboard : This event is generated when the system clipboard contents change.</td></tr><tr><td><strong>25</strong> ProcessTampering</td><td style="text-align:left">Process image change : This event is generated when process hiding techniques such as “hollow” or “herpaderp” are being detected.</td></tr><tr><td><strong>26</strong> FileDeleteDetected</td><td style="text-align:left">File Delete logged : A file was deleted.</td></tr></tbody></table><h3 id="GUI事件查看"><a href="#GUI事件查看" class="headerlink" title="GUI事件查看"></a>GUI事件查看</h3><p>进入事件管理器进行查看，根据Id进行索引排序。</p><p><img src="/assets/blog/2021-10-28-SysMon与Powershell/image-20211028152934809.png" alt="image-20211028152934809"></p><p><img src="/assets/blog/2021-10-28-SysMon与Powershell/image-20211028153137884.png" alt="image-20211028153137884"></p><h3 id="PowerShell过滤查询"><a href="#PowerShell过滤查询" class="headerlink" title="PowerShell过滤查询"></a>PowerShell过滤查询</h3><p>以下都在命令行管理员模式下执行</p><h4 id="获取Log"><a href="#获取Log" class="headerlink" title="获取Log"></a>获取Log</h4><p><code>$test =  Get-WinEvent -LogName &quot;Microsoft-Windows-Sysmon/Operational&quot;</code></p><p><img src="/assets/blog/2021-10-28-SysMon与Powershell/image-20211028154552389.png" alt="image-20211028154552389"></p><h4 id="Id过滤"><a href="#Id过滤" class="headerlink" title="Id过滤"></a>Id过滤</h4><p><code>$test | Where-Object {$_.Id -eq 1}</code></p><h3 id="Message相关过滤"><a href="#Message相关过滤" class="headerlink" title="Message相关过滤"></a>Message相关过滤</h3><p><img src="/assets/blog/2021-10-28-SysMon与Powershell/image-20211028154718976.png" alt="image-20211028154718976"></p><table><thead><tr><th></th><th></th><th></th></tr></thead><tbody><tr><td>-like, -ilike</td><td>验证字符串包含关系，允许模式匹配，大小写不敏感</td><td>“PsTips.Net” -like “p*”</td></tr><tr><td>-clike</td><td>验证字符串包含关系，允许模式匹配，大小写敏感</td><td>“PsTips.Net” – clike “P*”</td></tr><tr><td>-notlike,-inotlike</td><td>验证字符串不包含关系，允许模式匹配，大小写不敏感</td><td>“PowerShell” -notlike “PS*”</td></tr><tr><td>-cnotlike</td><td>验证字符串不包含关系，允许模式匹配，大小写敏感</td><td>“PowerShell” -cnotlike “PO*</td></tr><tr><td>-eq, -ieq</td><td>验证是否相等，大小写不敏感</td><td>“Power” -eq “power”</td></tr><tr><td>-ceq</td><td>验证是否相等，大小写敏感</td><td>“Power” -eq “Power”</td></tr></tbody></table><p><code>$test | Where-Object {$_.Message -like &quot;*chrome*&quot;}</code></p><h3 id="XML配置过滤"><a href="#XML配置过滤" class="headerlink" title="XML配置过滤"></a>XML配置过滤</h3><p>简单模板如下：</p><p>NetworkConnect -&gt; include-&gt;chrome.exe</p><p>只收集chrome.exe的网络连接</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">Sysmon</span> <span class="attr">schemaversion</span>=<span class="string">"4.1"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">EventFiltering</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">NetworkConnect</span> <span class="attr">onmatch</span>=<span class="string">"include"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">Image</span> <span class="attr">condition</span>=<span class="string">"contains"</span>&gt;</span>chrome.exe<span class="tag">&lt;/<span class="name">Image</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">NetworkConnect</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">EventFiltering</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Sysmon</span>&gt;</span></span><br></pre></td></tr></table></figure><p>效果如图所示</p><p><img src="/assets/blog/2021-10-28-SysMon与Powershell/image-20211028161546394.png" alt="image-20211028161546394"></p><p>详细配置查看微软官方文档<a href="https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon。" target="_blank" rel="noopener">https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon。</a></p>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;SysMon与Powershell&quot;&gt;&lt;a href=&quot;#SysMon与Powershell&quot; class=&quot;headerlink&quot; title=&quot;SysMon与Powershell&quot;&gt;&lt;/a&gt;SysMon与Powershell&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.socinvestigation.com/threat-hunting-using-sysmon-advanced-log-analysis-for-windows/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.socinvestigation.com/threat-hunting-using-sysmon-advanced-log-analysis-for-windows/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;通过引用的文章进行相关学习。&lt;/p&gt;
&lt;h3 id=&quot;环境&quot;&gt;&lt;a href=&quot;#环境&quot; class=&quot;headerlink&quot; title=&quot;环境&quot;&gt;&lt;/a&gt;环境&lt;/h3&gt;&lt;p&gt;Windows 10.0.19043&lt;/p&gt;
&lt;p&gt;PowerShell 7.1.3&lt;/p&gt;
&lt;h3 id=&quot;SysMon作用&quot;&gt;&lt;a href=&quot;#SysMon作用&quot; class=&quot;headerlink&quot; title=&quot;SysMon作用&quot;&gt;&lt;/a&gt;SysMon作用&lt;/h3&gt;&lt;p&gt;监控进程所有活动&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进程创建（完整命令行和hash)&lt;/li&gt;
&lt;li&gt;进程终止&lt;/li&gt;
&lt;li&gt;网络连接&lt;/li&gt;
&lt;li&gt;驱动程序/DLL加载&lt;/li&gt;
&lt;li&gt;文件创建时间戳改变&lt;/li&gt;
&lt;li&gt;远程线程创建&lt;/li&gt;
&lt;li&gt;磁盘写入&lt;/li&gt;
&lt;li&gt;内存访问&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;SysMon简单原理&quot;&gt;&lt;a href=&quot;#SysMon简单原理&quot; class=&quot;headerlink&quot; title=&quot;SysMon简单原理&quot;&gt;&lt;/a&gt;SysMon简单原理&lt;/h3&gt;&lt;h4 id=&quot;SysMon-exe&quot;&gt;&lt;a href=&quot;#SysMon-exe&quot; class=&quot;headerlink&quot; title=&quot;SysMon.exe&quot;&gt;&lt;/a&gt;SysMon.exe&lt;/h4&gt;&lt;p&gt;通过自身释放驱动文件，进行释放拷贝注册驱动运行。&lt;/p&gt;
&lt;p&gt;获取到IRP的数据后，写入到日志中。&lt;/p&gt;
    
    </summary>
    
      <category term="Sysinternals" scheme="http://blog.imjalen.top/categories/Sysinternals/"/>
    
    
      <category term="Sysinternals" scheme="http://blog.imjalen.top/tags/Sysinternals/"/>
    
  </entry>
  
  <entry>
    <title>IDAPython入门</title>
    <link href="http://blog.imjalen.top/2021/10/03/2021-10-03-idapython%E8%A7%A3%E5%AF%86%E5%AD%97%E7%AC%A6%E4%B8%B2/"/>
    <id>http://blog.imjalen.top/2021/10/03/2021-10-03-idapython解密字符串/</id>
    <published>2021-10-02T16:00:00.000Z</published>
    <updated>2021-10-02T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="IDAPython"><a href="#IDAPython" class="headerlink" title="IDAPython"></a>IDAPython</h1><h3 id="IDAPython-版本移植"><a href="#IDAPython-版本移植" class="headerlink" title="IDAPython 版本移植"></a>IDAPython 版本移植</h3><blockquote><p>IDAPython py2移植到py3版本</p><p> <a href="https://hex-rays.com/products/ida/support/ida74_idapython_no_bc695_porting_guide.shtml" target="_blank" rel="noopener">https://hex-rays.com/products/ida/support/ida74_idapython_no_bc695_porting_guide.shtml</a></p></blockquote><h3 id="代码参考"><a href="#代码参考" class="headerlink" title="代码参考"></a>代码参考</h3><blockquote><p>参考博客</p><p> <a href="http://pwn4.fun/2016/10/29/IDAPython-Learning-part1/" target="_blank" rel="noopener">http://pwn4.fun/2016/10/29/IDAPython-Learning-part1/</a></p></blockquote><h3 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h3><p>IDAPRO_7.5</p><p>Python_3</p><h3 id="目的"><a href="#目的" class="headerlink" title="目的"></a>目的</h3><p>批量解密字符串，并进行注释，方便后期逆向。</p><p>通过参考上述博客代码，完成上述目标。</p><a id="more"></a><h3 id="解密思路"><a href="#解密思路" class="headerlink" title="解密思路"></a>解密思路</h3><p>通过解密函数的交叉引用，获取到调用解密函数的各个地址。并获取其参数，通过自解密，并进行注释。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">Final</span><span class="params">(name)</span>:</span></span><br><span class="line">    address = getAddress(name)</span><br><span class="line">    list_xref = list()</span><br><span class="line">    <span class="comment">#通过交叉引用获取引用的地址</span></span><br><span class="line">    <span class="keyword">for</span> xref <span class="keyword">in</span> XrefsTo(address, <span class="number">0</span>):</span><br><span class="line">    <span class="comment">#    print(xref.type, XrefTypeName(xref.type), 'from', hex(xref.frm), 'to', hex(xref.to))</span></span><br><span class="line">        list_xref.append(hex(xref.frm))</span><br><span class="line">    <span class="comment">#print(list_xref)</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> list_xref:    </span><br><span class="line">        addr = eval(i)</span><br><span class="line">        tmp_str = Decrypt(get_function_arg(addr))</span><br><span class="line">        <span class="keyword">if</span> tmp_str != <span class="string">""</span>:</span><br><span class="line">            print(tmp_str)</span><br><span class="line">            print(addr)</span><br><span class="line">            addDecompilerComment(addr,tmp_str)</span><br></pre></td></tr></table></figure><h3 id="库导入"><a href="#库导入" class="headerlink" title="库导入"></a>库导入</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> idc</span><br><span class="line"><span class="keyword">import</span> idaapi</span><br><span class="line"><span class="keyword">import</span> idautils</span><br></pre></td></tr></table></figure><h3 id="解密函数"><a href="#解密函数" class="headerlink" title="解密函数"></a>解密函数</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">Decrypt</span><span class="params">(encrypt_str)</span> -&gt; str :</span></span><br><span class="line">    plaintext= <span class="string">""</span></span><br><span class="line">    <span class="comment"># dosomething.....</span></span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> plaintext</span><br></pre></td></tr></table></figure><h3 id="获取解密函数的函数参数"><a href="#获取解密函数的函数参数" class="headerlink" title="获取解密函数的函数参数"></a>获取解密函数的函数参数</h3><p>这里是通过匹配opcode获取到参数地址。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#00014000139F 2768 48 8D 0D 5A 82 01 00  lea     rcx, XXXX ; "XXXXXX"</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_function_arg</span><span class="params">(addr)</span>:</span></span><br><span class="line">    tmp_str = <span class="string">""</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">30</span>):</span><br><span class="line">        <span class="comment">#获取上一个命令头部地址</span></span><br><span class="line">        addr = idc.prev_head(addr)</span><br><span class="line">        <span class="comment"># 获取前一个操作符 获取操作数</span></span><br><span class="line">        <span class="comment"># 匹配第一个和第二个opcode</span></span><br><span class="line">        <span class="keyword">if</span> idc.print_insn_mnem(addr) == <span class="string">"lea"</span> <span class="keyword">and</span> idc.print_operand(addr,<span class="number">0</span>) == <span class="string">"rcx"</span>:</span><br><span class="line">            <span class="comment">#获取第二操作数地址</span></span><br><span class="line">            tmp = idc.get_operand_value(addr,<span class="number">1</span>)</span><br><span class="line">            stmp = idc.get_strlit_contents(tmp)</span><br><span class="line">            <span class="comment">#判断是否为空</span></span><br><span class="line">            <span class="keyword">if</span> stmp ==  <span class="literal">None</span>:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            tmp_str = idc.get_strlit_contents(tmp).decode(<span class="string">"utf-8"</span>)</span><br><span class="line">            <span class="comment"># print("found it at 0x&#123;&#125; | str: &#123;&#125;".format(tmp,stmp))</span></span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">return</span> tmp_str</span><br></pre></td></tr></table></figure><h3 id="根据函数名获取其地址"><a href="#根据函数名获取其地址" class="headerlink" title="根据函数名获取其地址"></a>根据函数名获取其地址</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#根据函数名获取地址</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">getAddress</span><span class="params">(name)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> eval(hex(idc.get_name_ea_simple(name)))</span><br></pre></td></tr></table></figure><h3 id="注释"><a href="#注释" class="headerlink" title="注释"></a>注释</h3><p>满足F5注释和反汇编注释</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 注释</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">addDecompilerComment</span><span class="params">(addr, comment)</span>:</span></span><br><span class="line">    <span class="comment">#反汇编注释</span></span><br><span class="line">    idc.set_cmt(addr,comment,<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment">#F5 注释</span></span><br><span class="line">    cfunc = idaapi.decompile(addr)</span><br><span class="line">    eamap = cfunc.get_eamap()</span><br><span class="line">    decompObjAddr = eamap[addr][<span class="number">0</span>].ea</span><br><span class="line">    tl = idaapi.treeloc_t()</span><br><span class="line">    tl.ea = decompObjAddr</span><br><span class="line">    commentSet = <span class="literal">False</span></span><br><span class="line">    <span class="keyword">for</span> itp <span class="keyword">in</span> range (idaapi.ITP_SEMI, idaapi.ITP_COLON):</span><br><span class="line">        tl.itp = itp</span><br><span class="line">        cfunc.set_user_cmt(tl, comment)</span><br><span class="line">        cfunc.save_user_cmts()</span><br><span class="line">        unused = cfunc.__str__()</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> cfunc.has_orphan_cmts():</span><br><span class="line">            commentSet = <span class="literal">True</span></span><br><span class="line">            cfunc.save_user_cmts()</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        cfunc.del_orphan_cmts()</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> commentSet:</span><br><span class="line">        <span class="keyword">print</span> (<span class="string">"pseudo comment error at %08x"</span> % addr)</span><br></pre></td></tr></table></figure><h3 id="最终拼在一起"><a href="#最终拼在一起" class="headerlink" title="最终拼在一起"></a>最终拼在一起</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!python3</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> idc</span><br><span class="line"><span class="keyword">import</span> idaapi</span><br><span class="line"><span class="keyword">import</span> idautils</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">Decrypt</span><span class="params">(encrypt_str)</span> -&gt; str :</span></span><br><span class="line">    plaintext= <span class="string">""</span></span><br><span class="line">    <span class="comment">#dosomething.......</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> plaintext</span><br><span class="line"></span><br><span class="line"><span class="comment"># 注释</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">addDecompilerComment</span><span class="params">(addr, comment)</span>:</span></span><br><span class="line">    <span class="comment">#反汇编注释</span></span><br><span class="line">    idc.set_cmt(addr,comment,<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment">#F5 注释</span></span><br><span class="line">    cfunc = idaapi.decompile(addr)</span><br><span class="line">    eamap = cfunc.get_eamap()</span><br><span class="line">    decompObjAddr = eamap[addr][<span class="number">0</span>].ea</span><br><span class="line">    tl = idaapi.treeloc_t()</span><br><span class="line">    tl.ea = decompObjAddr</span><br><span class="line">    commentSet = <span class="literal">False</span></span><br><span class="line">    <span class="keyword">for</span> itp <span class="keyword">in</span> range (idaapi.ITP_SEMI, idaapi.ITP_COLON):</span><br><span class="line">        tl.itp = itp</span><br><span class="line">        cfunc.set_user_cmt(tl, comment)</span><br><span class="line">        cfunc.save_user_cmts()</span><br><span class="line">        unused = cfunc.__str__()</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> cfunc.has_orphan_cmts():</span><br><span class="line">            commentSet = <span class="literal">True</span></span><br><span class="line">            cfunc.save_user_cmts()</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        cfunc.del_orphan_cmts()</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> commentSet:</span><br><span class="line">        <span class="keyword">print</span> (<span class="string">"pseudo comment error at %08x"</span> % addr) </span><br><span class="line"></span><br><span class="line"><span class="comment">#根据函数名获取地址</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">getAddress</span><span class="params">(name)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> eval(hex(idc.get_name_ea_simple(name)))</span><br><span class="line"></span><br><span class="line"><span class="comment">#获取函数参数</span></span><br><span class="line"><span class="comment">#00014000139F 2768 48 8D 0D 5A 82 01 00                               lea     rcx, a8qlnxjy0bgkb9g ; "8QLnXjY0bgkb9GEb94eR9E"</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_function_arg</span><span class="params">(addr)</span>:</span></span><br><span class="line">    tmp_str = <span class="string">""</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">30</span>):</span><br><span class="line">        <span class="comment">#获取上一个命令头部地址</span></span><br><span class="line">        addr = idc.prev_head(addr)</span><br><span class="line">        <span class="comment"># 获取前一个操作符 获取操作数</span></span><br><span class="line">        <span class="keyword">if</span> idc.print_insn_mnem(addr) == <span class="string">"lea"</span> <span class="keyword">and</span> idc.print_operand(addr,<span class="number">0</span>) == <span class="string">"rcx"</span>:</span><br><span class="line">            <span class="comment">#获取第二操作数地址</span></span><br><span class="line">            tmp = idc.get_operand_value(addr,<span class="number">1</span>)</span><br><span class="line">            stmp = idc.get_strlit_contents(tmp)</span><br><span class="line">            <span class="comment">#判断是否为空</span></span><br><span class="line">            <span class="keyword">if</span> stmp ==  <span class="literal">None</span>:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            tmp_str = idc.get_strlit_contents(tmp).decode(<span class="string">"utf-8"</span>)</span><br><span class="line">            <span class="comment"># print("found it at 0x&#123;&#125; | str: &#123;&#125;".format(tmp,stmp))</span></span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">return</span> tmp_str</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">Final</span><span class="params">(name)</span>:</span></span><br><span class="line">    address = getAddress(name)</span><br><span class="line">    list_xref = list()</span><br><span class="line">    <span class="comment">#通过交叉引用获取引用的地址</span></span><br><span class="line">    <span class="keyword">for</span> xref <span class="keyword">in</span> XrefsTo(address, <span class="number">0</span>):</span><br><span class="line">    <span class="comment">#    print(xref.type, XrefTypeName(xref.type), 'from', hex(xref.frm), 'to', hex(xref.to))</span></span><br><span class="line">        list_xref.append(hex(xref.frm))</span><br><span class="line">    <span class="comment">#print(list_xref)</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> list_xref:    </span><br><span class="line">        addr = eval(i)</span><br><span class="line">        tmp_str = Decrypt(get_function_arg(addr))</span><br><span class="line">        <span class="keyword">if</span> tmp_str != <span class="string">""</span>:</span><br><span class="line">            print(tmp_str)</span><br><span class="line">            print(addr)</span><br><span class="line">            addDecompilerComment(addr,tmp_str)</span><br><span class="line">    </span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span><span class="params">()</span>:</span></span><br><span class="line">    <span class="comment">#输入解密函数名</span></span><br><span class="line">    Final(<span class="string">"DecryptString"</span>)</span><br><span class="line">        </span><br><span class="line">main()</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;IDAPython&quot;&gt;&lt;a href=&quot;#IDAPython&quot; class=&quot;headerlink&quot; title=&quot;IDAPython&quot;&gt;&lt;/a&gt;IDAPython&lt;/h1&gt;&lt;h3 id=&quot;IDAPython-版本移植&quot;&gt;&lt;a href=&quot;#IDAPython-版本移植&quot; class=&quot;headerlink&quot; title=&quot;IDAPython 版本移植&quot;&gt;&lt;/a&gt;IDAPython 版本移植&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;IDAPython py2移植到py3版本&lt;/p&gt;
&lt;p&gt; &lt;a href=&quot;https://hex-rays.com/products/ida/support/ida74_idapython_no_bc695_porting_guide.shtml&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hex-rays.com/products/ida/support/ida74_idapython_no_bc695_porting_guide.shtml&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;代码参考&quot;&gt;&lt;a href=&quot;#代码参考&quot; class=&quot;headerlink&quot; title=&quot;代码参考&quot;&gt;&lt;/a&gt;代码参考&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;参考博客&lt;/p&gt;
&lt;p&gt; &lt;a href=&quot;http://pwn4.fun/2016/10/29/IDAPython-Learning-part1/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://pwn4.fun/2016/10/29/IDAPython-Learning-part1/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;环境&quot;&gt;&lt;a href=&quot;#环境&quot; class=&quot;headerlink&quot; title=&quot;环境&quot;&gt;&lt;/a&gt;环境&lt;/h3&gt;&lt;p&gt;IDAPRO_7.5&lt;/p&gt;
&lt;p&gt;Python_3&lt;/p&gt;
&lt;h3 id=&quot;目的&quot;&gt;&lt;a href=&quot;#目的&quot; class=&quot;headerlink&quot; title=&quot;目的&quot;&gt;&lt;/a&gt;目的&lt;/h3&gt;&lt;p&gt;批量解密字符串，并进行注释，方便后期逆向。&lt;/p&gt;
&lt;p&gt;通过参考上述博客代码，完成上述目标。&lt;/p&gt;
    
    </summary>
    
      <category term="IDA" scheme="http://blog.imjalen.top/categories/IDA/"/>
    
    
      <category term="IDA" scheme="http://blog.imjalen.top/tags/IDA/"/>
    
      <category term="IDAPython" scheme="http://blog.imjalen.top/tags/IDAPython/"/>
    
  </entry>
  
  <entry>
    <title>SSDT 查找与HOOK</title>
    <link href="http://blog.imjalen.top/2021/10/02/2021-10-02-SSDTHOOK/"/>
    <id>http://blog.imjalen.top/2021/10/02/2021-10-02-SSDTHOOK/</id>
    <published>2021-10-01T16:00:00.000Z</published>
    <updated>2021-10-01T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="SSDT-查找与HOOK"><a href="#SSDT-查找与HOOK" class="headerlink" title="SSDT 查找与HOOK"></a>SSDT 查找与HOOK</h1><p>在内存中进行Hook，需要使用低版本或者32位的Windows版本，或者关闭掉了PatchGuard，或者一些其他的漏洞进行Hook。</p><blockquote><p>x64支持的编译器内部函数</p><p>一些封装好的操作，开中断，关中断等，不用额外写汇编函数。</p><p><a href="https://docs.microsoft.com/zh-cn/cpp/intrinsics/x64-amd64-intrinsics-list?view=msvc-160" target="_blank" rel="noopener">https://docs.microsoft.com/zh-cn/cpp/intrinsics/x64-amd64-intrinsics-list?view=msvc-160</a></p></blockquote><h2 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h2><p>VM -&gt; Windows7 sp1 x64</p><p>VS2019 wdk1903 </p><a id="more"></a><h2 id="InlineHook"><a href="#InlineHook" class="headerlink" title="InlineHook"></a>InlineHook</h2><p>不适用汇编的情况，采用填充shellcode进行Hook。</p><p>以NtOpenProcess为列，进行Hook的大概思路为以下几点：</p><ol><li><p>获取NtOpenProcess的地址。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">PVOID pApiAddr = MmGetSystemRoutineAddress(&amp;puApiName);</span><br></pre></td></tr></table></figure></li></ol><p>   原函数如下</p>   <figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">//PAGE:00000001403532EC                                         <span class="comment">; NTSTATUS __stdcall NtOpenProcess(PHANDLE ProcessHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientId)</span></span><br><span class="line">//PAGE:00000001403532EC                                         <span class="meta">public</span> NtOpenProcess</span><br><span class="line">//PAGE : 00000001403532EC                                         NtOpenProcess proc <span class="built_in">near</span></span><br><span class="line">//PAGE : 00000001403532EC</span><br><span class="line">//PAGE : 00000001403532EC                                         var_18 = <span class="built_in">byte</span> <span class="built_in">ptr</span> - <span class="number">18h</span></span><br><span class="line">//PAGE : 00000001403532EC                                         PreviousMode = <span class="built_in">byte</span> <span class="built_in">ptr</span> - <span class="number">10h</span></span><br><span class="line">//PAGE : 00000001403532EC</span><br><span class="line">//PAGE : 00000001403532EC <span class="number">000</span> <span class="number">48</span> <span class="number">83</span> EC <span class="number">38</span>                         <span class="keyword">sub</span>     <span class="built_in">rsp</span>, <span class="number">38h</span></span><br><span class="line">//PAGE : 00000001403532F0 <span class="number">038</span> <span class="number">65</span> <span class="number">48</span> 8B <span class="number">04</span> <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>          <span class="keyword">mov</span>     <span class="built_in">rax</span>, <span class="built_in">gs</span>:<span class="number">188h</span></span><br><span class="line">//PAGE : 00000001403532F9 <span class="number">038</span> <span class="number">44</span> 8A <span class="number">90</span> F6 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                <span class="keyword">mov</span>     <span class="built_in">r10b</span>, [<span class="built_in">rax</span> + <span class="number">1F6h</span>]</span><br><span class="line">//PAGE:<span class="number">0000000140353300</span> <span class="number">038</span> <span class="number">44</span> <span class="number">88</span> <span class="number">54</span> <span class="number">24</span> <span class="number">28</span>                      <span class="keyword">mov</span>[<span class="built_in">rsp</span> + <span class="number">38h</span> + PreviousMode], <span class="built_in">r10b</span><span class="comment">; PreviousMode</span></span><br><span class="line">//PAGE : <span class="number">0000000140353305</span> <span class="number">038</span> <span class="number">44</span> <span class="number">88</span> <span class="number">54</span> <span class="number">24</span> <span class="number">20</span>                      <span class="keyword">mov</span>[<span class="built_in">rsp</span> + <span class="number">38h</span> + var_18], <span class="built_in">r10b</span><span class="comment">; char</span></span><br><span class="line">//PAGE : 000000014035330A <span class="number">038</span> E8 <span class="number">51</span> FC FF FF                      <span class="keyword">call</span>    PsOpenProcess</span><br><span class="line">//PAGE : 000000014035330F <span class="number">038</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">38</span>                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">38h</span></span><br><span class="line">//PAGE : <span class="number">0000000140353313</span> <span class="number">000</span> C3                                  <span class="keyword">retn</span></span><br></pre></td></tr></table></figure><ol start="2"><li><p>保存Hook前的旧代码，并拷贝到内存空间中。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">pOldCode = ExAllocatePool(NonPagedPool, <span class="number">0x100</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!pOldCode) &#123;</span><br><span class="line">    DbgPrint(<span class="string">"ExAllocatePool Failed!\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//进行旧数据保存</span></span><br><span class="line">RtlZeroMemory(pOldCode, <span class="number">0x100</span>);</span><br><span class="line"></span><br><span class="line">RtlCopyMemory(pOldCode, pApiAddr, <span class="number">12</span>);</span><br></pre></td></tr></table></figure></li><li><p>在上述旧代码内存之后，构造一份跳回到原函数的汇编。</p><p>跳转代码使用0xFF25进行跳转，避免了寄存器的污染。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//00007FF95BB10935 | FF25 00000000 | jmp qword ptr ds : [7FF95BB1093B] |</span></span><br><span class="line"><span class="comment">//00007FF95BB1093B | 1111 | adc dword ptr ds : [rcx] , edx |</span></span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">CHAR SpringBoard[<span class="number">14</span>] = &#123; <span class="number">0xFF</span>,<span class="number">0x25</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>&#125;;</span><br><span class="line"></span><br><span class="line">*((PULONG64)(SpringBoard + <span class="number">6</span>)) = (ULONG64)pApiAddr + <span class="number">13</span>;</span><br><span class="line">    <span class="comment">//辅助跳板构建</span></span><br><span class="line"> RtlCopyMemory((PVOID)((ULONG64)pOldCode + <span class="number">13</span>), SpringBoard, <span class="keyword">sizeof</span>(SpringBoard));</span><br></pre></td></tr></table></figure></li><li><p>将NtOpenProcess的头部进行Hook，跳转到自己的函数中。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">CHAR JmpCode[<span class="number">12</span>] = &#123; <span class="number">0x48</span>,<span class="number">0xB8</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0xFF</span>,<span class="number">0xE0</span> &#125;;</span><br><span class="line"></span><br><span class="line">*((PULONG64)(JmpCode+<span class="number">2</span>)) = (PULONG64)MyNtOpenProcess;</span><br><span class="line"></span><br><span class="line"><span class="comment">//提升中断权限</span></span><br><span class="line">OldIrql = UpIRQL();</span><br><span class="line"></span><br><span class="line"><span class="comment">//Hook</span></span><br><span class="line">RtlCopyMemory(pApiAddr, JmpCode, <span class="keyword">sizeof</span>(JmpCode));</span><br><span class="line"></span><br><span class="line"><span class="comment">//降低中断权限</span></span><br><span class="line">DownIRQL(OldIrql);</span><br></pre></td></tr></table></figure></li><li><p>卸载驱动后，将原代码进行恢复。</p></li></ol><h3 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h3><blockquote><p><a href="https://github.com/aW3ikun/Windows-Kernel-Driver-Programming-Practice/blob/master/SSDT_HOOK/main.c" target="_blank" rel="noopener">https://github.com/aW3ikun/Windows-Kernel-Driver-Programming-Practice/blob/master/SSDT_HOOK/main.c</a></p></blockquote><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;ntifs.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">//Windows7 sp1</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//PAGE:00000001403532EC                                         ; NTSTATUS __stdcall NtOpenProcess(PHANDLE ProcessHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientId)</span></span><br><span class="line"><span class="comment">//PAGE:00000001403532EC                                         public NtOpenProcess</span></span><br><span class="line"><span class="comment">//PAGE : 00000001403532EC                                         NtOpenProcess proc near</span></span><br><span class="line"><span class="comment">//PAGE : 00000001403532EC</span></span><br><span class="line"><span class="comment">//PAGE : 00000001403532EC                                         var_18 = byte ptr - 18h</span></span><br><span class="line"><span class="comment">//PAGE : 00000001403532EC                                         PreviousMode = byte ptr - 10h</span></span><br><span class="line"><span class="comment">//PAGE : 00000001403532EC</span></span><br><span class="line"><span class="comment">//PAGE : 00000001403532EC 000 48 83 EC 38                         sub     rsp, 38h</span></span><br><span class="line"><span class="comment">//PAGE : 00000001403532F0 038 65 48 8B 04 25 88 01 00 00          mov     rax, gs:188h</span></span><br><span class="line"><span class="comment">//PAGE : 00000001403532F9 038 44 8A 90 F6 01 00 00                mov     r10b, [rax + 1F6h]</span></span><br><span class="line"><span class="comment">//PAGE:0000000140353300 038 44 88 54 24 28                      mov[rsp + 38h + PreviousMode], r10b; PreviousMode</span></span><br><span class="line"><span class="comment">//PAGE : 0000000140353305 038 44 88 54 24 20                      mov[rsp + 38h + var_18], r10b; char</span></span><br><span class="line"><span class="comment">//PAGE : 000000014035330A 038 E8 51 FC FF FF                      call    PsOpenProcess</span></span><br><span class="line"><span class="comment">//PAGE : 000000014035330F 038 48 83 C4 38                         add     rsp, 38h</span></span><br><span class="line"><span class="comment">//PAGE : 0000000140353313 000 C3                                  retn</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//00007FF9959406C0 | 48:B8 2222222211111111                 | mov rax,1111111122222222                                    |</span></span><br><span class="line"><span class="comment">//00007FF9959406CA | FFE0 | jmp rax |</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//00007FF95BB10935 | FF25 00000000 | jmp qword ptr ds : [7FF95BB1093B] |</span></span><br><span class="line"><span class="comment">//00007FF95BB1093B | 1111 | adc dword ptr ds : [rcx] , edx |</span></span><br><span class="line"><span class="comment">//00007FF95BB1093D | 1111 | adc dword ptr ds : [rcx] , edx |</span></span><br><span class="line"><span class="comment">//00007FF95BB1093F | 1111 | adc dword ptr ds : [rcx] , edx |</span></span><br><span class="line"><span class="comment">//00007FF95BB10941 | 1111 | adc dword ptr ds : [rcx] , edx |</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">typedef</span> <span class="title">NTSTATUS</span> <span class="params">(*pNtOpenProcess)</span><span class="params">(</span></span></span><br><span class="line"><span class="function"><span class="params">PHANDLE            ProcessHandle,</span></span></span><br><span class="line"><span class="function"><span class="params">ACCESS_MASK        DesiredAccess,</span></span></span><br><span class="line"><span class="function"><span class="params">POBJECT_ATTRIBUTES ObjectAttributes,</span></span></span><br><span class="line"><span class="function"><span class="params">PCLIENT_ID         ClientId</span></span></span><br><span class="line"><span class="function"><span class="params">)</span></span>;</span><br><span class="line"></span><br><span class="line">PVOID pOldCode = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">PULONG64 ReturnCode = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">PVOID pApiAddr = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line"><span class="function">NTSTATUS <span class="title">MyNtOpenProcess</span><span class="params">(PHANDLE ProcessHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientId)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function">KIRQL<span class="title">UpIRQL</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function">VOID<span class="title">DownIRQL</span><span class="params">(KIRQL OldIrql)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function">VOID<span class="title">RestoreCode</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function">VOID<span class="title">DriverUnload</span><span class="params">(PDRIVER_OBJECT pDriverObject)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">DbgPrint(<span class="string">"UnLoad\n"</span>);</span><br><span class="line"><span class="comment">//恢复钩子</span></span><br><span class="line">RestoreCode();</span><br><span class="line"><span class="comment">//释放创建的内存</span></span><br><span class="line">ExFreePool(pOldCode, <span class="number">0x100</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">NTSTATUS<span class="title">DriverEntry</span><span class="params">(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">pDriverObject-&gt;DriverUnload = DriverUnload;</span><br><span class="line"></span><br><span class="line">NTSTATUS status = STATUS_SUCCESS;</span><br><span class="line"></span><br><span class="line">CHAR JmpCode[<span class="number">12</span>] = &#123; <span class="number">0x48</span>,<span class="number">0xB8</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0xFF</span>,<span class="number">0xE0</span> &#125;;</span><br><span class="line"></span><br><span class="line">CHAR SpringBoard[<span class="number">14</span>] = &#123; <span class="number">0xFF</span>,<span class="number">0x25</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>&#125;;</span><br><span class="line"></span><br><span class="line">UNICODE_STRING puApiName = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">KIRQL OldIrql = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">RtlInitUnicodeString(&amp;puApiName, <span class="string">L"NtOpenProcess"</span>);</span><br><span class="line"><span class="comment">//获取函数地址</span></span><br><span class="line">pApiAddr = MmGetSystemRoutineAddress(&amp;puApiName);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (pApiAddr == <span class="literal">NULL</span>) &#123;</span><br><span class="line"><span class="keyword">return</span> STATUS_NOT_FOUND;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//构建shellcode</span></span><br><span class="line">*((PULONG64)(JmpCode+<span class="number">2</span>)) = (PULONG64)MyNtOpenProcess;</span><br><span class="line"></span><br><span class="line">*((PULONG64)(SpringBoard + <span class="number">6</span>)) = (ULONG64)pApiAddr + <span class="number">13</span>;</span><br><span class="line"></span><br><span class="line">pOldCode = ExAllocatePool(NonPagedPool, <span class="number">0x100</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!pOldCode) &#123;</span><br><span class="line">DbgPrint(<span class="string">"ExAllocatePool Failed!\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//进行旧数据保存</span></span><br><span class="line">RtlZeroMemory(pOldCode, <span class="number">0x100</span>);</span><br><span class="line"></span><br><span class="line">RtlCopyMemory(pOldCode, pApiAddr, <span class="number">12</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//辅助跳板构建</span></span><br><span class="line">RtlCopyMemory((PVOID)((ULONG64)pOldCode + <span class="number">13</span>), SpringBoard, <span class="keyword">sizeof</span>(SpringBoard));</span><br><span class="line"></span><br><span class="line"><span class="comment">//提升中断权限</span></span><br><span class="line">OldIrql = UpIRQL();</span><br><span class="line"><span class="comment">//Hook</span></span><br><span class="line">RtlCopyMemory(pApiAddr, JmpCode, <span class="keyword">sizeof</span>(JmpCode));</span><br><span class="line"></span><br><span class="line"><span class="comment">//降低中断权限</span></span><br><span class="line">DownIRQL(OldIrql);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> status;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">NTSTATUS <span class="title">MyNtOpenProcess</span><span class="params">(PHANDLE ProcessHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientId)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (ClientId-&gt;UniqueProcess == <span class="number">3628</span>) </span><br><span class="line">&#123;</span><br><span class="line">DbgPrint(<span class="string">"OpenProcess Pid:%d\n"</span>, ClientId-&gt;UniqueProcess);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> STATUS_ACCESS_DENIED;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">pNtOpenProcess pFunc = pOldCode;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> pFunc(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//提升中断权限，防止被打断</span></span><br><span class="line"><span class="comment">//关闭写保护 操作Cr0标志位</span></span><br><span class="line"><span class="comment">//关中断 当前执行不被中断</span></span><br><span class="line"><span class="function">KIRQL <span class="title">UpIRQL</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">KIRQL OldIrql = KeRaiseIrqlToDpcLevel();</span><br><span class="line"></span><br><span class="line">UINT64 cr0 = __readcr0();</span><br><span class="line"></span><br><span class="line">cr0 &amp;= <span class="number">0xfffffffffffeffff</span>;</span><br><span class="line"></span><br><span class="line">__writecr0(cr0);</span><br><span class="line"></span><br><span class="line">_disable();</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> OldIrql;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//恢复中断短线</span></span><br><span class="line"><span class="comment">//打开写保护</span></span><br><span class="line"><span class="comment">//开中断</span></span><br><span class="line"><span class="function">VOID <span class="title">DownIRQL</span><span class="params">(KIRQL OldIrql)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">KeLowerIrql(OldIrql);</span><br><span class="line"></span><br><span class="line">UINT64 cr0 = __readcr0();</span><br><span class="line"></span><br><span class="line">cr0 |= <span class="number">0x10000</span>;</span><br><span class="line"></span><br><span class="line">__writecr0(cr0);</span><br><span class="line"></span><br><span class="line">_enable();</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">VOID<span class="title">RestoreCode</span><span class="params">()</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">KIRQL OldIrql = UpIRQL();</span><br><span class="line"></span><br><span class="line">RtlCopyMemory(pApiAddr, pOldCode, <span class="number">12</span>);</span><br><span class="line"></span><br><span class="line">DownIRQL(OldIrql);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="SSDT-结构"><a href="#SSDT-结构" class="headerlink" title="SSDT 结构"></a>SSDT 结构</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">KSERVICE_TABLE_DESCRIPTOR</span> &#123;</span></span><br><span class="line">PULONG_PTR ServiceTableBase;<span class="comment">//SSDT基址</span></span><br><span class="line">PVOID ServiceCounterTableBase;<span class="comment">//SSDT中服务被调用次数计数器</span></span><br><span class="line">ULONG NumberOfService;<span class="comment">//SSDT服务个数</span></span><br><span class="line">PUCHAR ParamTableBase;</span><br><span class="line">&#125; KSERVICE_TABLE_DESCRIPTOR, * PKSERVICE_TABLE_DESCRIPTOR;</span><br></pre></td></tr></table></figure><h2 id="获取SSDT"><a href="#获取SSDT" class="headerlink" title="获取SSDT"></a>获取SSDT</h2><p>根据序列号获取特定函数地址</p><ol><li>根据MSR寄存器获取到KiSystemCall64的地址。</li></ol><p><img src="/assets/blog/2021-10-02-SSDTHOOK/image-20210920165424714.png" alt="image-20210920165424714"></p><ol start="2"><li><p>通过特征码搜寻<code>lea r10</code>, 动态获取到SSDT的地址</p></li><li><p>根据结构体获取到基址，再通过计算相加得到最终的函数地址。</p><p><img src="/assets/blog/2021-10-02-SSDTHOOK/image-20210920170116198.png" alt="image-20210920170116198"></p></li></ol><h3 id="示例-1"><a href="#示例-1" class="headerlink" title="示例"></a>示例</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">NTSTATUS <span class="title">FindSSDT</span><span class="params">()</span> </span>&#123;</span><br><span class="line">NTSTATUSstatus = STATUS_SUCCESS;</span><br><span class="line">PUCHARpSystemCall = <span class="number">0</span>;</span><br><span class="line">ULONGuCodeOffset = <span class="number">0</span>;</span><br><span class="line">ULONGuFuncOffset = <span class="number">0</span>;</span><br><span class="line">PULONGuFuncNum = <span class="number">0</span>;</span><br><span class="line">DWORD dwNum = <span class="number">2</span>;</span><br><span class="line">PKSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable = <span class="literal">NULL</span>;</span><br><span class="line">PULONG_PTR pBaseAddr = <span class="literal">NULL</span>;</span><br><span class="line">ULONG64 pFuncAddr = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">pSystemCall = (PUCHAR)__readmsr(<span class="number">0xC0000082</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//.text:FFFFF80003E98772                                         KiSystemServiceRepeat:                  ; CODE XREF: KiSystemCall64+47B↓j</span></span><br><span class="line"><span class="comment">//.text:FFFFF80003E98772 000 4C 8D 15 C7 20 23 00                lea     r10, KeServiceDescriptorTable</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; <span class="number">1000</span>; i++) &#123;</span><br><span class="line"><span class="keyword">if</span> (*(pSystemCall + i) == <span class="number">0x4c</span> &amp;&amp; *(pSystemCall + i + <span class="number">1</span>) == <span class="number">0x8D</span> &amp;&amp; *(pSystemCall + i + <span class="number">2</span>) == <span class="number">0x15</span>) &#123;</span><br><span class="line">pSystemCall += i;</span><br><span class="line">uCodeOffset = *((PULONG32)(pSystemCall + <span class="number">3</span>));</span><br><span class="line">KeServiceDescriptorTable = (PKSERVICE_TABLE_DESCRIPTOR)((ULONG64)pSystemCall + <span class="number">7</span> + uCodeOffset);</span><br><span class="line"></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">pBaseAddr = KeServiceDescriptorTable-&gt;ServiceTableBase;</span><br><span class="line">uFuncNum = (PULONG)pBaseAddr;</span><br><span class="line">uFuncOffset = uFuncNum[dwNum] &gt;&gt; <span class="number">4</span>;</span><br><span class="line">pFuncAddr = (ULONG64)pBaseAddr + uFuncOffset;</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"Function Address: %p\n"</span>, pFuncAddr);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> status;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="进阶"><a href="#进阶" class="headerlink" title="进阶"></a>进阶</h2><h3 id="通用SSDT获取"><a href="#通用SSDT获取" class="headerlink" title="通用SSDT获取"></a>通用SSDT获取</h3><h4 id="遍历NT函数地址"><a href="#遍历NT函数地址" class="headerlink" title="遍历NT函数地址"></a>遍历NT函数地址</h4><h5 id="ldr遍历"><a href="#ldr遍历" class="headerlink" title="ldr遍历"></a>ldr遍历</h5><p>win10 1903</p><p>通过PEB结构体中的_PEB_LDR_DATA中的InLoadOrderModuleList双向链表进行模块遍历</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">dt _PEB_LDR_DATA</span><br><span class="line">nt!_PEB_LDR_DATA</span><br><span class="line">   +0x000 Length           : Uint4B</span><br><span class="line">   +0x004 Initialized      : UChar</span><br><span class="line">   +0x008 SsHandle         : Ptr64 Void</span><br><span class="line">   +0x010 InLoadOrderModuleList : _LIST_ENTRY</span><br><span class="line">   +0x020 InMemoryOrderModuleList : _LIST_ENTRY</span><br><span class="line">   +0x030 InInitializationOrderModuleList : _LIST_ENTRY</span><br><span class="line">   +0x040 EntryInProgress  : Ptr64 Void</span><br><span class="line">   +0x048 ShutdownInProgress : UChar</span><br><span class="line">   +0x050 ShutdownThreadId : Ptr64 Void</span><br></pre></td></tr></table></figure><blockquote><p>​    代码参考：<a href="https://www.0xaa55.com/thread-25915-1-1.html" target="_blank" rel="noopener">https://www.0xaa55.com/thread-25915-1-1.html</a></p></blockquote><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">VOID <span class="title">EnumerateModule</span><span class="params">(HANDLE hPid)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    KAPC_STATE ks;</span><br><span class="line">    PEPROCESS eproc = LookupProcess(hPid);</span><br><span class="line">    <span class="keyword">if</span> (eproc == <span class="literal">NULL</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        DbgPrint(<span class="string">"Can't find the EPROCESS...\n"</span>);</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line">    __try</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// Get the peb address, the PEB structure in the EPROCESS is a pointer to PEB, named PPEB.</span></span><br><span class="line">        <span class="comment">// So the "(ULONG64)eproc + PEB_OFFSET_IN_EPROCESS" is the address the pointer to PEB.</span></span><br><span class="line">        <span class="comment">// And finally, use the "*" to get the address to the PEB structure.</span></span><br><span class="line">        ULONG64 peb = *(PULONG64)((ULONG64)eproc + PEB_OFFSET_IN_EPROCESS);</span><br><span class="line"> </span><br><span class="line">        KeStackAttachProcess(eproc, &amp;ks);</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line">        <span class="comment">// The LDR structure in PEB is also a pointer to PEB_LDR_DATA</span></span><br><span class="line">        <span class="comment">// So, "(ULONG64)peb + LDR_OFFSET_IN_PEB" is the address of pointer to PEB_LDR_DATA.</span></span><br><span class="line">        <span class="comment">// And the ULONG64 ldr is finally get the address of PEB_LDR_DATA structure.</span></span><br><span class="line">        ULONG64 ldr = *(PULONG64)((ULONG64)peb + LDR_OFFSET_IN_PEB);</span><br><span class="line"> </span><br><span class="line">        <span class="comment">// Get the address of "InLoadOrderModuleList" which in the PEB_LDR_DATA structure.</span></span><br><span class="line">        PLIST_ENTRY pListHead = (PLIST_ENTRY)(ldr + InLoadOrderModuleList_OFFSET);</span><br><span class="line">        PLIST_ENTRY pMod = pListHead-&gt;Flink;</span><br><span class="line"> </span><br><span class="line">        <span class="keyword">while</span> (pMod != pListHead)</span><br><span class="line">        &#123;</span><br><span class="line">            DbgPrint(<span class="string">"Base=%p, Size=%ld, Path=%wZ\n"</span>,</span><br><span class="line">                (PVOID)(((PLDR_DATA_TABLE_ENTRY)pMod)-&gt;DllBase),</span><br><span class="line">                (ULONG)(((PLDR_DATA_TABLE_ENTRY)pMod)-&gt;SizeOfImage),</span><br><span class="line">                &amp;(((PLDR_DATA_TABLE_ENTRY)pMod)-&gt;FullDllName));</span><br><span class="line">            pMod = pMod-&gt;Flink;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    __except (EXCEPTION_EXECUTE_HANDLER)</span><br><span class="line">    &#123;</span><br><span class="line">        DbgPrint(<span class="string">"EXCEPTION_EXECUTE_HANDLER is occure...\n"</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    KeUnstackDetachProcess(&amp;ks);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h5 id="ZwQuerySystemInformation查询"><a href="#ZwQuerySystemInformation查询" class="headerlink" title="ZwQuerySystemInformation查询"></a>ZwQuerySystemInformation查询</h5><p>通过ZwQuerySystemInformation查询系统模块（SystemModuleInformation），第一个即为nt模块地址信息，获取ImageBase。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//Based on: http://alter.org.ua/docs/nt_kernel/procaddr</span></span><br><span class="line">PVOIDUndocumented::GetKernelBase(PULONG pImageSize) &#123;</span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">SYSTEM_MODULE_ENTRY</span> &#123;</span></span><br><span class="line">HANDLE Section;</span><br><span class="line">PVOID MappedBase;</span><br><span class="line">PVOID ImageBase;</span><br><span class="line">ULONG ImageSize;</span><br><span class="line">ULONG Flags;</span><br><span class="line">USHORT LoadOrderIndex;</span><br><span class="line">USHORT InitOrderIndex;</span><br><span class="line">USHORT LoadCount;</span><br><span class="line">USHORT OffsetToFileName;</span><br><span class="line">UCHAR FullPathName[<span class="number">256</span>];</span><br><span class="line">&#125; SYSTEM_MODULE_ENTRY, * PSYSTEM_MODULE_ENTRY;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> <span class="meta-keyword">warning</span>(disable:4200)</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">SYSTEM_MODULE_INFORMATION</span> &#123;</span></span><br><span class="line">ULONG Count;</span><br><span class="line">SYSTEM_MODULE_ENTRY Module[<span class="number">0</span>];</span><br><span class="line">&#125; SYSTEM_MODULE_INFORMATION, * PSYSTEM_MODULE_INFORMATION;</span><br><span class="line"></span><br><span class="line">PVOID pModuleBase = <span class="literal">NULL</span>;</span><br><span class="line">NTSTATUSstatus = STATUS_SUCCESS;</span><br><span class="line">ULONGSystemInfoBuffersize = <span class="number">0</span>;</span><br><span class="line">PSYSTEM_MODULE_INFORMATION pSystemModuleInfo = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">status = Undocumented::ZwQuerySystemInformation(SystemModuleInformation,</span><br><span class="line">&amp;SystemInfoBuffersize,</span><br><span class="line"><span class="number">0</span>,</span><br><span class="line">&amp;SystemInfoBuffersize);</span><br><span class="line"><span class="keyword">if</span> (!SystemInfoBuffersize) &#123;</span><br><span class="line">DbgPrint(<span class="string">"[-]ZwQuerySystemInformation GetLengthError\n"</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">pSystemModuleInfo = (PSYSTEM_MODULE_INFORMATION)RtlAllocateMemory(<span class="literal">true</span>, SystemInfoBuffersize * <span class="number">2</span>);</span><br><span class="line"><span class="keyword">if</span> (!pSystemModuleInfo) &#123;</span><br><span class="line">DbgPrint(<span class="string">"[-]RtlAllocateMemory SystemModuleInfoError\n"</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">status = Undocumented::ZwQuerySystemInformation(SystemModuleInformation,</span><br><span class="line">pSystemModuleInfo,</span><br><span class="line">SystemInfoBuffersize * <span class="number">2</span>,</span><br><span class="line">&amp;SystemInfoBuffersize);</span><br><span class="line"><span class="keyword">if</span> (NT_SUCCESS(status)) &#123;</span><br><span class="line">pModuleBase = pSystemModuleInfo-&gt;Module[<span class="number">0</span>].ImageBase;</span><br><span class="line"><span class="keyword">if</span> (pImageSize)</span><br><span class="line">*pImageSize = pSystemModuleInfo-&gt;Module[<span class="number">0</span>].ImageSize;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">DbgPrint(<span class="string">"[-]ZwQuerySystemInformation SystemModuleInfoError\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">RtlFreeMemory(pSystemModuleInfo);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> pModuleBase;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="定位text代码开头"><a href="#定位text代码开头" class="headerlink" title="定位text代码开头"></a>定位text代码开头</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">PVOIDSSDT::NtMoudleTextFind() &#123;</span><br><span class="line">ULONGKernelSize;</span><br><span class="line">ULONG_PTRKernelBase = (ULONG_PTR)Undocumented::GetKernelBase(&amp;KernelSize);</span><br><span class="line"><span class="keyword">if</span> (KernelBase == <span class="number">0</span> || KernelBase == <span class="number">0</span>)</span><br><span class="line"><span class="keyword">return</span> <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//查找.text段</span></span><br><span class="line">PIMAGE_NT_HEADERS pNtHeader = RtlImageNtHeader((PVOID)KernelBase);</span><br><span class="line">PIMAGE_SECTION_HEADERpSection = IMAGE_FIRST_SECTION(pNtHeader);</span><br><span class="line">PIMAGE_SECTION_HEADERpTextSetion = <span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">for</span> (ULONG i = <span class="number">0</span>; i &lt; pNtHeader-&gt;FileHeader.NumberOfSections; i++) &#123;</span><br><span class="line"><span class="keyword">char</span> SectionName[IMAGE_SIZEOF_SHORT_NAME + <span class="number">1</span>] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line">RtlCopyMemory(SectionName, pSection-&gt;Name, IMAGE_SIZEOF_SHORT_NAME);</span><br><span class="line">SectionName[IMAGE_SIZEOF_SHORT_NAME] = <span class="string">'\0'</span>;</span><br><span class="line"><span class="comment">//判断text段名</span></span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">strncmp</span>(SectionName, <span class="string">".text"</span>, <span class="keyword">sizeof</span>(<span class="string">".text"</span>) - <span class="keyword">sizeof</span>(<span class="keyword">char</span>)) == <span class="number">0</span>) &#123;</span><br><span class="line">pTextSetion = pSection;</span><br><span class="line">&#125;</span><br><span class="line">pSection++;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> pTextSetion;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="特征码查找"><a href="#特征码查找" class="headerlink" title="特征码查找"></a>特征码查找</h4><p>通过先查找KiSystemServiceStart函数特征码,然后往下遍历查找<code>lea     r10, KeServiceDescriptorTable; //.text:FFFFF8046BDCDE1B 190 4C 8D 1D 5E 1C 3A 00</code>特征即可定位。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line">PSSDTStruct SSDT::SSDTFind() &#123;</span><br><span class="line"><span class="keyword">static</span>PSSDTStruct pSSDT = <span class="literal">NULL</span>;</span><br><span class="line">ULONGKernelSize;</span><br><span class="line">ULONG_PTRKernelBase = (ULONG_PTR)Undocumented::GetKernelBase(&amp;KernelSize);</span><br><span class="line"><span class="keyword">if</span> (KernelBase == <span class="number">0</span> || KernelBase == <span class="number">0</span>)</span><br><span class="line"><span class="keyword">return</span> <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//获取nt模块text段地址</span></span><br><span class="line">PIMAGE_SECTION_HEADERpTextSetion = (PIMAGE_SECTION_HEADER)NtMoudleTextFind();</span><br><span class="line"><span class="keyword">if</span> (pTextSetion == <span class="literal">NULL</span>)</span><br><span class="line"><span class="keyword">return</span> <span class="literal">NULL</span>;</span><br><span class="line"><span class="comment">//.text:FFFFF8046BDCDE00                                         KiSystemServiceStart : ; DATA XREF : KiServiceInternal + 5A↑o</span></span><br><span class="line"><span class="comment">//.text:FFFFF8046BDCDE00 190 48 89 A3 90 00 00 00                                mov[rbx + 90h], rsp; _KTHREAD.SystemCallNumber = rsp</span></span><br><span class="line"><span class="comment">//.text:FFFFF8046BDCDE07 190 8B F8                                               mov     edi, eax</span></span><br><span class="line"><span class="comment">//.text:FFFFF8046BDCDE09 190 C1 EF 07                                            shr     edi, 7; 除以128</span></span><br><span class="line"><span class="comment">//.text:FFFFF8046BDCDE0C 190 83 E7 20 and edi, 20h; 计算偏移号</span></span><br><span class="line"><span class="comment">//.text:FFFFF8046BDCDE0F 190 25 FF 0F 00 00 and eax, 0FFFh; GDI 系统调用（调用号 &gt;= 0x1000</span></span><br><span class="line"><span class="comment">//.text:FFFFF8046BDCDE14</span></span><br><span class="line"><span class="comment">//.text:FFFFF8046BDCDE14                                         KiSystemServiceRepeat : ; CODE XREF : KiSystemCall64 + 8EE↓j</span></span><br><span class="line"><span class="comment">//.text:FFFFF8046BDCDE14 190 4C 8D 15 65 9A 3B 00                                lea     r10, KeServiceDescriptorTable; #pragma pack()</span></span><br><span class="line"><span class="comment">//.text:FFFFF8046BDCDE1B 190 4C 8D 1D 5E 1C 3A 00                                lea     r11, KeServiceDescriptorTableShadow</span></span><br><span class="line"><span class="comment">//查找KiSystemServiceStart特征码</span></span><br><span class="line"><span class="keyword">const</span><span class="keyword">unsigned</span> <span class="keyword">char</span> KiSystemServiceStartPattern[] = &#123; <span class="number">0x8B</span>, <span class="number">0xF8</span>, <span class="number">0xC1</span>, <span class="number">0xEF</span>, <span class="number">0x07</span>, <span class="number">0x83</span>, <span class="number">0xE7</span>, <span class="number">0x20</span>, <span class="number">0x25</span>, <span class="number">0xFF</span>, <span class="number">0x0F</span>, <span class="number">0x00</span>, <span class="number">0x00</span> &#125;;</span><br><span class="line"><span class="keyword">const</span>ULONGSignatureSize = <span class="keyword">sizeof</span>(KiSystemServiceStartPattern);</span><br><span class="line">BOOL Found = FALSE;</span><br><span class="line">ULONGi;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; pTextSetion-&gt;Misc.VirtualSize - SignatureSize; i++) &#123;</span><br><span class="line"><span class="keyword">if</span> (RtlEqualMemory((PUCHAR)(KernelBase + pTextSetion-&gt;VirtualAddress + i), KiSystemServiceStartPattern, SignatureSize) == TRUE) &#123;</span><br><span class="line">Found = TRUE;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (!Found)</span><br><span class="line"><span class="keyword">return</span> <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//.text:FFFFF8046BDCDE14 190 4C 8D 15 65 9A 3B 00                                lea     r10, KeServiceDescriptorTable; #pragma pack()</span></span><br><span class="line"><span class="comment">//获取KeServiceDescriptorTable的相对偏移值</span></span><br><span class="line">ULONG_PTR LeaR10 = KernelBase + pTextSetion-&gt;VirtualAddress + i + SignatureSize;</span><br><span class="line">LONGSSDTOffset = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span> ((*(PUCHAR)LeaR10 == <span class="number">0x4c</span>) &amp;&amp;</span><br><span class="line">(*(PUCHAR)(LeaR10 + <span class="number">1</span>) == <span class="number">0x8D</span>) &amp;&amp;</span><br><span class="line">(*(PUCHAR)(LeaR10 + <span class="number">2</span>) == <span class="number">0x15</span>)) &#123;</span><br><span class="line">SSDTOffset = *(PLONG)(LeaR10 + <span class="number">3</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (SSDTOffset == <span class="number">0</span>)</span><br><span class="line"><span class="keyword">return</span> <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">pSSDT = (PSSDTStruct)(LeaR10 + SSDTOffset + <span class="number">7</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> _DEBUG</span></span><br><span class="line">DbgPrint(<span class="string">"[+]SSDTAddress:0x%p\n"</span>,pSSDT);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span> <span class="comment">// _DEBUG</span></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> pSSDT;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>​    </p><h3 id="通用查找ShadowSSDT"><a href="#通用查找ShadowSSDT" class="headerlink" title="通用查找ShadowSSDT"></a>通用查找ShadowSSDT</h3><p>ShadowSSDT在SSDT的命令下方，且存在一个SSDT结构体的的间隙。</p><p>相同模式直接获取ShadowSSDT地址，但是需要使用<code>KeStackAttachProcess</code>附加到图形界面程序，再获取响应函数，还有一种是通过符号进行函数地址获取，不多赘述。</p><p><img src="/assets/blog/2021-10-02-SSDTHOOK/image-20211006225821309.png" alt="image-20211006225821309"></p><p>与SSDTFind()不同之处，红色标识了地方。</p><p><img src="/assets/blog/2021-10-02-SSDTHOOK/image-20211006230429923.png" alt="image-20211006230429923"></p><h2 id="完整代码"><a href="#完整代码" class="headerlink" title="完整代码"></a>完整代码</h2><p><a href="https://github.com/aW3ikun/Windows-Kernel-Driver-Programming-Practice/tree/master/SSDT_HOOK" target="_blank" rel="noopener">https://github.com/aW3ikun/Windows-Kernel-Driver-Programming-Practice/tree/master/SSDT_HOOK</a></p>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;SSDT-查找与HOOK&quot;&gt;&lt;a href=&quot;#SSDT-查找与HOOK&quot; class=&quot;headerlink&quot; title=&quot;SSDT 查找与HOOK&quot;&gt;&lt;/a&gt;SSDT 查找与HOOK&lt;/h1&gt;&lt;p&gt;在内存中进行Hook，需要使用低版本或者32位的Windows版本，或者关闭掉了PatchGuard，或者一些其他的漏洞进行Hook。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;x64支持的编译器内部函数&lt;/p&gt;
&lt;p&gt;一些封装好的操作，开中断，关中断等，不用额外写汇编函数。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/zh-cn/cpp/intrinsics/x64-amd64-intrinsics-list?view=msvc-160&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.microsoft.com/zh-cn/cpp/intrinsics/x64-amd64-intrinsics-list?view=msvc-160&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;环境&quot;&gt;&lt;a href=&quot;#环境&quot; class=&quot;headerlink&quot; title=&quot;环境&quot;&gt;&lt;/a&gt;环境&lt;/h2&gt;&lt;p&gt;VM -&amp;gt; Windows7 sp1 x64&lt;/p&gt;
&lt;p&gt;VS2019 wdk1903 &lt;/p&gt;
    
    </summary>
    
      <category term="windows内核" scheme="http://blog.imjalen.top/categories/windows%E5%86%85%E6%A0%B8/"/>
    
    
      <category term="驱动" scheme="http://blog.imjalen.top/tags/%E9%A9%B1%E5%8A%A8/"/>
    
      <category term="SSDT" scheme="http://blog.imjalen.top/tags/SSDT/"/>
    
  </entry>
  
  <entry>
    <title>TDI网络过滤驱动初探</title>
    <link href="http://blog.imjalen.top/2021/09/15/2021-09-15-TDI%E7%BD%91%E7%BB%9C%E9%A9%B1%E5%8A%A8%E8%BF%87%E6%BB%A4/"/>
    <id>http://blog.imjalen.top/2021/09/15/2021-09-15-TDI网络驱动过滤/</id>
    <published>2021-09-14T16:00:00.000Z</published>
    <updated>2021-09-14T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>TDI网络驱动适用于Windows2000-&gt;Win7,Windows7之后的系统最好使用WFP。</p><p>TDI位于传输层的过滤。</p><p><img src="/assets/blog/2021-09-15-TDI网络驱动过滤/image-20210914174038152.png" alt="image-20210914174038152"></p><a id="more"></a><h2 id="TDI网络驱动架构"><a href="#TDI网络驱动架构" class="headerlink" title="TDI网络驱动架构"></a>TDI网络驱动架构</h2><blockquote><p><a href="https://blog.csdn.net/maomao171314/article/details/22917131" target="_blank" rel="noopener">https://blog.csdn.net/maomao171314/article/details/22917131</a></p></blockquote><p>一个大致的从上到下的网络驱动模型如下图所示</p><p>=======================================</p><p><strong>应用程序</strong> socket api ⇓</p><p><strong>WS2_32.dll</strong> socket irp ⇓ </p><p><strong>Afd.sys</strong> tdi irp ⇓ Build_irp-&gt; TDI编程</p><p><strong>Tcpip.sys</strong> 回调函数接口 ⇓ 实现协议（NDIS驱动）</p><p><strong>各Ndis中间层过滤驱动</strong> 回调函数接口 ⇓</p><p><strong>小端口驱动</strong>中断交互操作 ⇓</p><p><strong>网卡</strong></p><p>=======================================</p><p>TDI就是链接协议层和应用层的接口。</p><p>可以每一层之间再插上一层，实现过滤。</p><h2 id="创建设备-实现IRP"><a href="#创建设备-实现IRP" class="headerlink" title="创建设备 实现IRP"></a>创建设备 实现IRP</h2><p>实现TDI过滤的话，</p><ol><li><p>需要创建一个网络设备。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">status = IoCreateDevice(pDriverObject, <span class="number">0</span>, <span class="literal">NULL</span>, FILE_DEVICE_NETWORK, FILE_DEVICE_SECURE_OPEN, FALSE, &amp;pfilterdevobj);</span><br></pre></td></tr></table></figure></li><li><p>需要自定义<code>IRP_MJ_INTERNAL_DEVICE_CONTROL</code>的IRP分发函数，</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; IRP_MJ_MAXIMUM_FUNCTION; i++) &#123;</span><br><span class="line">pDriverObject-&gt;MajorFunction[i] = NotSupport;</span><br><span class="line">&#125;</span><br><span class="line">pDriverObject-&gt;MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = MyDispatch;</span><br></pre></td></tr></table></figure></li><li><p>使用<code>IoAttachDevice</code>绑定设备，例如<code>\\Device\\Tcp</code>,<code>\\Device\\Udp</code>等.</p> <figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//第三个参数是下层设备的指针</span></span><br><span class="line">status = IoAttachDevice(pfilterdevobj, &amp;devicename, &amp;pdodevobj);</span><br></pre></td></tr></table></figure></li><li><p>不使用的IRP一定要数据传递给下一层。</p> <figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">NTSTATUS <span class="title">NotSupport</span><span class="params">(DEVICE_OBJECT* pDeviceObject, IRP* pIrp)</span> </span>&#123;</span><br><span class="line">    <span class="comment">//递增跳过，让下一层拿到当前的数据</span></span><br><span class="line">    IoSkipCurrentIrpStackLocation(pIrp);</span><br><span class="line">    <span class="comment">//一定要使用AttachDevice后的下层驱动设备指针</span></span><br><span class="line">    <span class="keyword">return</span> IoCallDriver(pdodevobj, pIrp);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>进行过滤操作的IRP最后要将数据传递给下一层。</p></li><li><p>通过绑定后的设备进行判断，通过MinorFunction的操作数进行操作的分发和过滤。</p><p> 就能达到所有网络类型的过滤。</p></li></ol><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;ntifs.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;windef.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;tdi.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;tdikrnl.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span>  HTONS(A) (((A&amp;0xff00) &gt;&gt; 8) | ((A&amp;0x00ff) &lt;&lt; 8))</span></span><br><span class="line"><span class="comment">//Windows7</span></span><br><span class="line">PDEVICE_OBJECT pfilterdevobj = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">PDEVICE_OBJECT pdodevobj = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">BOOLEAN g_attachTcp = FALSE;</span><br><span class="line"></span><br><span class="line"><span class="function">NTSTATUS <span class="title">MyDispatch</span><span class="params">(DEVICE_OBJECT* DeviceObject, IRP* pIrp)</span></span>;</span><br><span class="line"><span class="function">NTSTATUS <span class="title">NotSupport</span><span class="params">(DEVICE_OBJECT* DeviceObject, IRP* pIrp)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">NETWORK_ADDRESS</span> &#123;</span></span><br><span class="line">UCHAR address[<span class="number">4</span>];</span><br><span class="line">CHAR port[<span class="number">4</span>];</span><br><span class="line">&#125;NETWORK_ADDRESS,*PNETWORK_ADDRESS;</span><br><span class="line"></span><br><span class="line"><span class="function">VOID <span class="title">DriverUnload</span><span class="params">(PDRIVER_OBJECT pDriverObject)</span> </span>&#123;</span><br><span class="line"><span class="comment">//__debugbreak();</span></span><br><span class="line">DbgPrint(<span class="string">"UnLoad\n"</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (g_attachTcp) &#123;</span><br><span class="line">IoDetachDevice(pdodevobj);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (pfilterdevobj != <span class="literal">NULL</span>) &#123;</span><br><span class="line">IoDeleteDevice(pfilterdevobj);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">NTSTATUS <span class="title">DriverEntry</span><span class="params">(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)</span> </span>&#123;</span><br><span class="line">pDriverObject-&gt;DriverUnload = DriverUnload;</span><br><span class="line"></span><br><span class="line">NTSTATUS status = STATUS_SUCCESS;</span><br><span class="line"></span><br><span class="line">UNICODE_STRING devicename = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"><span class="comment">//__debugbreak();</span></span><br><span class="line"><span class="keyword">do</span> &#123;</span><br><span class="line">status = IoCreateDevice(pDriverObject, <span class="number">0</span>, <span class="literal">NULL</span>, FILE_DEVICE_NETWORK, FILE_DEVICE_SECURE_OPEN, FALSE, &amp;pfilterdevobj);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!NT_SUCCESS(status)) &#123;</span><br><span class="line">DbgPrint(<span class="string">"Error Create %x\n"</span>, status);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; IRP_MJ_MAXIMUM_FUNCTION; i++) &#123;</span><br><span class="line">pDriverObject-&gt;MajorFunction[i] = NotSupport;</span><br><span class="line">&#125;</span><br><span class="line">pDriverObject-&gt;MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = MyDispatch;</span><br><span class="line"></span><br><span class="line">RtlInitUnicodeString(&amp;devicename, <span class="string">L"\\Device\\Tcp"</span>);</span><br><span class="line"><span class="comment">//__debugbreak();</span></span><br><span class="line"><span class="comment">//第三个参数是下层设备的指针</span></span><br><span class="line">status = IoAttachDevice(pfilterdevobj, &amp;devicename, &amp;pdodevobj);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!NT_SUCCESS(status)) &#123;</span><br><span class="line">DbgPrint(<span class="string">"Error Attach %x\n"</span>, status);</span><br><span class="line"></span><br><span class="line">IoDeleteDevice(pfilterdevobj);</span><br><span class="line"></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">g_attachTcp = TRUE;</span><br><span class="line">&#125; <span class="keyword">while</span> (FALSE);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> status;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="function">NTSTATUS <span class="title">NotSupport</span><span class="params">(DEVICE_OBJECT* pDeviceObject, IRP* pIrp)</span> </span>&#123;</span><br><span class="line"><span class="comment">//递增跳过，让下一层拿到当前的数据</span></span><br><span class="line">IoSkipCurrentIrpStackLocation(pIrp);</span><br><span class="line"><span class="comment">//一定要使用AttachDevice后的下层驱动设备指针</span></span><br><span class="line"><span class="keyword">return</span> IoCallDriver(pdodevobj, pIrp);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">NTSTATUS <span class="title">MyDispatch</span><span class="params">(DEVICE_OBJECT* pDeviceObject, IRP* pIrp)</span> </span>&#123;</span><br><span class="line"><span class="comment">//DbgPrint("This Is Filter\n");</span></span><br><span class="line">PIO_STACK_LOCATION pIrpStack = <span class="literal">NULL</span>;</span><br><span class="line"><span class="comment">//判断是否是当前的过滤设备</span></span><br><span class="line"><span class="keyword">if</span> (pDeviceObject == pfilterdevobj) &#123;</span><br><span class="line">pIrpStack = IoGetCurrentIrpStackLocation(pIrp);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (pIrpStack == <span class="literal">NULL</span>) &#123;</span><br><span class="line"><span class="keyword">return</span> STATUS_UNSUCCESSFUL;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//MajorFunction 对应IRP_MJ_XXXX</span></span><br><span class="line"><span class="comment">//MinorFunction 对应定义的其他请求</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (pIrpStack-&gt;MinorFunction == TDI_CONNECT) &#123;</span><br><span class="line">NETWORK_ADDRESS network = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">PTDI_REQUEST_KERNEL_CONNECT param = (PTDI_REQUEST_KERNEL_CONNECT)(&amp;pIrpStack-&gt;Parameters);</span><br><span class="line"></span><br><span class="line">PTA_ADDRESS remote_addr = ((TRANSPORT_ADDRESS*)(param-&gt;RequestConnectionInformation-&gt;RemoteAddress))-&gt;Address;</span><br><span class="line"></span><br><span class="line">PTDI_ADDRESS_IP tdi_addr = (PTDI_ADDRESS_IP)(remote_addr-&gt;Address);</span><br><span class="line"></span><br><span class="line">DWORD address = tdi_addr-&gt;in_addr;</span><br><span class="line"></span><br><span class="line">DWORD port = tdi_addr-&gt;sin_port;</span><br><span class="line"></span><br><span class="line">network.address[<span class="number">0</span>] = ((PUCHAR)&amp;address)[<span class="number">0</span>];</span><br><span class="line"></span><br><span class="line">network.address[<span class="number">1</span>] = ((PUCHAR)&amp;address)[<span class="number">1</span>];</span><br><span class="line"></span><br><span class="line">network.address[<span class="number">2</span>] = ((PUCHAR)&amp;address)[<span class="number">2</span>];</span><br><span class="line"></span><br><span class="line">network.address[<span class="number">3</span>] = ((PUCHAR)&amp;address)[<span class="number">3</span>];</span><br><span class="line"></span><br><span class="line">port = HTONS(port);</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"connect ip address [%d.%d.%d.%d:%d]\n"</span>, network.address[<span class="number">0</span>],network.address[<span class="number">1</span>],network.address[<span class="number">2</span>],network.address[<span class="number">3</span>],port);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//递增跳过，让下一层拿到当前的数据</span></span><br><span class="line">IoSkipCurrentIrpStackLocation(pIrp);</span><br><span class="line"><span class="comment">//一定要使用AttachDevice后的下层驱动设备指针</span></span><br><span class="line"><span class="keyword">return</span> IoCallDriver(pdodevobj, pIrp);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;TDI网络驱动适用于Windows2000-&amp;gt;Win7,Windows7之后的系统最好使用WFP。&lt;/p&gt;
&lt;p&gt;TDI位于传输层的过滤。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2021-09-15-TDI网络驱动过滤/image-20210914174038152.png&quot; alt=&quot;image-20210914174038152&quot;&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="windows内核" scheme="http://blog.imjalen.top/categories/windows%E5%86%85%E6%A0%B8/"/>
    
    
      <category term="驱动" scheme="http://blog.imjalen.top/tags/%E9%A9%B1%E5%8A%A8/"/>
    
      <category term="过滤驱动" scheme="http://blog.imjalen.top/tags/%E8%BF%87%E6%BB%A4%E9%A9%B1%E5%8A%A8/"/>
    
  </entry>
  
  <entry>
    <title>枚举注册表和进程回调以及去保护</title>
    <link href="http://blog.imjalen.top/2021/09/12/2021-09-12-%E6%9E%9A%E4%B8%BE%E6%B3%A8%E5%86%8C%E8%A1%A8%E5%92%8C%E8%BF%9B%E7%A8%8B%E5%9B%9E%E8%B0%83%E4%BB%A5%E5%8F%8A%E5%8E%BB%E4%BF%9D%E6%8A%A4/"/>
    <id>http://blog.imjalen.top/2021/09/12/2021-09-12-枚举注册表和进程回调以及去保护/</id>
    <published>2021-09-11T16:00:00.000Z</published>
    <updated>2021-09-11T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="对抗注册表保护"><a href="#对抗注册表保护" class="headerlink" title="对抗注册表保护"></a>对抗注册表保护</h2><p>通过<code>CmUnRegisterCallback</code>的<code>CallbackListHead</code>全局变量，然后进行调试分析。可分析处如下截图。</p><p><img src="/assets/blog/2021-09-12-枚举注册表和进程回调以及去保护/image-20210910184503928.png" alt="image-20210910184503928"></p><a id="more"></a><p><code>CallbackListHead</code>使用了一个这样的结构体进行数据存储。</p><blockquote><p><a href="https://www.write-bug.com/article/2318.html" target="_blank" rel="noopener">https://www.write-bug.com/article/2318.html</a></p></blockquote><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">LIST_ENTRY listentry;</span><br><span class="line">ULONG64 unknown;</span><br><span class="line">LARGE_INTEGER  cookie;</span><br><span class="line">ULONG64 context;</span><br><span class="line">ULONG64 function;</span><br><span class="line">&#125;CM_NOTIFY_ENTRY,*PCM_NOTIFY_ENTRY;</span><br></pre></td></tr></table></figure><p>找到回调函数地址后</p><ol><li>进行头部patch</li><li>使用卸载函数加Cookie参数。</li><li>将CmpCallBackCount清零。</li></ol><h3 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">VOID <span class="title">EnumRegisterCallback</span><span class="params">()</span> </span>&#123;</span><br><span class="line">UNICODE_STRING apiname = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">PUCHAR apiaddr = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">PLONG64 CallbackListHead = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">PCM_NOTIFY_ENTRY tempNotifyEntry = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">PCM_NOTIFY_ENTRY pNotifyEntry = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">LONG offset = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">LARGE_INTEGER lNum[<span class="number">50</span>] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">RtlInitUnicodeString(&amp;apiname, <span class="string">L"CmUnRegisterCallback"</span>);</span><br><span class="line"></span><br><span class="line">apiaddr = MmGetSystemRoutineAddress(&amp;apiname);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!apiaddr) &#123;</span><br><span class="line">DbgPrint(<span class="string">"Not Found CmUnRegisterCallback\n"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"CmUnRegisterCallback addr %p\n"</span>, apiaddr);</span><br><span class="line"></span><br><span class="line"><span class="comment">//0B8 48 8D 0D 06 D8 C3 FF                                lea     rcx, CallbackListHead</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; <span class="number">1000</span>; i++) &#123;</span><br><span class="line"><span class="keyword">if</span> (*(apiaddr + i) == <span class="number">0x48</span> &amp;&amp; *(apiaddr + i + <span class="number">1</span>) == <span class="number">0x8D</span> &amp;&amp; *(apiaddr + i + <span class="number">2</span>) == <span class="number">0x0D</span>) &#123;</span><br><span class="line">apiaddr = apiaddr + i;</span><br><span class="line"></span><br><span class="line">offset = *(PLONG32)(apiaddr + <span class="number">3</span>);</span><br><span class="line"></span><br><span class="line">CallbackListHead = apiaddr + <span class="number">7</span> + offset;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">DbgPrint(<span class="string">"%p\n"</span>, CallbackListHead);</span><br><span class="line"></span><br><span class="line">pNotifyEntry = tempNotifyEntry = *CallbackListHead;</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (MmIsAddressValid((PVOID)(tempNotifyEntry-&gt;function))) &#123;</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"[CmRegCallBack] FuncAddr: %p,Cookie: %p\n"</span>, tempNotifyEntry-&gt;function, tempNotifyEntry-&gt;cookie.QuadPart);</span><br><span class="line"></span><br><span class="line"><span class="comment">//函数卸载</span></span><br><span class="line">lNum[i] = tempNotifyEntry-&gt;cookie;</span><br><span class="line"></span><br><span class="line">i++;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">tempNotifyEntry = tempNotifyEntry-&gt;listentry.Flink;</span><br><span class="line"></span><br><span class="line">&#125; <span class="keyword">while</span> (tempNotifyEntry-&gt;listentry.Flink != pNotifyEntry);</span><br><span class="line"></span><br><span class="line"><span class="comment">//__debugbreak();</span></span><br><span class="line"><span class="comment">//函数卸载</span></span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>;i &lt; <span class="number">50</span>;i++) &#123;</span><br><span class="line"><span class="keyword">if</span> (lNum[i].QuadPart == <span class="number">0</span>) &#123;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">CmUnRegisterCallback(lNum[i]);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="对抗进程保护"><a href="#对抗进程保护" class="headerlink" title="对抗进程保护"></a>对抗进程保护</h2><p>通过类型对象<code>POBJECT_TYPE</code>的结构进行枚举。</p><p><img src="/assets/blog/2021-09-12-枚举注册表和进程回调以及去保护/image-20210912161407400.png" alt="image-20210912161407400"></p><p>通过<code>CallbackList</code>结构体进行枚举。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1</span>: kd&gt; dt _OBJECT_TYPE</span><br><span class="line">nt!_OBJECT_TYPE</span><br><span class="line">   +<span class="number">0x000</span> TypeList         : _LIST_ENTRY</span><br><span class="line">   +<span class="number">0x010</span> Name             : _UNICODE_STRING</span><br><span class="line">   +<span class="number">0x020</span> DefaultObject    : Ptr64 Void</span><br><span class="line">   +<span class="number">0x028</span> Index            : UChar</span><br><span class="line">   +<span class="number">0x02c</span> TotalNumberOfObjects : Uint4B</span><br><span class="line">   +<span class="number">0x030</span> TotalNumberOfHandles : Uint4B</span><br><span class="line">   +<span class="number">0x034</span> HighWaterNumberOfObjects : Uint4B</span><br><span class="line">   +<span class="number">0x038</span> HighWaterNumberOfHandles : Uint4B</span><br><span class="line">   +<span class="number">0x040</span> TypeInfo         : _OBJECT_TYPE_INITIALIZER</span><br><span class="line">   +<span class="number">0x0b8</span> TypeLock         : _EX_PUSH_LOCK</span><br><span class="line">   +<span class="number">0x0c0</span> Key              : Uint4B</span><br><span class="line">   +<span class="number">0x0c8</span> CallbackList     : _LIST_ENTRY</span><br></pre></td></tr></table></figure><p>指向的结构体如下所示</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span>&#123;</span></span><br><span class="line">LIST_ENTRY listEntry;</span><br><span class="line">ULONG64unkonw;</span><br><span class="line">ULONG64 objectHead;</span><br><span class="line">ULONG64 handle;</span><br><span class="line">ULONG64 prefunc;</span><br><span class="line">ULONG64 postfunc;</span><br><span class="line">&#125;OBJECTCALLBACK,*POBJECTCALLBACK;</span><br></pre></td></tr></table></figure><p>通过链表进行遍历获取需要的数据。</p><h3 id="如何禁用回调"><a href="#如何禁用回调" class="headerlink" title="如何禁用回调"></a>如何禁用回调</h3><ul><li><p>找到handle值进行卸载</p></li><li><p>找函数地址进行patch</p></li></ul><h3 id="示例-1"><a href="#示例-1" class="headerlink" title="示例"></a>示例</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">VOID <span class="title">EnumProcessCallBack</span><span class="params">()</span> </span>&#123;</span><br><span class="line">POBJECTCALLBACK pObjectCallBack = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">POBJECTCALLBACK ptempobject = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">PULONG64 temp = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">PUCHAR pObject = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">ULONG64 ulNum[<span class="number">50</span>] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">pObject = (PUCHAR)*PsProcessType;</span><br><span class="line"></span><br><span class="line">temp = (PULONG64)(pObject + <span class="number">0x0c8</span>);</span><br><span class="line"></span><br><span class="line">ptempobject = pObjectCallBack = (POBJECTCALLBACK)*temp;</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"%p\n"</span>, pObjectCallBack);</span><br><span class="line"></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">&#123;</span><br><span class="line">DbgPrint(<span class="string">"[ProcCallBack] handle: %p,PreFunc: %p, PostFunc: %p\n"</span>, ptempobject-&gt;handle,ptempobject-&gt;prefunc, ptempobject-&gt;postfunc);</span><br><span class="line"></span><br><span class="line"><span class="comment">//卸载</span></span><br><span class="line">ulNum[i] = ptempobject-&gt;handle;</span><br><span class="line"></span><br><span class="line">i++;</span><br><span class="line"></span><br><span class="line">ptempobject = ptempobject-&gt;listEntry.Flink;</span><br><span class="line"></span><br><span class="line">&#125; <span class="keyword">while</span> (pObjectCallBack != ptempobject-&gt;listEntry.Flink);</span><br><span class="line"></span><br><span class="line"><span class="comment">//函数卸载</span></span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>;i &lt; <span class="number">50</span>;i++) &#123;</span><br><span class="line"><span class="keyword">if</span> (ulNum[i]== <span class="number">0</span>) &#123;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">ObUnRegisterCallbacks((PVOID)ulNum[i]);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="TIPS"><a href="#TIPS" class="headerlink" title="TIPS"></a>TIPS</h3><p>驱动中的偏移值是带符号的，32位使用LONG。</p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;对抗注册表保护&quot;&gt;&lt;a href=&quot;#对抗注册表保护&quot; class=&quot;headerlink&quot; title=&quot;对抗注册表保护&quot;&gt;&lt;/a&gt;对抗注册表保护&lt;/h2&gt;&lt;p&gt;通过&lt;code&gt;CmUnRegisterCallback&lt;/code&gt;的&lt;code&gt;CallbackListHead&lt;/code&gt;全局变量，然后进行调试分析。可分析处如下截图。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2021-09-12-枚举注册表和进程回调以及去保护/image-20210910184503928.png&quot; alt=&quot;image-20210910184503928&quot;&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="windows内核" scheme="http://blog.imjalen.top/categories/windows%E5%86%85%E6%A0%B8/"/>
    
    
      <category term="驱动" scheme="http://blog.imjalen.top/tags/%E9%A9%B1%E5%8A%A8/"/>
    
  </entry>
  
  <entry>
    <title>驱动编程：内核通知与进程回调例程</title>
    <link href="http://blog.imjalen.top/2021/09/10/2021-09-10-%E5%86%85%E6%A0%B8%E9%80%9A%E7%9F%A5%E4%B8%8E%E8%BF%9B%E7%A8%8B%E5%9B%9E%E8%B0%83%E4%BE%8B%E7%A8%8B/"/>
    <id>http://blog.imjalen.top/2021/09/10/2021-09-10-内核通知与进程回调例程/</id>
    <published>2021-09-09T16:00:00.000Z</published>
    <updated>2021-09-09T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="事件通知（notify）与回调（callback-的区别"><a href="#事件通知（notify）与回调（callback-的区别" class="headerlink" title="事件通知（notify）与回调（callback)的区别"></a>事件通知（notify）与回调（callback)的区别</h2><ul><li><p>通知</p><p>通知只接受结果，无法对这个结果做出改变。</p></li><li><p>回调</p><p>回调能处理反馈信息，再次处理并返回。</p></li></ul><h2 id="进程通知"><a href="#进程通知" class="headerlink" title="进程通知"></a>进程通知</h2><p>记得在<code>DriverUnload</code>函数中使用<code>TRUE</code>进行卸载。</p><a id="more"></a><h3 id="设置进程通知"><a href="#设置进程通知" class="headerlink" title="设置进程通知"></a>设置进程通知</h3><p>PsSetCreateProcessNotifyRoutine</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">status = PsSetCreateProcessNotifyRoutine(MyCreateProcessRoutine, FALSE);</span><br><span class="line"></span><br><span class="line"><span class="function">VOID <span class="title">MyCreateProcessRoutine</span><span class="params">(HANDLE ParentId, HANDLE ProcessId, BOOLEAN Create)</span> </span>&#123;</span><br><span class="line"><span class="comment">//Create = TRUE 创建进程 FALSE 结束进程</span></span><br><span class="line"><span class="keyword">if</span> (Create) &#123;</span><br><span class="line">PEPROCESStempep = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">NTSTATUSstatus = STATUS_SUCCESS;</span><br><span class="line"></span><br><span class="line"><span class="comment">//根据ProcessId返回对应的EPROCESS结构指针</span></span><br><span class="line">status = PsLookupProcessByProcessId(ProcessId, &amp;tempep);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (NT_SUCCESS(status)) &#123;</span><br><span class="line"><span class="comment">//减引用</span></span><br><span class="line">ObDereferenceObject(tempep);</span><br><span class="line"></span><br><span class="line">PCHAR imagename = PsGetProcessImageFileName(tempep);</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"pid :&lt;%d&gt; --- name: &lt;%s&gt;\n"</span>, ProcessId, imagename);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="第二个设置通知函数"><a href="#第二个设置通知函数" class="headerlink" title="第二个设置通知函数"></a>第二个设置通知函数</h3><p>PsSetCreateProcessNotifyRoutineEx</p><p>需在“项目-属性-链接器-命令行”位置添加 <code>/INTEGRITYCHECK</code> 即可。</p><blockquote><p><a href="https://xiaodaozhi.com/kernel/18.html" target="_blank" rel="noopener">https://xiaodaozhi.com/kernel/18.html</a></p></blockquote><p>PPS_CREATE_NOTIFY_INFO中的数据比较重要</p><p><a href="https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_ps_create_notify_info" target="_blank" rel="noopener">https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_ps_create_notify_info</a></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">status = PsSetCreateProcessNotifyRoutineEx((PCREATE_PROCESS_NOTIFY_ROUTINE_EX)MyCreateProcessRoutineEx, FALSE);</span><br><span class="line"></span><br><span class="line"><span class="function">VOID <span class="title">MyCreateProcessRoutineEx</span><span class="params">(PEPROCESS Process, HANDLE ProcessId, PPS_CREATE_NOTIFY_INFO CreateInfo)</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">HANDLE hParentProcessId = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">HANDLE hParentThreadId = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">HANDLE hCurrnetThreadId = <span class="literal">NULL</span>;</span><br><span class="line"><span class="comment">//获取当前的线程id</span></span><br><span class="line">hCurrnetThreadId = PsGetCurrentThreadId();</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (CreateInfo == <span class="literal">NULL</span>) &#123;</span><br><span class="line"><span class="comment">//进程结束</span></span><br><span class="line">__debugbreak();</span><br><span class="line">DbgPrint(<span class="string">" Destory hCurrnetThreadId:&lt;%d&gt;,ProcessID:&lt;%d&gt;\n"</span>, hCurrnetThreadId, ProcessId);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//__debugbreak();</span></span><br><span class="line">hParentProcessId = CreateInfo-&gt;CreatingThreadId.UniqueProcess;</span><br><span class="line">hParentThreadId = CreateInfo-&gt;CreatingThreadId.UniqueThread;</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">" Create hCurrnetThreadId:&lt;0x%x&gt;,hParentProcessId:&lt;%d&gt;,hParentThreadId:&lt;%d&gt;,ProcessID:&lt;%d&gt;, ProcessName:&lt;%wZ&gt;\n"</span>, hCurrnetThreadId, hParentProcessId, hParentThreadId, ProcessId,CreateInfo-&gt;ImageFileName);</span><br><span class="line">    <span class="comment">//子进程的线程ID，父进程的进程ID，父进程的创建子进程线程的ID，被创建的子进程的进程ID</span></span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="加载模块通知"><a href="#加载模块通知" class="headerlink" title="加载模块通知"></a>加载模块通知</h2><h3 id="设置通知"><a href="#设置通知" class="headerlink" title="设置通知"></a>设置通知</h3><p>PsSetLoadImageNotifyRoutine</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">status = PsSetLoadImageNotifyRoutine(MySetLoadImageNotifyRoutine);</span><br><span class="line"></span><br><span class="line"><span class="function">VOID <span class="title">MySetLoadImageNotifyRoutine</span><span class="params">(PUNICODE_STRING FullImageName, HANDLE ProcessId, PIMAGE_INFO ImageInfo)</span> </span>&#123;</span><br><span class="line"><span class="comment">//模块名 //加载模块的进程</span></span><br><span class="line"></span><br><span class="line">PEPROCESS tempep = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">NTSTATUS status = STATUS_SUCCESS;</span><br><span class="line"></span><br><span class="line">status = PsLookupProcessByProcessId(ProcessId, &amp;tempep);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (NT_SUCCESS(status)) &#123;</span><br><span class="line">ObDereferenceObject(tempep);</span><br><span class="line"></span><br><span class="line">PCHAR imagename = PsGetProcessImageFileName(tempep);</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"[%s] Load Image [%wZ] ,Baseaddr: [0x%x], size is [0x%llx]\n"</span>, imagename, FullImageName, ImageInfo-&gt;ImageBase, ImageInfo-&gt;ImageSize);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="卸载通知"><a href="#卸载通知" class="headerlink" title="卸载通知"></a>卸载通知</h3><p><code>PsRemoveLoadImageNotifyRoutine(MySetLoadImageNotifyRoutine)</code></p><h3 id="额外知识"><a href="#额外知识" class="headerlink" title="额外知识"></a>额外知识</h3><p>在win7系统之后，如果<code>PIMAGE_INFO-&gt;ExtendedInfoPresent</code>为1，可判断该结构体为PIMAGE_INFO_EX的成员，通过<code>CONTAINING_RECORD</code>获取EX结构体的指针。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">IMAGE_INFO_EX</span> &#123;</span></span><br><span class="line">  SIZE_T              Size;</span><br><span class="line">  IMAGE_INFO          ImageInfo;</span><br><span class="line">  <span class="class"><span class="keyword">struct</span> _<span class="title">FILE_OBJECT</span> *<span class="title">FileObject</span>;</span></span><br><span class="line">&#125; IMAGE_INFO_EX, *PIMAGE_INFO_EX;</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">VOID <span class="title">MySetLoadImageNotifyRoutine</span><span class="params">(PUNICODE_STRING FullImageName, HANDLE ProcessId, PIMAGE_INFO ImageInfo)</span> </span>&#123;</span><br><span class="line"><span class="comment">//模块名 //加载模块的进程</span></span><br><span class="line"></span><br><span class="line">PEPROCESS tempep = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">NTSTATUS status = STATUS_SUCCESS;</span><br><span class="line"></span><br><span class="line">status = PsLookupProcessByProcessId(ProcessId, &amp;tempep);</span><br><span class="line"></span><br><span class="line">PCHAR imagename = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!NT_SUCCESS(status)) &#123;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">ObDereferenceObject(tempep);</span><br><span class="line"></span><br><span class="line">imagename = PsGetProcessImageFileName(tempep);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (ImageInfo-&gt;ExtendedInfoPresent)</span><br><span class="line">&#123;</span><br><span class="line">PIMAGE_INFO_EX pInfo = CONTAINING_RECORD(ImageInfo, IMAGE_INFO_EX, ImageInfo);</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"[%s] Load Image [%wZ] ,FileObject [0x%x],Baseaddr: [0x%x], size is [0x%llx]\n"</span>, imagename, FullImageName, pInfo-&gt;FileObject,ImageInfo-&gt;ImageBase, ImageInfo-&gt;ImageSize);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"[%s] Load Image [%wZ] ,Baseaddr: [0x%x], size is [0x%llx]\n"</span>, imagename, FullImageName, ImageInfo-&gt;ImageBase, ImageInfo-&gt;ImageSize);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="线程通知"><a href="#线程通知" class="headerlink" title="线程通知"></a>线程通知</h2><h3 id="创建"><a href="#创建" class="headerlink" title="创建"></a>创建</h3><p>PsSetCreateThreadNotifyRoutine()</p><h3 id="卸载"><a href="#卸载" class="headerlink" title="卸载"></a>卸载</h3><p>PsRemoveCreateThreadNotifyRoutine()</p><h3 id="事例"><a href="#事例" class="headerlink" title="事例"></a>事例</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">status = PsSetCreateThreadNotifyRoutine(MyCreateThreadNotifyRoutine);</span><br><span class="line"></span><br><span class="line"><span class="function">VOID <span class="title">MyCreateThreadNotifyRoutine</span><span class="params">(HANDLE ProcessId, HANDLE ThreadId, BOOLEAN Create)</span> </span>&#123;</span><br><span class="line">NTSTATUS status;</span><br><span class="line"></span><br><span class="line">PEPROCESS tempep = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">status = PsLookupProcessByProcessId(ProcessId, &amp;tempep);</span><br><span class="line"></span><br><span class="line">PCHAR imagefilename;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (NT_SUCCESS(status)) &#123;</span><br><span class="line">imagefilename = PsGetProcessImageFileName(tempep);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (Create) &#123;</span><br><span class="line">DbgPrint(<span class="string">"[%s] Create Thread [%d]\n"</span>, imagefilename, ThreadId);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">DbgPrint(<span class="string">"[%s] Destory Thread [%d]\n"</span>, imagefilename, ThreadId);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="枚举进程通知例程"><a href="#枚举进程通知例程" class="headerlink" title="枚举进程通知例程"></a>枚举进程通知例程</h2><p>通过pchunter我们可以看到各种通知例程，那么是如何实现的了。</p><p>需要去逆向<code>PsSetCreateThreadNotifyRoutine</code>。</p><p>该函数例程通过这个一个PspCreateProcessNotifyRoutine表进行访问，该地址和<code>0xFFFFFFFFFFFFFFF8</code>进行与运算得到通知例程地址。（原因放到<strong>额外解析</strong>）</p><p>通过获取PsSetCreateThreadNotifyRoutine的地址，根据偏移找到<code>PspCreateProcessNotifyRoutine</code>，然后搜索特征码<code>4C 8D 2D 9F 93 D4 FF   lea     r13, PspCreateProcessNotifyRoutine</code>,得到通知例程表的地址。</p><p>查看XXXXCount的全局变量，可获得通知例程的数量。</p><p><img src="/assets/blog/2021-09-10-内核通知与进程回调例程/image-20210908170028897.png" alt="image-20210908170028897"></p><h3 id="摘取通知"><a href="#摘取通知" class="headerlink" title="摘取通知"></a>摘取通知</h3><ol><li><p>通过遍历数组，直接使用对应的函数即可摘去掉通知例程。</p></li><li><p>修改<code>PspNotifyEnableMask</code>的值，<strong>只能停掉已经注册的通知</strong></p><p>PspNotifyEnableMask在win10 1903中的原始值为<code>F</code>对应二进制1111</p><p>第三位 CreateThread、</p><p>第一位和第二位分别是 CreateProcess(分别是PsSetCreateThreadNotifyRoutine和PsSetCreateThreadNotifyRoutineEx)，测试了下随便开一个都行。</p><p>第零位 LoadImage 。</p><blockquote><p>代码样例 </p><p><a href="https://www.unknowncheats.me/forum/anti-cheat-bypass/285491-pspnotifyenablemask-tricks-explained.html" target="_blank" rel="noopener">https://www.unknowncheats.me/forum/anti-cheat-bypass/285491-pspnotifyenablemask-tricks-explained.html</a></p></blockquote></li></ol><h3 id="例子"><a href="#例子" class="headerlink" title="例子"></a>例子</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">VOID <span class="title">FindProcessNotify</span><span class="params">()</span> </span>&#123;</span><br><span class="line">UNICODE_STRING apiname = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">PUCHARapiaddr = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">LONG offset = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">PULONG64 PspCreateProcessNotifyRoutine = <span class="literal">NULL</span>;</span><br><span class="line">RtlInitUnicodeString(&amp;apiname, <span class="string">L"PsSetCreateThreadNotifyRoutine"</span>);</span><br><span class="line"></span><br><span class="line">apiaddr = MmGetSystemRoutineAddress(&amp;apiname);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!apiaddr) &#123;</span><br><span class="line">DbgPrint(<span class="string">"Not Found\n"</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//__debugbreak();</span></span><br><span class="line">DbgPrint(<span class="string">"PsSetCreateThreadNotifyRoutine Addr :0x%llp\n"</span>, (PVOID)apiaddr);</span><br><span class="line"></span><br><span class="line">apiaddr = apiaddr + <span class="number">6</span>;</span><br><span class="line"></span><br><span class="line">offset = *(PULONG)(apiaddr + <span class="number">1</span>);</span><br><span class="line"><span class="comment">// E8 65 00 00 00                                      call    PspSetCreateThreadNotifyRoutine</span></span><br><span class="line">apiaddr = apiaddr + offset + <span class="number">5</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//4C 8D 2D 9F 93 D4 FF   lea     r13, PspCreateProcessNotifyRoutine</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; <span class="number">1000</span>; i++) &#123;</span><br><span class="line"><span class="keyword">if</span> (*(apiaddr + i) == <span class="number">0x4c</span> &amp;&amp; *(apiaddr + i + <span class="number">1</span>) == <span class="number">0x8D</span> &amp;&amp; *(apiaddr + i + <span class="number">2</span>) == <span class="number">0x2D</span>) &#123;</span><br><span class="line">apiaddr = apiaddr + i;</span><br><span class="line"></span><br><span class="line">offset = *(PLONG)(apiaddr + <span class="number">3</span>);</span><br><span class="line"></span><br><span class="line">PspCreateProcessNotifyRoutine = apiaddr + offset + <span class="number">7</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"Routine Nums Addr ：%p\n"</span>, PspCreateProcessNotifyRoutine);</span><br><span class="line"><span class="comment">//__debugbreak();</span></span><br><span class="line"></span><br><span class="line">PULONG64 reallyNotify = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">ULONG64 RoutineNotify = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">NTSTATUS status = STATUS_SUCCESS;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; <span class="number">64</span>; i++) &#123;</span><br><span class="line"></span><br><span class="line">reallyNotify = (ULONG64)(PspCreateProcessNotifyRoutine) + i*<span class="number">8</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (*reallyNotify == <span class="number">0</span>)</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">RoutineNotify = *(PULONG64)(*reallyNotify &amp; <span class="number">0xFFFFFFFFFFFFFFF8</span>);</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"CreateProcess Routine Notify:0x%p\n"</span>, RoutineNotify);</span><br><span class="line"></span><br><span class="line"><span class="comment">//摘除</span></span><br><span class="line"><span class="keyword">if</span> (MmIsAddressValid(*reallyNotify)) &#123;</span><br><span class="line">DbgPrint(<span class="string">"1\n"</span>);</span><br><span class="line">status = PsSetCreateProcessNotifyRoutine((PVOID)RoutineNotify,TRUE);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (NT_SUCCESS(status))</span><br><span class="line">&#123;</span><br><span class="line">DbgPrint(<span class="string">"Remove CreateProcess Notify :0x%p\n"</span>, RoutineNotify);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="其他枚举"><a href="#其他枚举" class="headerlink" title="其他枚举"></a>其他枚举</h3><p>例如枚举线程通知例程，通过IDA就可以看到存放通知例程的数组地址。同样也要使用0xFFFFFFFFFFFFFFF8进行解密。</p><p><img src="/assets/blog/2021-09-10-内核通知与进程回调例程/image-20210908165533326.png" alt="image-20210908165533326"></p><h2 id="注册表回调"><a href="#注册表回调" class="headerlink" title="注册表回调"></a>注册表回调</h2><h3 id="注册表回调注册"><a href="#注册表回调注册" class="headerlink" title="注册表回调注册"></a>注册表回调注册</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">LARGE_INTEGER g_cookie = &#123; <span class="number">0</span> &#125;;</span><br><span class="line">CmRegisterCallback(_In_     PEX_CALLBACK_FUNCTION Function,</span><br><span class="line">                   _In_opt_ PVOID                 Context,</span><br><span class="line">                   _Out_    PLARGE_INTEGER        Cookie</span><br><span class="line">                    );</span><br></pre></td></tr></table></figure><h3 id="回调函数卸载"><a href="#回调函数卸载" class="headerlink" title="回调函数卸载"></a>回调函数卸载</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CmUnRegisterCallback(g_cookie);</span><br></pre></td></tr></table></figure><h3 id="回调函数模型"><a href="#回调函数模型" class="headerlink" title="回调函数模型"></a>回调函数模型</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">NTSTATUS <span class="title">RregistryCallback</span><span class="params">(PVOID CallbackContext, PVOID Argument1, PVOID Argument2)</span></span></span><br></pre></td></tr></table></figure><ul><li>第一个参数 传递的参数</li><li>第二个参数 注册表类型</li><li>第三个参数 REG_XXXX_INFORMATION 结构体</li></ul><p>通过注册表的类型判断，进行分发处理，通过结构体的不同成员对象进行判断拦截。</p><h3 id="例子-1"><a href="#例子-1" class="headerlink" title="例子"></a>例子</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">NTSTATUS <span class="title">RregistryCallback</span><span class="params">(PVOID CallbackContext, PVOID Argument1, PVOID Argument2)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">NTSTATUS status = STATUS_SUCCESS;</span><br><span class="line"></span><br><span class="line"><span class="keyword">switch</span> ((REG_NOTIFY_CLASS)Argument1)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">case</span> RegNtPreOpenKey:</span><br><span class="line"><span class="keyword">case</span> RegNtPreOpenKeyEx:</span><br><span class="line"><span class="keyword">case</span> RegNtPreCreateKey:</span><br><span class="line"><span class="keyword">case</span> RegNtPreCreateKeyEx:</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//DbgPrint("Create Key or Open Key\n");</span></span><br><span class="line"></span><br><span class="line">PREG_CREATE_KEY_INFORMATIONpkeyinfo = (PREG_CREATE_KEY_INFORMATION)Argument2;</span><br><span class="line"></span><br><span class="line">UNICODE_STRING tempservice = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"><span class="comment">//不过过滤大小写的话，必须大写 ，过滤注册表创建</span></span><br><span class="line">RtlInitUnicodeString(&amp;tempservice,<span class="string">L"SYSTEM\\CONTROLSET001\\SERVICES\\*"</span>);</span><br><span class="line"></span><br><span class="line">__try</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//打印注册表路径</span></span><br><span class="line"><span class="comment">//DbgPrint("key info [%wZ]\n", pkeyinfo-&gt;CompleteName);</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="keyword">if</span> (FsRtlIsNameInExpression(&amp;tempservice, pkeyinfo-&gt;CompleteName, TRUE, <span class="literal">NULL</span>)) &#123;</span><br><span class="line">DbgPrint(<span class="string">"Bad Create\n"</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//通过匹配字符串，注册表的拦截</span></span><br><span class="line">status = STATUS_ACCESS_DENIED;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">__except (<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">DbgPrint(<span class="string">"Bad Memory\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">default</span>:</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> status;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="进程回调"><a href="#进程回调" class="headerlink" title="进程回调"></a>进程回调</h2><blockquote><p><a href="https://revers.engineering/superseding-driver-altitude-checks-on" target="_blank" rel="noopener">https://revers.engineering/superseding-driver-altitude-checks-on</a></p></blockquote><p>内核当中的对象描述了具体的事物（窗口，进程，驱动，。。。。）。</p><p>回调就是将一个对象和一种操作进行绑定，当该对象进行这种操作的时候必然会调用这个操作，这个操作就是回调。</p><p>因为微软的<code>MmVerifyCallbackFunction</code>强制要求下必须要使用数字签名才能进行使用回调函数所以修改如下：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">KLDR_DATA_TABLE_ENTRY</span> &#123;</span></span><br><span class="line">LIST_ENTRY InLoadOrderLinks;</span><br><span class="line">PVOID ExceptionTable;</span><br><span class="line">ULONG ExceptionTableSize;</span><br><span class="line">PVOID GpValue;</span><br><span class="line">PVOID NonPagedDebugInfo;</span><br><span class="line">PVOID DllBase;</span><br><span class="line">PVOID EntryPoint;</span><br><span class="line">ULONG SizeOfImage;</span><br><span class="line">UNICODE_STRING FullDllName;</span><br><span class="line">UNICODE_STRING BaseDllName;</span><br><span class="line">ULONG Flags;</span><br><span class="line">USHORT LoadCount;</span><br><span class="line">USHORT __Unused;</span><br><span class="line">PVOID SectionPointer;</span><br><span class="line">ULONG CheckSum;</span><br><span class="line">PVOID LoadedImports;</span><br><span class="line">PVOID PatchInformation;</span><br><span class="line">&#125; KLDR_DATA_TABLE_ENTRY, * PKLDR_DATA_TABLE_ENTRY;</span><br><span class="line"></span><br><span class="line"><span class="function">NTSTATUS <span class="title">DriverEntry</span><span class="params">(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    PKLDR_DATA_TABLE_ENTRY DriverSection = (PKLDR_DATA_TABLE_ENTRY)pDriverObject-&gt;DriverSection;</span><br><span class="line"></span><br><span class="line">    DriverSection-&gt;Flags |= LDRP_VALID_SECTION;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="注册回调"><a href="#注册回调" class="headerlink" title="注册回调"></a>注册回调</h3><p>使用<code>ObRegisterCallbacks</code>注册回调。</p><p>使用<code>OB_CALLBACK_REGISTRATION</code>结构体</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">OB_CALLBACK_REGISTRATION</span> &#123;</span></span><br><span class="line">    _In_ USHORT                     Version; <span class="comment">//版本</span></span><br><span class="line">    _In_ USHORT                     OperationRegistrationCount; <span class="comment">//回调的个数</span></span><br><span class="line">    _In_ UNICODE_STRING             Altitude; <span class="comment">//高度</span></span><br><span class="line">    _In_ PVOID                      RegistrationContext; <span class="comment">//传给回调的参数</span></span><br><span class="line">    _In_ OB_OPERATION_REGISTRATION  *OperationRegistration; <span class="comment">//指向回调注册结构体的指针</span></span><br><span class="line">&#125; OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION;</span><br></pre></td></tr></table></figure><blockquote><p><a href="https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_ob_operation_registration" target="_blank" rel="noopener">https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_ob_operation_registration</a></p></blockquote><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">OB_OPERATION_REGISTRATION</span> &#123;</span></span><br><span class="line">    _In_ POBJECT_TYPE                *ObjectType; <span class="comment">//回调例程的对象类型的指针</span></span><br><span class="line">    _In_ OB_OPERATION                Operations; <span class="comment">//句柄操作类型</span></span><br><span class="line">    _In_ POB_PRE_OPERATION_CALLBACK  PreOperation; <span class="comment">//前操作函数指针</span></span><br><span class="line">    _In_ POB_POST_OPERATION_CALLBACK PostOperation; <span class="comment">//后操作函数指针</span></span><br><span class="line">&#125; OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION;</span><br></pre></td></tr></table></figure><p>ObjectType有多种类型,包括进程，线程，注册表等。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">extern</span> POBJECT_TYPE *CmKeyObjectType;</span><br><span class="line"><span class="keyword">extern</span> POBJECT_TYPE *IoFileObjectType;</span><br><span class="line"><span class="keyword">extern</span> POBJECT_TYPE *ExEventObjectType;</span><br><span class="line"><span class="keyword">extern</span> POBJECT_TYPE *ExSemaphoreObjectType;</span><br><span class="line"><span class="keyword">extern</span> POBJECT_TYPE *TmTransactionManagerObjectType;</span><br><span class="line"><span class="keyword">extern</span> POBJECT_TYPE *TmResourceManagerObjectType;</span><br><span class="line"><span class="keyword">extern</span> POBJECT_TYPE *TmEnlistmentObjectType;</span><br><span class="line"><span class="keyword">extern</span> POBJECT_TYPE *TmTransactionObjectType;</span><br><span class="line"><span class="keyword">extern</span> POBJECT_TYPE *PsProcessType;</span><br><span class="line"><span class="keyword">extern</span> POBJECT_TYPE *PsThreadType;</span><br><span class="line"><span class="keyword">extern</span> POBJECT_TYPE *PsJobType;</span><br><span class="line"><span class="keyword">extern</span> POBJECT_TYPE *SeTokenObjectType;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">if</span> (NTDDI_VERSION &gt;= NTDDI_THRESHOLD)</span></span><br><span class="line"><span class="keyword">extern</span> POBJECT_TYPE *ExDesktopObjectType;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br></pre></td></tr></table></figure><h3 id="事例-1"><a href="#事例-1" class="headerlink" title="事例"></a>事例</h3><h4 id="回调注册"><a href="#回调注册" class="headerlink" title="回调注册"></a>回调注册</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">NTSTATUS <span class="title">RegProcessCallBack</span><span class="params">(PDRIVER_OBJECT pDriverObject)</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">NTSTATUS status = STATUS_SUCCESS;</span><br><span class="line"><span class="comment">//进程对象回调</span></span><br><span class="line"><span class="comment">//https://revers.engineering/superseding-driver-altitude-checks-on</span></span><br><span class="line">PKLDR_DATA_TABLE_ENTRY pLdr = (PKLDR_DATA_TABLE_ENTRY)pDriverObject-&gt;DriverSection;</span><br><span class="line"></span><br><span class="line">pLdr-&gt;Flags |= LDRP_VALID_SECTION;</span><br><span class="line"></span><br><span class="line">OB_CALLBACK_REGISTRATION ob = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">OB_OPERATION_REGISTRATION oor = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">//高度,谁注册的高先通知谁,高度合适就行</span></span><br><span class="line">UNICODE_STRING attde = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"><span class="comment">//注册回调版本</span></span><br><span class="line">ob.Version = ObGetFilterVersion();</span><br><span class="line"><span class="comment">//OperationRegistration的条数</span></span><br><span class="line">ob.OperationRegistrationCount = <span class="number">1</span>;</span><br><span class="line"><span class="comment">//数组指针</span></span><br><span class="line">ob.OperationRegistration = &amp;oor;</span><br><span class="line"><span class="comment">//高度</span></span><br><span class="line">RtlInitUnicodeString(&amp;attde, <span class="string">L"321999"</span>);</span><br><span class="line">ob.Altitude = attde;</span><br><span class="line"><span class="comment">//参数</span></span><br><span class="line">ob.RegistrationContext = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//指向触发回调例程的对象类型的指针</span></span><br><span class="line">oor.ObjectType = PsProcessType;</span><br><span class="line"><span class="comment">//标志位</span></span><br><span class="line"><span class="comment">//打开，复制句柄</span></span><br><span class="line">oor.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;</span><br><span class="line"><span class="comment">//前操作例程</span></span><br><span class="line">oor.PreOperation = PreOperation_Process;</span><br><span class="line"><span class="comment">//后操作例程</span></span><br><span class="line">oor.PostOperation = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">status = ObRegisterCallbacks(&amp;ob, &amp;ProcessCallBackHandle);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> status;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="回调操作"><a href="#回调操作" class="headerlink" title="回调操作"></a>回调操作</h4><p>保护带有calc的进程名被操作。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">OB_PREOP_CALLBACK_STATUS   <span class="title">PreOperation_Process</span><span class="params">(PVOID RegistrationContext,</span></span></span><br><span class="line"><span class="function"><span class="params">POB_PRE_OPERATION_INFORMATION OperationInformation)</span> </span>&#123;</span><br><span class="line"><span class="comment">//操作的是进程对象</span></span><br><span class="line"></span><br><span class="line">OB_PREOP_CALLBACK_STATUS status = OB_PREOP_SUCCESS;</span><br><span class="line"></span><br><span class="line">PUCHAR imagefilename = PsGetProcessImageFileName(OperationInformation-&gt;Object);</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"Process Name : [%s]\n"</span>, imagefilename);</span><br><span class="line"></span><br><span class="line"><span class="comment">//保护带有calc的进程。</span></span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">strstr</span>(imagefilename, <span class="string">"calc"</span>)) &#123;</span><br><span class="line"><span class="comment">//__debugbreak();</span></span><br><span class="line"><span class="comment">//https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_ob_pre_create_handle_information</span></span><br><span class="line">OperationInformation-&gt;Parameters-&gt;CreateHandleInformation.DesiredAccess = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">OperationInformation-&gt;Parameters-&gt;DuplicateHandleInformation.DesiredAccess = <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span>  status;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="线程回调"><a href="#线程回调" class="headerlink" title="线程回调"></a>线程回调</h2><h3 id="回调注册-1"><a href="#回调注册-1" class="headerlink" title="回调注册"></a>回调注册</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">NTSTATUS <span class="title">RegThreadCallBack</span><span class="params">(PDRIVER_OBJECT pDriverObject)</span> </span>&#123;</span><br><span class="line">NTSTATUS status = STATUS_SUCCESS;</span><br><span class="line"></span><br><span class="line">PKLDR_DATA_TABLE_ENTRY pLdr = (PKLDR_DATA_TABLE_ENTRY)pDriverObject-&gt;DriverSection;</span><br><span class="line"></span><br><span class="line">pLdr-&gt;Flags |= LDRP_VALID_SECTION;</span><br><span class="line"></span><br><span class="line">OB_CALLBACK_REGISTRATION ob = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">OB_OPERATION_REGISTRATION oor = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">UNICODE_STRING altitude = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">RtlInitUnicodeString(&amp;altitude, <span class="string">L"319999"</span>);</span><br><span class="line"></span><br><span class="line">ob.Version = ObGetFilterVersion();</span><br><span class="line"></span><br><span class="line">ob.OperationRegistrationCount = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">ob.RegistrationContext = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">ob.Altitude = altitude;</span><br><span class="line"></span><br><span class="line">ob.OperationRegistration = &amp;oor;</span><br><span class="line"></span><br><span class="line">oor.ObjectType = PsThreadType;</span><br><span class="line"></span><br><span class="line">oor.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;</span><br><span class="line"></span><br><span class="line">oor.PreOperation = PreOperation_Thread;</span><br><span class="line"></span><br><span class="line">oor.PostOperation = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">ObRegisterCallbacks(&amp;ob, &amp;ThreadCallBackHandle);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> status;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="回调操作-1"><a href="#回调操作-1" class="headerlink" title="回调操作"></a>回调操作</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">OB_PREOP_CALLBACK_STATUS <span class="title">PreOperation_Thread</span><span class="params">(PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION OperationInformation)</span> </span>&#123;</span><br><span class="line">OB_PREOP_CALLBACK_STATUS status = OB_PREOP_SUCCESS;</span><br><span class="line"></span><br><span class="line">PETHREAD pthread = OperationInformation-&gt;Object;</span><br><span class="line"></span><br><span class="line">HANDLE ThreadId = PsGetThreadId(pthread);</span><br><span class="line"></span><br><span class="line">PEPROCESS peprocess = PsGetThreadProcess(pthread);</span><br><span class="line"></span><br><span class="line">PUCHAR imagefilename = PsGetProcessImageFileName(peprocess);</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"Process Name : [%s] CreateThread [%d] \n"</span>, imagefilename, ThreadId);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">strstr</span>(imagefilename, <span class="string">"calc"</span>)) &#123;</span><br><span class="line"><span class="keyword">if</span> (OperationInformation-&gt;Operation == OB_OPERATION_HANDLE_CREATE) &#123;</span><br><span class="line"><span class="keyword">if</span> ((OperationInformation-&gt;Parameters-&gt;CreateHandleInformation.DesiredAccess &amp; PROCESS_CREATE_THREAD) == PROCESS_CREATE_THREAD)&#123;</span><br><span class="line">DbgPrint(<span class="string">"Calc Create Thread Failed\n"</span>);</span><br><span class="line"></span><br><span class="line">OperationInformation-&gt;Parameters-&gt;CreateHandleInformation.DesiredAccess = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">status = STATUS_UNSUCCESSFUL;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> status;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Ps函数"><a href="#Ps函数" class="headerlink" title="Ps函数"></a>Ps函数</h2><h3 id="PsLookupProcessByProcessId"><a href="#PsLookupProcessByProcessId" class="headerlink" title="PsLookupProcessByProcessId"></a>PsLookupProcessByProcessId</h3><p>根据ProcessId获取EPROCESS指针。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">PEPROCESS tempep = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">NTSTATUS status = STATUS_SUCCESS;</span><br><span class="line"></span><br><span class="line">status = PsLookupProcessByProcessId(ProcessId, &amp;tempep);</span><br></pre></td></tr></table></figure><h3 id="PsGetProcessImageFileName"><a href="#PsGetProcessImageFileName" class="headerlink" title="PsGetProcessImageFileName"></a>PsGetProcessImageFileName</h3><p>根据EPROCESS指针获取模块名字。 </p><h3 id="PsGetThreadProcess"><a href="#PsGetThreadProcess" class="headerlink" title="PsGetThreadProcess"></a>PsGetThreadProcess</h3><p>根据ETHREAD指针获取PEPROCESS结构体指针。</p><h2 id="Fs函数"><a href="#Fs函数" class="headerlink" title="Fs函数"></a>Fs函数</h2><h3 id="FsRtlIsNameInExpression"><a href="#FsRtlIsNameInExpression" class="headerlink" title="FsRtlIsNameInExpression"></a>FsRtlIsNameInExpression</h3><p>字符正则匹配</p><h2 id="Mm函数"><a href="#Mm函数" class="headerlink" title="Mm函数"></a>Mm函数</h2><h3 id="MmIsAddressValid"><a href="#MmIsAddressValid" class="headerlink" title="MmIsAddressValid"></a>MmIsAddressValid</h3><p>验证地址是否可用</p><h2 id="额外解析"><a href="#额外解析" class="headerlink" title="额外解析"></a>额外解析</h2><h3 id="PsSetCreateProcessNotifyRoutine解析"><a href="#PsSetCreateProcessNotifyRoutine解析" class="headerlink" title="PsSetCreateProcessNotifyRoutine解析"></a>PsSetCreateProcessNotifyRoutine解析</h3><p>PsSetCreateProcessNotifyRoutine的本质函数是PspSetCreateThreadNotifyRoutine。</p><p><img src="/assets/blog/2021-09-10-内核通知与进程回调例程/image-20210908114920571.png" alt="image-20210908114920571"></p><p>使用windbg查表，如图所示。取的全局变量地址是一个指向函数地址的地址表，然后末4位清零，再偏移8得到通知例程地址，与pchunter中看到的地址一致，</p><p><img src="/assets/blog/2021-09-10-内核通知与进程回调例程/image-20210908120140908.png" alt="image-20210908120140908"></p><h4 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h4><p>通过分析得知，会对通知历程的地址表进行遍历，会对<code>ExCompareExchangeCallBack</code>传入参数。</p><p><code>ExAllocateCallBack</code>则是对一个结构体使用的传参进行初始化</p><p><img src="/assets/blog/2021-09-10-内核通知与进程回调例程/image-20210908120553057.png" alt="image-20210908120553057"></p><p><code>ExCompareExchangeCallBack</code>会对地址进行校验如果为空则对地址数值进行计算和对数组进行赋值。</p><ul><li>第一个参数地址为PspCreateProcessNotifyRoutine的数组地址</li><li>第二个为有通知函数的结构体地址</li><li>第三个0</li></ul><p><img src="/assets/blog/2021-09-10-内核通知与进程回调例程/image-20210908120407770.png" alt="image-20210908120407770"></p><p><code>ExCompareExchangeCallBack</code></p><p><code>ExAllocatePoolWithTag</code>在64位系统中对齐到16字节边界,所以地址是<code>0xXXXXXXXXXXXXXXX0</code>.</p><p>地址加上0xF进行赋值。<code>0xXXXXXXXXXXXXXXXF</code></p><p><img src="/assets/blog/2021-09-10-内核通知与进程回调例程/image-20210908124847016.png" alt="image-20210908124847016"></p><h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>所以通知例程的地址就是 (数组地址&amp;0xFFFFFFFFFFFFFFF0)+0x8 = 数组地址 &amp; 0xFFFFFFFFFFFFFFF8。</p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;事件通知（notify）与回调（callback-的区别&quot;&gt;&lt;a href=&quot;#事件通知（notify）与回调（callback-的区别&quot; class=&quot;headerlink&quot; title=&quot;事件通知（notify）与回调（callback)的区别&quot;&gt;&lt;/a&gt;事件通知（notify）与回调（callback)的区别&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;通知&lt;/p&gt;
&lt;p&gt;通知只接受结果，无法对这个结果做出改变。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;回调&lt;/p&gt;
&lt;p&gt;回调能处理反馈信息，再次处理并返回。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;进程通知&quot;&gt;&lt;a href=&quot;#进程通知&quot; class=&quot;headerlink&quot; title=&quot;进程通知&quot;&gt;&lt;/a&gt;进程通知&lt;/h2&gt;&lt;p&gt;记得在&lt;code&gt;DriverUnload&lt;/code&gt;函数中使用&lt;code&gt;TRUE&lt;/code&gt;进行卸载。&lt;/p&gt;
    
    </summary>
    
      <category term="windows内核" scheme="http://blog.imjalen.top/categories/windows%E5%86%85%E6%A0%B8/"/>
    
    
      <category term="驱动" scheme="http://blog.imjalen.top/tags/%E9%A9%B1%E5%8A%A8/"/>
    
  </entry>
  
  <entry>
    <title>Windows系统调用</title>
    <link href="http://blog.imjalen.top/2021/09/08/2021-09-08-Windows%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8/"/>
    <id>http://blog.imjalen.top/2021/09/08/2021-09-08-Windows系统调用/</id>
    <published>2021-09-07T16:00:00.000Z</published>
    <updated>2021-09-07T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="系统调用备份，后面填坑，现在做备份"><a href="#系统调用备份，后面填坑，现在做备份" class="headerlink" title="系统调用备份，后面填坑，现在做备份"></a>系统调用备份，后面填坑，现在做备份</h3><h2 id="Win10-1903-x64"><a href="#Win10-1903-x64" class="headerlink" title="Win10 1903 x64"></a>Win10 1903 x64</h2><blockquote><p><a href="https://www.matteomalvica.com/minutes/windows_kernel/#nt-kisystemcall64shadow-under-the-miscroscope" target="_blank" rel="noopener">https://www.matteomalvica.com/minutes/windows_kernel/#nt-kisystemcall64shadow-under-the-miscroscope</a></p><p><a href="https://mirokaku.github.io/Blog/2017/2-System-Call/" target="_blank" rel="noopener">https://mirokaku.github.io/Blog/2017/2-System-Call/</a></p></blockquote><h3 id="KiSystemCall64"><a href="#KiSystemCall64" class="headerlink" title="KiSystemCall64"></a>KiSystemCall64</h3><p>调用 <code>KiSystemServiceUser</code>,通过访问SSDT表，获取函数地址。</p><a id="more"></a><figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br><span class="line">592</span><br><span class="line">593</span><br><span class="line">594</span><br><span class="line">595</span><br><span class="line">596</span><br><span class="line">597</span><br><span class="line">598</span><br><span class="line">599</span><br><span class="line">600</span><br><span class="line">601</span><br><span class="line">602</span><br><span class="line">603</span><br><span class="line">604</span><br><span class="line">605</span><br><span class="line">606</span><br><span class="line">607</span><br><span class="line">608</span><br><span class="line">609</span><br><span class="line">610</span><br><span class="line">611</span><br><span class="line">612</span><br><span class="line">613</span><br><span class="line">614</span><br><span class="line">615</span><br><span class="line">616</span><br><span class="line">617</span><br><span class="line">618</span><br><span class="line">619</span><br><span class="line">620</span><br><span class="line">621</span><br><span class="line">622</span><br><span class="line">623</span><br><span class="line">624</span><br><span class="line">625</span><br><span class="line">626</span><br><span class="line">627</span><br><span class="line">628</span><br><span class="line">629</span><br><span class="line">630</span><br><span class="line">631</span><br><span class="line">632</span><br><span class="line">633</span><br><span class="line">634</span><br><span class="line">635</span><br><span class="line">636</span><br><span class="line">637</span><br><span class="line">638</span><br><span class="line">639</span><br><span class="line">640</span><br><span class="line">641</span><br><span class="line">642</span><br><span class="line">643</span><br><span class="line">644</span><br><span class="line">645</span><br><span class="line">646</span><br><span class="line">647</span><br><span class="line">648</span><br><span class="line">649</span><br><span class="line">650</span><br><span class="line">651</span><br><span class="line">652</span><br><span class="line">653</span><br><span class="line">654</span><br><span class="line">655</span><br><span class="line">656</span><br><span class="line">657</span><br><span class="line">658</span><br><span class="line">659</span><br><span class="line">660</span><br><span class="line">661</span><br><span class="line">662</span><br><span class="line">663</span><br><span class="line">664</span><br><span class="line">665</span><br><span class="line">666</span><br><span class="line">667</span><br><span class="line">668</span><br><span class="line">669</span><br><span class="line">670</span><br><span class="line">671</span><br><span class="line">672</span><br><span class="line">673</span><br><span class="line">674</span><br><span class="line">675</span><br><span class="line">676</span><br><span class="line">677</span><br><span class="line">678</span><br><span class="line">679</span><br><span class="line">680</span><br><span class="line">681</span><br><span class="line">682</span><br><span class="line">683</span><br><span class="line">684</span><br><span class="line">685</span><br><span class="line">686</span><br><span class="line">687</span><br><span class="line">688</span><br><span class="line">689</span><br><span class="line">690</span><br><span class="line">691</span><br><span class="line">692</span><br><span class="line">693</span><br><span class="line">694</span><br><span class="line">695</span><br><span class="line">696</span><br><span class="line">697</span><br><span class="line">698</span><br><span class="line">699</span><br><span class="line">700</span><br><span class="line">701</span><br><span class="line">702</span><br><span class="line">703</span><br><span class="line">704</span><br><span class="line">705</span><br><span class="line">706</span><br><span class="line">707</span><br><span class="line">708</span><br><span class="line">709</span><br><span class="line">710</span><br><span class="line">711</span><br><span class="line">712</span><br><span class="line">713</span><br><span class="line">714</span><br><span class="line">715</span><br><span class="line">716</span><br><span class="line">717</span><br><span class="line">718</span><br><span class="line">719</span><br><span class="line">720</span><br><span class="line">721</span><br><span class="line">722</span><br><span class="line">723</span><br><span class="line">724</span><br><span class="line">725</span><br><span class="line">726</span><br><span class="line">727</span><br><span class="line">728</span><br><span class="line">729</span><br><span class="line">730</span><br><span class="line">731</span><br><span class="line">732</span><br><span class="line">733</span><br><span class="line">734</span><br><span class="line">735</span><br><span class="line">736</span><br><span class="line">737</span><br><span class="line">738</span><br><span class="line">739</span><br><span class="line">740</span><br><span class="line">741</span><br><span class="line">742</span><br><span class="line">743</span><br><span class="line">744</span><br><span class="line">745</span><br><span class="line">746</span><br><span class="line">747</span><br><span class="line">748</span><br><span class="line">749</span><br><span class="line">750</span><br><span class="line">751</span><br><span class="line">752</span><br><span class="line">753</span><br><span class="line">754</span><br><span class="line">755</span><br><span class="line">756</span><br><span class="line">757</span><br><span class="line">758</span><br><span class="line">759</span><br><span class="line">760</span><br><span class="line">761</span><br><span class="line">762</span><br><span class="line">763</span><br><span class="line">764</span><br><span class="line">765</span><br><span class="line">766</span><br><span class="line">767</span><br><span class="line">768</span><br><span class="line">769</span><br><span class="line">770</span><br><span class="line">771</span><br><span class="line">772</span><br><span class="line">773</span><br><span class="line">774</span><br><span class="line">775</span><br><span class="line">776</span><br><span class="line">777</span><br><span class="line">778</span><br><span class="line">779</span><br><span class="line">780</span><br><span class="line">781</span><br><span class="line">782</span><br><span class="line">783</span><br><span class="line">784</span><br><span class="line">785</span><br><span class="line">786</span><br><span class="line">787</span><br><span class="line">788</span><br><span class="line">789</span><br><span class="line">790</span><br><span class="line">791</span><br><span class="line">792</span><br><span class="line">793</span><br><span class="line">794</span><br><span class="line">795</span><br><span class="line">796</span><br><span class="line">797</span><br><span class="line">798</span><br><span class="line">799</span><br><span class="line">800</span><br><span class="line">801</span><br><span class="line">802</span><br><span class="line">803</span><br><span class="line">804</span><br><span class="line">805</span><br><span class="line">806</span><br><span class="line">807</span><br><span class="line">808</span><br><span class="line">809</span><br><span class="line">810</span><br><span class="line">811</span><br><span class="line">812</span><br><span class="line">813</span><br><span class="line">814</span><br><span class="line">815</span><br><span class="line">816</span><br><span class="line">817</span><br><span class="line">818</span><br><span class="line">819</span><br><span class="line">820</span><br><span class="line">821</span><br><span class="line">822</span><br><span class="line">823</span><br><span class="line">824</span><br><span class="line">825</span><br><span class="line">826</span><br><span class="line">827</span><br><span class="line">828</span><br><span class="line">829</span><br><span class="line">830</span><br><span class="line">831</span><br><span class="line">832</span><br><span class="line">833</span><br><span class="line">834</span><br><span class="line">835</span><br><span class="line">836</span><br><span class="line">837</span><br><span class="line">838</span><br><span class="line">839</span><br><span class="line">840</span><br><span class="line">841</span><br><span class="line">842</span><br><span class="line">843</span><br><span class="line">844</span><br><span class="line">845</span><br><span class="line">846</span><br><span class="line">847</span><br><span class="line">848</span><br><span class="line">849</span><br><span class="line">850</span><br><span class="line">851</span><br><span class="line">852</span><br><span class="line">853</span><br><span class="line">854</span><br></pre></td><td class="code"><pre><span class="line">KiSystemCall64                                              KiSystemCall64  proc <span class="built_in">near</span>               <span class="comment">; DATA XREF: sub_FFFFF8034C8622F4+21↑o</span></span><br><span class="line">KiSystemCall64                                                                                      <span class="comment">; .pdata:FFFFF8034CBD19B8↓o</span></span><br><span class="line">KiSystemCall64                                                                                      <span class="comment">; KiInitializeBootStructures+198↓o</span></span><br><span class="line">KiSystemCall64</span><br><span class="line">KiSystemCall64                                              var_1E8         = <span class="built_in">byte</span> <span class="built_in">ptr</span> -<span class="number">1E8h</span></span><br><span class="line">KiSystemCall64                                              var_1C0         = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">1C0h</span></span><br><span class="line">KiSystemCall64                                              var_1B8         = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">1B8h</span></span><br><span class="line">KiSystemCall64                                              var_1B0         = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">1B0h</span></span><br><span class="line">KiSystemCall64                                              var_1A8         = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">1A8h</span></span><br><span class="line">KiSystemCall64                                              var_1A0         = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">1A0h</span></span><br><span class="line">KiSystemCall64                                              anonymous_0     = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">198h</span></span><br><span class="line">KiSystemCall64                                              anonymous_1     = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">190h</span></span><br><span class="line">KiSystemCall64                                              anonymous_2     = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">188h</span></span><br><span class="line">KiSystemCall64                                              anonymous_3     = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">180h</span></span><br><span class="line">KiSystemCall64                                              anonymous_4     = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">178h</span></span><br><span class="line">KiSystemCall64                                              anonymous_5     = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">170h</span></span><br><span class="line">KiSystemCall64                                              anonymous_6     = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">168h</span></span><br><span class="line">KiSystemCall64                                              anonymous_7     = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">160h</span></span><br><span class="line">KiSystemCall64                                              anonymous_8     = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">158h</span></span><br><span class="line">KiSystemCall64                                              anonymous_9     = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">150h</span></span><br><span class="line">KiSystemCall64                                              anonymous_10    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">148h</span></span><br><span class="line">KiSystemCall64                                              anonymous_11    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">140h</span></span><br><span class="line">KiSystemCall64                                              anonymous_12    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">138h</span></span><br><span class="line">KiSystemCall64                                              anonymous_13    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">130h</span></span><br><span class="line">KiSystemCall64                                              anonymous_14    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">128h</span></span><br><span class="line">KiSystemCall64                                              anonymous_15    = xmmword <span class="built_in">ptr</span> -<span class="number">120h</span></span><br><span class="line">KiSystemCall64                                              var_110         = xmmword <span class="built_in">ptr</span> -<span class="number">110h</span></span><br><span class="line">KiSystemCall64                                              anonymous_16    = xmmword <span class="built_in">ptr</span> -<span class="number">100h</span></span><br><span class="line">KiSystemCall64                                              anonymous_17    = xmmword <span class="built_in">ptr</span> -<span class="number">0F0h</span></span><br><span class="line">KiSystemCall64                                              anonymous_18    = xmmword <span class="built_in">ptr</span> -<span class="number">0E0h</span></span><br><span class="line">KiSystemCall64                                              anonymous_19    = xmmword <span class="built_in">ptr</span> -<span class="number">0D0h</span></span><br><span class="line">KiSystemCall64                                              anonymous_20    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">0C0h</span></span><br><span class="line">KiSystemCall64                                              anonymous_21    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">0B8h</span></span><br><span class="line">KiSystemCall64                                              anonymous_22    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">0B0h</span></span><br><span class="line">KiSystemCall64                                              anonymous_23    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">0A8h</span></span><br><span class="line">KiSystemCall64                                              anonymous_24    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">0A0h</span></span><br><span class="line">KiSystemCall64                                              var_90          = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">90h</span></span><br><span class="line">KiSystemCall64                                              anonymous_25    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">58h</span></span><br><span class="line">KiSystemCall64                                              anonymous_26    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">38h</span></span><br><span class="line">KiSystemCall64                                              anonymous_27    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">28h</span></span><br><span class="line">KiSystemCall64                                              anonymous_28    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">20h</span></span><br><span class="line">KiSystemCall64                                              anonymous_29    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">18h</span></span><br><span class="line">KiSystemCall64                                              anonymous_30    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">10h</span></span><br><span class="line">KiSystemCall64                                              anonymous_31    = <span class="built_in">qword</span> <span class="built_in">ptr</span> -<span class="number">8</span></span><br><span class="line">KiSystemCall64</span><br><span class="line">KiSystemCall64                                              <span class="comment">; __unwind &#123; // KiSystemServiceHandler</span></span><br><span class="line">KiSystemCall64      <span class="number">000</span> 0F <span class="number">01</span> F8                                            <span class="keyword">swapgs</span> <span class="comment">;gs指向cpu的kpcr</span></span><br><span class="line">KiSystemCall64+<span class="number">3</span>    <span class="number">000</span> <span class="number">65</span> <span class="number">48</span> <span class="number">89</span> <span class="number">24</span> <span class="number">25</span> <span class="number">10</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">gs</span>:<span class="number">10h</span>, <span class="built_in">rsp</span>     <span class="comment">; r3 rsp存放到UserRsp</span></span><br><span class="line">KiSystemCall64+C    <span class="number">000</span> <span class="number">65</span> <span class="number">48</span> 8B <span class="number">24</span> <span class="number">25</span> A8 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rsp</span>, <span class="built_in">gs</span>:<span class="number">1A8h</span>    <span class="comment">; rsp切换到内核栈Prcb.RspBase</span></span><br><span class="line">KiSystemCall64+<span class="number">15</span>   <span class="number">000</span> 6A 2B                                               <span class="keyword">push</span>    <span class="number">2Bh</span> <span class="comment">; '+'       ; KTRAP_FRAME.SegSs = 0x2b</span></span><br><span class="line">KiSystemCall64+<span class="number">17</span>   <span class="number">008</span> <span class="number">65</span> FF <span class="number">34</span> <span class="number">25</span> <span class="number">10</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">push</span>    <span class="built_in">qword</span> <span class="built_in">ptr</span> <span class="built_in">gs</span>:<span class="number">10h</span> <span class="comment">; KTRAP_FRAME.Rsp保存r3的rsp</span></span><br><span class="line">KiSystemCall64+1F   <span class="number">010</span> <span class="number">41</span> <span class="number">53</span>                                               <span class="keyword">push</span>    <span class="built_in">r11</span>             <span class="comment">; KTRAP_FRAME.EFlags 保存r11保存之前的RFLAGS</span></span><br><span class="line">KiSystemCall64+<span class="number">21</span>   <span class="number">018</span> 6A <span class="number">33</span>                                               <span class="keyword">push</span>    <span class="number">33h</span> <span class="comment">; '3'       ; KTRAP_FRAME.SegCs = 0x33</span></span><br><span class="line">KiSystemCall64+<span class="number">23</span>   <span class="number">020</span> <span class="number">51</span>                                                  <span class="keyword">push</span>    <span class="built_in">rcx</span>             <span class="comment">; KTRAP_FRAME.Rip = rcx 保存返回值</span></span><br><span class="line">KiSystemCall64+<span class="number">24</span>   <span class="number">028</span> <span class="number">49</span> 8B CA                                            <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">r10</span>        <span class="comment">; 第一个参数赋值给rcx</span></span><br><span class="line">KiSystemCall64+<span class="number">27</span>   <span class="number">028</span> <span class="number">48</span> <span class="number">83</span> EC <span class="number">08</span>                                         <span class="keyword">sub</span>     <span class="built_in">rsp</span>, <span class="number">8</span>          <span class="comment">; 填充8字节</span></span><br><span class="line">KiSystemCall64+2B   <span class="number">030</span> <span class="number">55</span>                                                  <span class="keyword">push</span>    <span class="built_in">rbp</span>             <span class="comment">; KTRAP_FRAME.Rbp = rbp (0x158偏移处</span></span><br><span class="line">KiSystemCall64+2C   <span class="number">038</span> <span class="number">48</span> <span class="number">81</span> EC <span class="number">58</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">sub</span>     <span class="built_in">rsp</span>, <span class="number">158h</span>       <span class="comment">; 开辟剩余的KTRAP_FRAME的栈 Rsp = &amp;KTRAP_FRAME.P1Home</span></span><br><span class="line">KiSystemCall64+<span class="number">33</span>   <span class="number">190</span> <span class="number">48</span> <span class="number">8D</span> AC <span class="number">24</span> <span class="number">80</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">lea</span>     <span class="built_in">rbp</span>, [<span class="built_in">rsp</span>+<span class="number">80h</span>]  <span class="comment">; rbp=KTRAP_FRAME.Xmm1 = KTRAP_FRAME+0x80</span></span><br><span class="line">KiSystemCall64+3B   <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">9D</span> C0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     [<span class="built_in">rbp</span>+<span class="number">0C0h</span>], <span class="built_in">rbx</span> <span class="comment">; KTRAP_FRAME.Rbx = rbx</span></span><br><span class="line">KiSystemCall64+<span class="number">42</span>   <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> BD C8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     [<span class="built_in">rbp</span>+<span class="number">0C8h</span>], <span class="built_in">rdi</span> <span class="comment">; KTRAP_FRAME.Rdi = rdi</span></span><br><span class="line">KiSystemCall64+<span class="number">49</span>   <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> B5 D0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     [<span class="built_in">rbp</span>+<span class="number">0D0h</span>], <span class="built_in">rsi</span> <span class="comment">; KTRAP_FRAME.Rsi = rsi</span></span><br><span class="line">KiSystemCall64+<span class="number">50</span>   <span class="number">190</span> <span class="number">65</span> F6 <span class="number">04</span> <span class="number">25</span> <span class="number">24</span> <span class="number">64</span> <span class="number">00</span> <span class="number">00</span> <span class="number">02</span>                          <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> <span class="built_in">gs</span>:<span class="number">6424h</span>, <span class="number">2</span> <span class="comment">;</span></span><br><span class="line">KiSystemCall64+<span class="number">50</span>                                                                                   <span class="comment">; ksamd64.inc文件中定义</span></span><br><span class="line">KiSystemCall64+<span class="number">50</span>                                                                                   <span class="comment">; Prcb-&gt;FeatureBits &amp; KF_SMAP（0x0200000000H）</span></span><br><span class="line">KiSystemCall64+<span class="number">50</span>                                                                                   <span class="comment">; 检查SMAP是否开启</span></span><br><span class="line">KiSystemCall64+<span class="number">59</span>   <span class="number">190</span> <span class="number">74</span> 0C                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87BB27 <span class="comment">; KTRAP_FRAME.Rax = rax</span></span><br><span class="line">KiSystemCall64+5B   <span class="number">190</span> F6 <span class="number">85</span> F0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">01</span>                                <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">0F0h</span>], <span class="number">1</span> <span class="comment">; 检查KTRAP_FRAME.SegCs的RPL</span></span><br><span class="line">KiSystemCall64+<span class="number">62</span>   <span class="number">190</span> <span class="number">74</span> <span class="number">03</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87BB27 <span class="comment">; KTRAP_FRAME.Rax = rax</span></span><br><span class="line">KiSystemCall64+<span class="number">64</span>   <span class="number">190</span> 0F <span class="number">01</span> CB                                            <span class="keyword">stac</span>                    <span class="comment">; 关闭SMAP</span></span><br><span class="line">KiSystemCall64+<span class="number">67</span></span><br><span class="line">KiSystemCall64+<span class="number">67</span>                                           loc_FFFFF8034C87BB27:                   <span class="comment">; CODE XREF: KiSystemCall64+59↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">67</span>                                                                                   <span class="comment">; KiSystemCall64+62↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">67</span>   <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> B0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">50h</span>], <span class="built_in">rax</span>  <span class="comment">; KTRAP_FRAME.Rax = rax</span></span><br><span class="line">KiSystemCall64+6B   <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">4D</span> B8                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">48h</span>], <span class="built_in">rcx</span>  <span class="comment">; KTRAP_FRAME.Rcx = rcx</span></span><br><span class="line">KiSystemCall64+6F   <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">55</span> C0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">40h</span>], <span class="built_in">rdx</span>  <span class="comment">; KTRAP_FRAME.Rdx =rdx</span></span><br><span class="line">KiSystemCall64+<span class="number">73</span>   <span class="number">190</span> <span class="number">65</span> <span class="number">48</span> 8B 0C <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">gs</span>:_KPCR.Prcb.CurrentThread <span class="comment">; _KTHREAD</span></span><br><span class="line">KiSystemCall64+7C   <span class="number">190</span> <span class="number">48</span> 8B <span class="number">89</span> <span class="number">20</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rcx</span>, [<span class="built_in">rcx</span>+<span class="number">220h</span>] <span class="comment">; _KTHREAD._KPROCESS* = _EPROCESS *</span></span><br><span class="line">KiSystemCall64+<span class="number">83</span>   <span class="number">190</span> <span class="number">48</span> 8B <span class="number">89</span> <span class="number">60</span> <span class="number">08</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rcx</span>, [<span class="built_in">rcx</span>+<span class="number">860h</span>] <span class="comment">; _EPROCESS.SecurityDomain</span></span><br><span class="line">KiSystemCall64+8A   <span class="number">190</span> <span class="number">65</span> <span class="number">48</span> <span class="number">89</span> 0C <span class="number">25</span> <span class="number">70</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">gs</span>:<span class="number">270h</span>, <span class="built_in">rcx</span>    <span class="comment">; TrappedSecurityDomain</span></span><br><span class="line">KiSystemCall64+<span class="number">93</span>   <span class="number">190</span> <span class="number">65</span> 8A 0C <span class="number">25</span> <span class="number">50</span> <span class="number">08</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">mov</span>     <span class="built_in">cl</span>, <span class="built_in">gs</span>:<span class="number">850h</span>     <span class="comment">; BpbRetpolineExitSpecCtrl</span></span><br><span class="line">KiSystemCall64+<span class="number">93</span>                                                                                   <span class="comment">;</span></span><br><span class="line">KiSystemCall64+<span class="number">93</span>                                                                                   <span class="comment">; 之后都是预测执行侧信道的缓解措施</span></span><br><span class="line">KiSystemCall64+<span class="number">93</span>                                                                                   <span class="comment">; https://simplecore-prc.intel.cn/intel-china-newsroom/wp-content/uploads/sites/2/intel-analysis-of-speculative-execution-side-channels-cn.pdf</span></span><br><span class="line">KiSystemCall64+9B   <span class="number">190</span> <span class="number">65</span> <span class="number">88</span> 0C <span class="number">25</span> <span class="number">51</span> <span class="number">08</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">mov</span>     <span class="built_in">gs</span>:<span class="number">851h</span>, <span class="built_in">cl</span>     <span class="comment">; BpbTrappedRetpolineExitSpecCtrl</span></span><br><span class="line">KiSystemCall64+A3   <span class="number">190</span> <span class="number">65</span> 8A 0C <span class="number">25</span> <span class="number">78</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">mov</span>     <span class="built_in">cl</span>, <span class="built_in">gs</span>:_KPCR.Prcb.___u40.__s0.BpbState</span><br><span class="line">KiSystemCall64+AB   <span class="number">190</span> <span class="number">65</span> <span class="number">88</span> 0C <span class="number">25</span> <span class="number">52</span> <span class="number">08</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">mov</span>     <span class="built_in">gs</span>:_KPCR.Prcb.___u45.__s0.BpbTrappedBpbState, <span class="built_in">cl</span></span><br><span class="line">KiSystemCall64+B3   <span class="number">190</span> <span class="number">65</span> 0F B6 <span class="number">04</span> <span class="number">25</span> 7B <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">movzx</span>   <span class="built_in">eax</span>, <span class="built_in">gs</span>:_KPCR.Prcb.___u40.__s0.BpbKernelSpecCtrl</span><br><span class="line">KiSystemCall64+BC   <span class="number">190</span> <span class="number">65</span> <span class="number">38</span> <span class="number">04</span> <span class="number">25</span> 7A <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">cmp</span>     <span class="built_in">gs</span>:_KPCR.Prcb.___u40.__s0.BpbCurrentSpecCtrl, <span class="built_in">al</span></span><br><span class="line">KiSystemCall64+C4   <span class="number">190</span> <span class="number">74</span> <span class="number">11</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87BB97</span><br><span class="line">KiSystemCall64+C6   <span class="number">190</span> <span class="number">65</span> <span class="number">88</span> <span class="number">04</span> <span class="number">25</span> 7A <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">mov</span>     <span class="built_in">gs</span>:_KPCR.Prcb.___u40.__s0.BpbCurrentSpecCtrl, <span class="built_in">al</span></span><br><span class="line">KiSystemCall64+CE   <span class="number">190</span> B9 <span class="number">48</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">48h</span> <span class="comment">; 'H'</span></span><br><span class="line">KiSystemCall64+D3   <span class="number">190</span> <span class="number">33</span> D2                                               <span class="keyword">xor</span>     <span class="built_in">edx</span>, <span class="built_in">edx</span></span><br><span class="line">KiSystemCall64+D5   <span class="number">190</span> 0F <span class="number">30</span>                                               <span class="keyword">wrmsr</span>                   <span class="comment">; IA32_SPEC_CTRL</span></span><br><span class="line">KiSystemCall64+D5                                                                                   <span class="comment">; 单线程间接分支预测器 (STIBP)。</span></span><br><span class="line">KiSystemCall64+D5                                                                                   <span class="comment">; 防止间接分支预测被同核的超线程所控制</span></span><br><span class="line">KiSystemCall64+D7</span><br><span class="line">KiSystemCall64+D7                                           loc_FFFFF8034C87BB97:                   <span class="comment">; CODE XREF: KiSystemCall64+C4↑j</span></span><br><span class="line">KiSystemCall64+D7   <span class="number">190</span> <span class="number">65</span> 0F B6 <span class="number">14</span> <span class="number">25</span> <span class="number">78</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">movzx</span>   <span class="built_in">edx</span>, <span class="built_in">byte</span> <span class="built_in">ptr</span> <span class="built_in">gs</span>:<span class="number">278h</span></span><br><span class="line">KiSystemCall64+E0   <span class="number">190</span> F7 C2 <span class="number">08</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">test</span>    <span class="built_in">edx</span>, <span class="number">1000b</span>      <span class="comment">; BpbIbpbOnTrap</span></span><br><span class="line">KiSystemCall64+E6   <span class="number">190</span> <span class="number">74</span> <span class="number">13</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87BBBB <span class="comment">; BpbTrappedFlushRsbOnTrap</span></span><br><span class="line">KiSystemCall64+E8   <span class="number">190</span> B8 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">1</span></span><br><span class="line">KiSystemCall64+ED   <span class="number">190</span> <span class="number">33</span> D2                                               <span class="keyword">xor</span>     <span class="built_in">edx</span>, <span class="built_in">edx</span></span><br><span class="line">KiSystemCall64+EF   <span class="number">190</span> B9 <span class="number">49</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">49h</span> <span class="comment">; 'I'  ; IA32_PRED_CMD</span></span><br><span class="line">KiSystemCall64+EF                                                                                   <span class="comment">; 间接分支预测障碍 (IBPB)</span></span><br><span class="line">KiSystemCall64+EF                                                                                   <span class="comment">; 确保前期代码的行为不会控制后续间接分支预测</span></span><br><span class="line">KiSystemCall64+F4   <span class="number">190</span> 0F <span class="number">30</span>                                               <span class="keyword">wrmsr</span></span><br><span class="line">KiSystemCall64+F6   <span class="number">190</span> E9 3E <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">jmp</span>     loc_FFFFF8034C87BCF9</span><br><span class="line">KiSystemCall64+FB                                           <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64+FB</span><br><span class="line">KiSystemCall64+FB                                           loc_FFFFF8034C87BBBB:                   <span class="comment">; CODE XREF: KiSystemCall64+E6↑j</span></span><br><span class="line">KiSystemCall64+FB   <span class="number">190</span> F7 C2 <span class="number">02</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">test</span>    <span class="built_in">edx</span>, <span class="number">10b</span>        <span class="comment">; BpbTrappedFlushRsbOnTrap</span></span><br><span class="line">KiSystemCall64+<span class="number">101</span>  <span class="number">190</span> 0F <span class="number">84</span> 2F <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">jz</span>      loc_FFFFF8034C87BCF6 <span class="comment">; 在旧指令执行完毕前阻止较新指令的执行</span></span><br><span class="line">KiSystemCall64+<span class="number">101</span>                                                                                  <span class="comment">; Wait On Following Instructions Until(preceding instructions complete);</span></span><br><span class="line">KiSystemCall64+<span class="number">107</span>  <span class="number">190</span> <span class="number">65</span> F6 <span class="number">04</span> <span class="number">25</span> <span class="number">79</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span> <span class="number">04</span>                          <span class="keyword">test</span>    <span class="built_in">gs</span>:_KPCR.Prcb.___u40.__s0.BpbFeatures, <span class="number">4</span></span><br><span class="line">KiSystemCall64+<span class="number">110</span>  <span class="number">190</span> 0F <span class="number">85</span> <span class="number">20</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">jnz</span>     loc_FFFFF8034C87BCF6 <span class="comment">; 在旧指令执行完毕前阻止较新指令的执行</span></span><br><span class="line">KiSystemCall64+<span class="number">110</span>                                                                                  <span class="comment">; Wait On Following Instructions Until(preceding instructions complete);</span></span><br><span class="line">KiSystemCall64+<span class="number">116</span>  <span class="number">190</span> E8 0E <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">call</span>    loc_FFFFF8034C87BCE9</span><br><span class="line">KiSystemCall64+<span class="number">11B</span></span><br><span class="line">KiSystemCall64+<span class="number">11B</span>                                          loc_FFFFF8034C87BBDB:                   <span class="comment">; CODE XREF: KiSystemCall64+128↓p</span></span><br><span class="line">KiSystemCall64+<span class="number">11B</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+11F  <span class="number">188</span> E8 0E <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">call</span>    loc_FFFFF8034C87BCF2</span><br><span class="line">KiSystemCall64+<span class="number">124</span></span><br><span class="line">KiSystemCall64+<span class="number">124</span>                                          loc_FFFFF8034C87BBE4:                   <span class="comment">; CODE XREF: KiSystemCall64+131↓p</span></span><br><span class="line">KiSystemCall64+<span class="number">124</span>  <span class="number">188</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">128</span>  <span class="number">180</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BBDB</span><br><span class="line">KiSystemCall64+<span class="number">12D</span></span><br><span class="line">KiSystemCall64+<span class="number">12D</span>                                          loc_FFFFF8034C87BBED:                   <span class="comment">; CODE XREF: KiSystemCall64+13A↓p</span></span><br><span class="line">KiSystemCall64+<span class="number">12D</span>  <span class="number">180</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">131</span>  <span class="number">178</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BBE4</span><br><span class="line">KiSystemCall64+<span class="number">136</span></span><br><span class="line">KiSystemCall64+<span class="number">136</span>                                          loc_FFFFF8034C87BBF6:                   <span class="comment">; CODE XREF: KiSystemCall64+143↓p</span></span><br><span class="line">KiSystemCall64+<span class="number">136</span>  <span class="number">178</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+13A  <span class="number">170</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BBED</span><br><span class="line">KiSystemCall64+13F</span><br><span class="line">KiSystemCall64+13F                                          loc_FFFFF8034C87BBFF:                   <span class="comment">; CODE XREF: KiSystemCall64+14C↓p</span></span><br><span class="line">KiSystemCall64+13F  <span class="number">170</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">143</span>  <span class="number">168</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BBF6</span><br><span class="line">KiSystemCall64+<span class="number">148</span></span><br><span class="line">KiSystemCall64+<span class="number">148</span>                                          loc_FFFFF8034C87BC08:                   <span class="comment">; CODE XREF: KiSystemCall64+155↓p</span></span><br><span class="line">KiSystemCall64+<span class="number">148</span>  <span class="number">168</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+14C  <span class="number">160</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BBFF</span><br><span class="line">KiSystemCall64+<span class="number">151</span></span><br><span class="line">KiSystemCall64+<span class="number">151</span>                                          loc_FFFFF8034C87BC11:                   <span class="comment">; CODE XREF: KiSystemCall64+15E↓p</span></span><br><span class="line">KiSystemCall64+<span class="number">151</span>  <span class="number">160</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">155</span>  <span class="number">158</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC08</span><br><span class="line">KiSystemCall64+15A</span><br><span class="line">KiSystemCall64+15A                                          loc_FFFFF8034C87BC1A:                   <span class="comment">; CODE XREF: KiSystemCall64+167↓p</span></span><br><span class="line">KiSystemCall64+15A  <span class="number">158</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+15E  <span class="number">150</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC11</span><br><span class="line">KiSystemCall64+<span class="number">163</span></span><br><span class="line">KiSystemCall64+<span class="number">163</span>                                          loc_FFFFF8034C87BC23:                   <span class="comment">; CODE XREF: KiSystemCall64+170↓p</span></span><br><span class="line">KiSystemCall64+<span class="number">163</span>  <span class="number">150</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">167</span>  <span class="number">148</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC1A</span><br><span class="line">KiSystemCall64+16C</span><br><span class="line">KiSystemCall64+16C                                          loc_FFFFF8034C87BC2C:                   <span class="comment">; CODE XREF: KiSystemCall64+179↓p</span></span><br><span class="line">KiSystemCall64+16C  <span class="number">148</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">170</span>  <span class="number">140</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC23</span><br><span class="line">KiSystemCall64+<span class="number">175</span></span><br><span class="line">KiSystemCall64+<span class="number">175</span>                                          loc_FFFFF8034C87BC35:                   <span class="comment">; CODE XREF: KiSystemCall64+182↓p</span></span><br><span class="line">KiSystemCall64+<span class="number">175</span>  <span class="number">140</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">179</span>  <span class="number">138</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC2C</span><br><span class="line">KiSystemCall64+17E</span><br><span class="line">KiSystemCall64+17E                                          loc_FFFFF8034C87BC3E:                   <span class="comment">; CODE XREF: KiSystemCall64+18B↓p</span></span><br><span class="line">KiSystemCall64+17E  <span class="number">138</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">182</span>  <span class="number">130</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC35</span><br><span class="line">KiSystemCall64+<span class="number">187</span></span><br><span class="line">KiSystemCall64+<span class="number">187</span>                                          loc_FFFFF8034C87BC47:                   <span class="comment">; CODE XREF: KiSystemCall64+194↓p</span></span><br><span class="line">KiSystemCall64+<span class="number">187</span>  <span class="number">130</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+18B  <span class="number">128</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC3E</span><br><span class="line">KiSystemCall64+<span class="number">190</span></span><br><span class="line">KiSystemCall64+<span class="number">190</span>                                          loc_FFFFF8034C87BC50:                   <span class="comment">; CODE XREF: KiSystemCall64+19D↓p</span></span><br><span class="line">KiSystemCall64+<span class="number">190</span>  <span class="number">128</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">194</span>  <span class="number">120</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC47</span><br><span class="line">KiSystemCall64+<span class="number">199</span></span><br><span class="line">KiSystemCall64+<span class="number">199</span>                                          loc_FFFFF8034C87BC59:                   <span class="comment">; CODE XREF: KiSystemCall64+1A6↓p</span></span><br><span class="line">KiSystemCall64+<span class="number">199</span>  <span class="number">120</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">19D</span>  <span class="number">118</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC50</span><br><span class="line">KiSystemCall64+1A2</span><br><span class="line">KiSystemCall64+1A2                                          loc_FFFFF8034C87BC62:                   <span class="comment">; CODE XREF: KiSystemCall64+1AF↓p</span></span><br><span class="line">KiSystemCall64+1A2  <span class="number">118</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+1A6  <span class="number">110</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC59</span><br><span class="line">KiSystemCall64+1AB</span><br><span class="line">KiSystemCall64+1AB                                          loc_FFFFF8034C87BC6B:                   <span class="comment">; CODE XREF: KiSystemCall64+1B8↓p</span></span><br><span class="line">KiSystemCall64+1AB  <span class="number">110</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+1AF  <span class="number">108</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC62</span><br><span class="line">KiSystemCall64+1B4</span><br><span class="line">KiSystemCall64+1B4                                          loc_FFFFF8034C87BC74:                   <span class="comment">; CODE XREF: KiSystemCall64+1C1↓p</span></span><br><span class="line">KiSystemCall64+1B4  <span class="number">108</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+1B8  <span class="number">100</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC6B</span><br><span class="line">KiSystemCall64+1BD</span><br><span class="line">KiSystemCall64+1BD                                          loc_FFFFF8034C87BC7D:                   <span class="comment">; CODE XREF: KiSystemCall64+1CA↓p</span></span><br><span class="line">KiSystemCall64+1BD  <span class="number">100</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+1C1  0F8 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC74</span><br><span class="line">KiSystemCall64+1C6</span><br><span class="line">KiSystemCall64+1C6                                          loc_FFFFF8034C87BC86:                   <span class="comment">; CODE XREF: KiSystemCall64+1D3↓p</span></span><br><span class="line">KiSystemCall64+1C6  0F8 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+1CA  0F0 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC7D</span><br><span class="line">KiSystemCall64+1CF</span><br><span class="line">KiSystemCall64+1CF                                          loc_FFFFF8034C87BC8F:                   <span class="comment">; CODE XREF: KiSystemCall64+1DC↓p</span></span><br><span class="line">KiSystemCall64+1CF  0F0 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+1D3  0E8 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC86</span><br><span class="line">KiSystemCall64+1D8</span><br><span class="line">KiSystemCall64+1D8                                          loc_FFFFF8034C87BC98:                   <span class="comment">; CODE XREF: KiSystemCall64+1E5↓p</span></span><br><span class="line">KiSystemCall64+1D8  0E8 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+1DC  0E0 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC8F</span><br><span class="line">KiSystemCall64+1E1</span><br><span class="line">KiSystemCall64+1E1                                          loc_FFFFF8034C87BCA1:                   <span class="comment">; CODE XREF: KiSystemCall64+1EE↓p</span></span><br><span class="line">KiSystemCall64+1E1  0E0 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+1E5  <span class="number">0D8</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BC98</span><br><span class="line">KiSystemCall64+1EA</span><br><span class="line">KiSystemCall64+1EA                                          loc_FFFFF8034C87BCAA:                   <span class="comment">; CODE XREF: KiSystemCall64+1F7↓p</span></span><br><span class="line">KiSystemCall64+1EA  <span class="number">0D8</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+1EE  <span class="number">0D0</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BCA1</span><br><span class="line">KiSystemCall64+1F3</span><br><span class="line">KiSystemCall64+1F3                                          loc_FFFFF8034C87BCB3:                   <span class="comment">; CODE XREF: KiSystemCall64+200↓p</span></span><br><span class="line">KiSystemCall64+1F3  <span class="number">0D0</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+1F7  0C8 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BCAA</span><br><span class="line">KiSystemCall64+1FC</span><br><span class="line">KiSystemCall64+1FC                                          loc_FFFFF8034C87BCBC:                   <span class="comment">; CODE XREF: KiSystemCall64+209↓p</span></span><br><span class="line">KiSystemCall64+1FC  0C8 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">200</span>  0C0 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BCB3</span><br><span class="line">KiSystemCall64+<span class="number">205</span></span><br><span class="line">KiSystemCall64+<span class="number">205</span>                                          loc_FFFFF8034C87BCC5:                   <span class="comment">; CODE XREF: KiSystemCall64+212↓p</span></span><br><span class="line">KiSystemCall64+<span class="number">205</span>  0C0 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">209</span>  0B8 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BCBC</span><br><span class="line">KiSystemCall64+20E</span><br><span class="line">KiSystemCall64+20E                                          loc_FFFFF8034C87BCCE:                   <span class="comment">; CODE XREF: KiSystemCall64+21B↓p</span></span><br><span class="line">KiSystemCall64+20E  0B8 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">212</span>  <span class="number">0B0</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BCC5</span><br><span class="line">KiSystemCall64+<span class="number">217</span></span><br><span class="line">KiSystemCall64+<span class="number">217</span>                                          loc_FFFFF8034C87BCD7:                   <span class="comment">; CODE XREF: KiSystemCall64+224↓p</span></span><br><span class="line">KiSystemCall64+<span class="number">217</span>  <span class="number">0B0</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+21B  0A8 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BCCE</span><br><span class="line">KiSystemCall64+<span class="number">220</span></span><br><span class="line">KiSystemCall64+<span class="number">220</span>                                          loc_FFFFF8034C87BCE0:                   <span class="comment">; CODE XREF: KiSystemCall64+22D↓p</span></span><br><span class="line">KiSystemCall64+<span class="number">220</span>  0A8 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">224</span>  0A0 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BCD7</span><br><span class="line">KiSystemCall64+<span class="number">229</span></span><br><span class="line">KiSystemCall64+<span class="number">229</span>                                          loc_FFFFF8034C87BCE9:                   <span class="comment">; CODE XREF: KiSystemCall64+116↑p</span></span><br><span class="line">KiSystemCall64+<span class="number">229</span>  0A0 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">22D</span>  <span class="number">098</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C87BCE0</span><br><span class="line">KiSystemCall64+<span class="number">232</span></span><br><span class="line">KiSystemCall64+<span class="number">232</span>                                          loc_FFFFF8034C87BCF2:                   <span class="comment">; CODE XREF: KiSystemCall64+11F↑p</span></span><br><span class="line">KiSystemCall64+<span class="number">232</span>  <span class="number">098</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64+<span class="number">236</span></span><br><span class="line">KiSystemCall64+<span class="number">236</span>                                          loc_FFFFF8034C87BCF6:                   <span class="comment">; CODE XREF: KiSystemCall64+101↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">236</span>                                                                                  <span class="comment">; KiSystemCall64+110↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">236</span>  <span class="number">090</span> 0F AE E8                                            <span class="keyword">lfence</span>                  <span class="comment">; 在旧指令执行完毕前阻止较新指令的执行</span></span><br><span class="line">KiSystemCall64+<span class="number">236</span>                                                                                  <span class="comment">; Wait On Following Instructions Until(preceding instructions complete);</span></span><br><span class="line">KiSystemCall64+<span class="number">239</span></span><br><span class="line">KiSystemCall64+<span class="number">239</span>                                          loc_FFFFF8034C87BCF9:                   <span class="comment">; CODE XREF: KiSystemCall64+F6↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">239</span>  <span class="number">190</span> <span class="number">65</span> C6 <span class="number">04</span> <span class="number">25</span> <span class="number">53</span> <span class="number">08</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">gs</span>:_KPCR.Prcb.___u45.__s0.BpbRetpolineState, <span class="number">0</span></span><br><span class="line">KiSystemCall64+<span class="number">242</span></span><br><span class="line">KiSystemCall64+<span class="number">242</span>                                          KiSystemServiceUser:                    <span class="comment">; CODE XREF: KiSystemService+236↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">242</span>                                                                                  <span class="comment">; KiSystemCall64Shadow+25A↓j</span></span><br><span class="line">KiSystemCall64+<span class="number">242</span>  <span class="number">190</span> C6 <span class="number">45</span> AB <span class="number">02</span>                                         <span class="keyword">mov</span>     <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rbp</span>-<span class="number">55h</span>], <span class="number">2</span></span><br><span class="line">KiSystemCall64+<span class="number">246</span>  <span class="number">190</span> <span class="number">65</span> <span class="number">48</span> 8B 1C <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rbx</span>, <span class="built_in">gs</span>:_KPCR.Prcb.CurrentThread <span class="comment">; _KTHREAD</span></span><br><span class="line">KiSystemCall64+24F  <span class="number">190</span> 0F <span class="number">0D</span> 8B <span class="number">90</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">prefetchw</span> <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rbx</span>+<span class="number">90h</span>] <span class="comment">; 预加载 kpcr.CurrentThread._KTRAP_FRAME</span></span><br><span class="line">KiSystemCall64+<span class="number">256</span>  <span class="number">190</span> 0F AE <span class="number">5D</span> AC                                         <span class="keyword">stmxcsr</span> <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rbp</span>-<span class="number">54h</span>] <span class="comment">; KTRAP_FRAM.MxCsr = MXCSR</span></span><br><span class="line">KiSystemCall64+25A  <span class="number">190</span> <span class="number">65</span> 0F AE <span class="number">14</span> <span class="number">25</span> <span class="number">80</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">ldmxcsr</span> <span class="built_in">dword</span> <span class="built_in">ptr</span> <span class="built_in">gs</span>:<span class="number">180h</span> <span class="comment">; mxcsr = _KPCR.Prcb.MxCsr</span></span><br><span class="line">KiSystemCall64+<span class="number">263</span>  <span class="number">190</span> <span class="number">80</span> 7B <span class="number">03</span> <span class="number">00</span>                                         <span class="keyword">cmp</span>     <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rbx</span>+<span class="number">3</span>], <span class="number">0</span> <span class="comment">; _kpcr._KPRCB._KTHREAD._DISPATCHER_HEADER.DebugActive</span></span><br><span class="line">KiSystemCall64+<span class="number">267</span>  <span class="number">190</span> <span class="number">66</span> C7 <span class="number">85</span> <span class="number">80</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">word</span> <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">80h</span>], <span class="number">0</span> <span class="comment">; _KTRAP_FRAME._KTRAP_FRAME = 0</span></span><br><span class="line">KiSystemCall64+<span class="number">270</span>  <span class="number">190</span> 0F <span class="number">84</span> A8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">jz</span>      loc_FFFFF8034C87BDDE <span class="comment">; rax = _KTRAP_FRAME.rax</span></span><br><span class="line">KiSystemCall64+<span class="number">276</span>  <span class="number">190</span> F6 <span class="number">43</span> <span class="number">03</span> <span class="number">03</span>                                         <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rbx</span>+<span class="number">3</span>], <span class="number">11b</span> <span class="comment">; _KPCR.Prcb.CurrentThread.DispatchHeader.DebugActive(0x3).(ActiveDR7 &amp; Instrumented)</span></span><br><span class="line">KiSystemCall64+27A  <span class="number">190</span> 4C <span class="number">89</span> <span class="number">45</span> C8                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">38h</span>], <span class="built_in">r8</span>   <span class="comment">; _KTRAP_FRAME.r8 = r8</span></span><br><span class="line">KiSystemCall64+27E  <span class="number">190</span> 4C <span class="number">89</span> <span class="number">4D</span> D0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">30h</span>], <span class="built_in">r9</span>   <span class="comment">; _KTRAP_FRAME.r9 = r9</span></span><br><span class="line">KiSystemCall64+<span class="number">282</span>  <span class="number">190</span> <span class="number">74</span> <span class="number">05</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87BD49 <span class="comment">;  _KPCR.Prcb.CurrentThread.DispatchHeader.DebugActive.Minimal</span></span><br><span class="line">KiSystemCall64+<span class="number">284</span>  <span class="number">190</span> E8 A7 F0 FE FF                                      <span class="keyword">call</span>    KiSaveDebugRegisterState <span class="comment">; 保存调试寄存器</span></span><br><span class="line">KiSystemCall64+<span class="number">289</span></span><br><span class="line">KiSystemCall64+<span class="number">289</span>                                          loc_FFFFF8034C87BD49:                   <span class="comment">; CODE XREF: KiSystemCall64+282↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">289</span>  <span class="number">190</span> F6 <span class="number">43</span> <span class="number">03</span> <span class="number">04</span>                                         <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rbx</span>+<span class="number">3</span>], <span class="number">100b</span> <span class="comment">;  _KPCR.Prcb.CurrentThread.DispatchHeader.DebugActive.Minimal</span></span><br><span class="line">KiSystemCall64+<span class="number">28D</span>  <span class="number">190</span> <span class="number">74</span> 2E                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87BD7D <span class="comment">; _KPCR.Prcb.CurrentThread.DispatchHeader.DebugActive.UmsPrimary</span></span><br><span class="line">KiSystemCall64+28F  <span class="number">190</span> 4C <span class="number">89</span> <span class="number">55</span> E0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">20h</span>], <span class="built_in">r10</span>  <span class="comment">; _KTRAP_FRAME.r11=r10</span></span><br><span class="line">KiSystemCall64+<span class="number">293</span>  <span class="number">190</span> 4C <span class="number">89</span> <span class="number">55</span> D8                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">28h</span>], <span class="built_in">r10</span>  <span class="comment">; _KTRAP_FRAME.r10=r10</span></span><br><span class="line">KiSystemCall64+<span class="number">297</span>  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">45</span> F0                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>-<span class="number">10h</span>], <span class="built_in">xmm0</span> <span class="comment">; 保存xmm寄存器到_KTRAP_FRAME</span></span><br><span class="line">KiSystemCall64+29B  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">4D</span> <span class="number">00</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">0</span>], <span class="built_in">xmm1</span></span><br><span class="line">KiSystemCall64+29F  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">55</span> <span class="number">10</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">10h</span>], <span class="built_in">xmm2</span></span><br><span class="line">KiSystemCall64+2A3  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">5D</span> <span class="number">20</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">20h</span>], <span class="built_in">xmm3</span></span><br><span class="line">KiSystemCall64+2A7  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">65</span> <span class="number">30</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">30h</span>], <span class="built_in">xmm4</span></span><br><span class="line">KiSystemCall64+2AB  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">6D</span> <span class="number">40</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">40h</span>], <span class="built_in">xmm5</span></span><br><span class="line">KiSystemCall64+2AF  <span class="number">190</span> FB                                                  <span class="keyword">sti</span>                     <span class="comment">; 开中断</span></span><br><span class="line">KiSystemCall64+2B0  <span class="number">190</span> <span class="number">48</span> 8B CC                                            <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">rsp</span></span><br><span class="line">KiSystemCall64+2B3  <span class="number">190</span> E8 <span class="number">48</span> <span class="number">98</span> 6F <span class="number">00</span>                                      <span class="keyword">call</span>    PsPicoSystemCallDispatch <span class="comment">; 如果当前thread-&gt;_DISPATCHER_HEADER中设置了Minimal标志位，</span></span><br><span class="line">KiSystemCall64+2B3                                                                                  <span class="comment">; 则KiSystemCall64会调用nt!PsPicoSystemCallDispatch进行pico相关分发，</span></span><br><span class="line">KiSystemCall64+2B3                                                                                  <span class="comment">; 不走原始的sdt分发表。</span></span><br><span class="line">KiSystemCall64+2B8  <span class="number">190</span> E9 <span class="number">98</span> <span class="number">04</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">jmp</span>     KiSystemServiceExitPico</span><br><span class="line">KiSystemCall64+2BD                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64+2BD</span><br><span class="line">KiSystemCall64+2BD                                          loc_FFFFF8034C87BD7D:                   <span class="comment">; CODE XREF: KiSystemCall64+28D↑j</span></span><br><span class="line">KiSystemCall64+2BD  <span class="number">190</span> F6 <span class="number">43</span> <span class="number">03</span> <span class="number">80</span>                                         <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rbx</span>+<span class="number">3</span>], <span class="number">80h</span> <span class="comment">; '€' ; _KPCR.Prcb.CurrentThread.DispatchHeader.DebugActive.UmsPrimary</span></span><br><span class="line">KiSystemCall64+2C1  <span class="number">190</span> <span class="number">74</span> <span class="number">48</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87BDCB <span class="comment">; CurrentThread.DispatchHeader.DebugActive.UmsScheduled</span></span><br><span class="line">KiSystemCall64+2C3  <span class="number">190</span> B9 <span class="number">02</span> <span class="number">01</span> <span class="number">00</span> C0                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">0C0000102h</span> <span class="comment">; IA32_KERNEL_GS_BASE</span></span><br><span class="line">KiSystemCall64+2C8  <span class="number">190</span> 0F <span class="number">32</span>                                               <span class="keyword">rdmsr</span>                   <span class="comment">; 读取用户层的GS地址</span></span><br><span class="line">KiSystemCall64+2C8                                                                                  <span class="comment">; edx存着高32位地址，eax存着低32位地址</span></span><br><span class="line">KiSystemCall64+2CA  <span class="number">190</span> <span class="number">48</span> C1 E2 <span class="number">20</span>                                         <span class="keyword">shl</span>     <span class="built_in">rdx</span>, <span class="number">32</span></span><br><span class="line">KiSystemCall64+2CE  <span class="number">190</span> <span class="number">48</span> <span class="number">0B</span> C2                                            <span class="keyword">or</span>      <span class="built_in">rax</span>, <span class="built_in">rdx</span>        <span class="comment">; rax = r3.gs_base 指向TEB</span></span><br><span class="line">KiSystemCall64+2D1  <span class="number">190</span> <span class="number">48</span> 3B <span class="number">05</span> E0 F7 1A <span class="number">00</span>                                <span class="keyword">cmp</span>     <span class="built_in">rax</span>, <span class="built_in">cs</span>:MmUserProbeAddress <span class="comment">; MmUserProbeAddress是一个全局变量，</span></span><br><span class="line">KiSystemCall64+2D1                                                                                  <span class="comment">; 它保存着一个将用户空间与内核空间分开的地址。</span></span><br><span class="line">KiSystemCall64+2D1                                                                                  <span class="comment">; 与此值的比较用于确定地址是指向用户空间还是内核空间。</span></span><br><span class="line">KiSystemCall64+2D8  <span class="number">190</span> <span class="number">48</span> 0F <span class="number">43</span> <span class="number">05</span> D8 F7 1A <span class="number">00</span>                             <span class="keyword">cmovnb</span>  <span class="built_in">rax</span>, <span class="built_in">cs</span>:MmUserProbeAddress <span class="comment">; 如果大于等于，rax = MmUserProbeAddress</span></span><br><span class="line">KiSystemCall64+2E0  <span class="number">190</span> <span class="number">48</span> <span class="number">39</span> <span class="number">83</span> F0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">cmp</span>     [<span class="built_in">rbx</span>+<span class="number">0F0h</span>], <span class="built_in">rax</span> <span class="comment">; CurrentThread.TEB 和TEB比较</span></span><br><span class="line">KiSystemCall64+2E7  <span class="number">190</span> <span class="number">74</span> <span class="number">22</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87BDCB <span class="comment">; CurrentThread.DispatchHeader.DebugActive.UmsScheduled</span></span><br><span class="line">KiSystemCall64+2E9  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">93</span> F0 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rdx</span>, [<span class="built_in">rbx</span>+<span class="number">1F0h</span>] <span class="comment">; rdx = _KTHREAD.WaitBlock[3].Object</span></span><br><span class="line">KiSystemCall64+2F0  <span class="number">190</span> 0F BA 6B <span class="number">74</span> <span class="number">08</span>                                      <span class="keyword">bts</span>     <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rbx</span>+<span class="number">74h</span>], <span class="number">8</span> <span class="comment">; _KTHREAD.MiscFlags.UmsDirectedSwitchEnable</span></span><br><span class="line">KiSystemCall64+2F5  <span class="number">190</span> <span class="number">66</span> FF 8B E6 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">dec</span>     <span class="built_in">word</span> <span class="built_in">ptr</span> [<span class="built_in">rbx</span>+<span class="number">1E6h</span>] <span class="comment">; _KTHREAD.SpecialApcDisable</span></span><br><span class="line">KiSystemCall64+2FC  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">82</span> <span class="number">80</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     [<span class="built_in">rdx</span>+<span class="number">80h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">303</span>  <span class="number">190</span> FB                                                  <span class="keyword">sti</span>                     <span class="comment">; 开中断</span></span><br><span class="line">KiSystemCall64+<span class="number">304</span>  <span class="number">190</span> E8 F7 <span class="number">12</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">call</span>    KiUmsCallEntry  <span class="comment">; https://www.cnblogs.com/DreamoneOnly/p/13300318.html</span></span><br><span class="line">KiSystemCall64+<span class="number">309</span>  <span class="number">190</span> EB <span class="number">0B</span>                                               <span class="keyword">jmp</span>     short loc_FFFFF8034C87BDD6 <span class="comment">; r8 = _KTRAP_FRAME.r8</span></span><br><span class="line">KiSystemCall64+30B                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64+30B</span><br><span class="line">KiSystemCall64+30B                                          loc_FFFFF8034C87BDCB:                   <span class="comment">; CODE XREF: KiSystemCall64+2C1↑j</span></span><br><span class="line">KiSystemCall64+30B                                                                                  <span class="comment">; KiSystemCall64+2E7↑j</span></span><br><span class="line">KiSystemCall64+30B  <span class="number">190</span> F6 <span class="number">43</span> <span class="number">03</span> <span class="number">40</span>                                         <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rbx</span>+<span class="number">3</span>], <span class="number">40h</span> <span class="comment">; '@' ; CurrentThread.DispatchHeader.DebugActive.UmsScheduled</span></span><br><span class="line">KiSystemCall64+30F  <span class="number">190</span> <span class="number">74</span> <span class="number">05</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87BDD6 <span class="comment">; r8 = _KTRAP_FRAME.r8</span></span><br><span class="line">KiSystemCall64+<span class="number">311</span>  <span class="number">190</span> 0F BA 6B <span class="number">74</span> <span class="number">10</span>                                      <span class="keyword">bts</span>     <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rbx</span>+<span class="number">74h</span>], <span class="number">16</span> <span class="comment">; MiscFlags.UmsPerformingSyscall</span></span><br><span class="line">KiSystemCall64+<span class="number">316</span></span><br><span class="line">KiSystemCall64+<span class="number">316</span>                                          loc_FFFFF8034C87BDD6:                   <span class="comment">; CODE XREF: KiSystemCall64+309↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">316</span>                                                                                  <span class="comment">; KiSystemCall64+30F↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">316</span>  <span class="number">190</span> 4C 8B <span class="number">45</span> C8                                         <span class="keyword">mov</span>     <span class="built_in">r8</span>, [<span class="built_in">rbp</span>-<span class="number">38h</span>]   <span class="comment">; r8 = _KTRAP_FRAME.r8</span></span><br><span class="line">KiSystemCall64+31A  <span class="number">190</span> 4C 8B <span class="number">4D</span> D0                                         <span class="keyword">mov</span>     <span class="built_in">r9</span>, [<span class="built_in">rbp</span>-<span class="number">30h</span>]   <span class="comment">; r9 = _KTRAP_FRAME.r9</span></span><br><span class="line">KiSystemCall64+31E</span><br><span class="line">KiSystemCall64+31E                                          loc_FFFFF8034C87BDDE:                   <span class="comment">; CODE XREF: KiSystemCall64+270↑j</span></span><br><span class="line">KiSystemCall64+31E  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">45</span> B0                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>-<span class="number">50h</span>]  <span class="comment">; rax = _KTRAP_FRAME.rax</span></span><br><span class="line">KiSystemCall64+<span class="number">322</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">4D</span> B8                                         <span class="keyword">mov</span>     <span class="built_in">rcx</span>, [<span class="built_in">rbp</span>-<span class="number">48h</span>]  <span class="comment">; rcx = _KTRAP_FRAME.rcx</span></span><br><span class="line">KiSystemCall64+<span class="number">326</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">55</span> C0                                         <span class="keyword">mov</span>     <span class="built_in">rdx</span>, [<span class="built_in">rbp</span>-<span class="number">40h</span>]  <span class="comment">; rdx = _KTRAP_FRAME.rdx</span></span><br><span class="line">KiSystemCall64+32A  <span class="number">190</span> FB                                                  <span class="keyword">sti</span>                     <span class="comment">; 开中断</span></span><br><span class="line">KiSystemCall64+32B  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> 8B <span class="number">88</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     [<span class="built_in">rbx</span>+<span class="number">88h</span>], <span class="built_in">rcx</span>  <span class="comment">; _KTHREAD.FirstArgument = rcx</span></span><br><span class="line">KiSystemCall64+<span class="number">332</span>  <span class="number">190</span> <span class="number">89</span> <span class="number">83</span> <span class="number">80</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">mov</span>     [<span class="built_in">rbx</span>+<span class="number">80h</span>], <span class="built_in">eax</span>  <span class="comment">; 记录调用号</span></span><br><span class="line">KiSystemCall64+<span class="number">332</span>                                                                                  <span class="comment">; _KTHREAD.SystemCallNumber = eax</span></span><br><span class="line">KiSystemCall64+<span class="number">338</span>  <span class="number">190</span> 0F 1F <span class="number">84</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">nop</span>     <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rax</span>+<span class="built_in">rax</span>+<span class="number">00000000h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">340</span></span><br><span class="line">KiSystemCall64+<span class="number">340</span>                                          KiSystemServiceStart:                   <span class="comment">; DATA XREF: KiServiceInternal+5A↑o</span></span><br><span class="line">KiSystemCall64+<span class="number">340</span>                                                                                  <span class="comment">; .data:FFFFF8034CACF340↓o</span></span><br><span class="line">KiSystemCall64+<span class="number">340</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> A3 <span class="number">90</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     [<span class="built_in">rbx</span>+<span class="number">90h</span>], <span class="built_in">rsp</span>  <span class="comment">; 记录之前构造的_KTRAP_FRAME</span></span><br><span class="line">KiSystemCall64+<span class="number">340</span>                                                                                  <span class="comment">; _KTHREAD.SystemCallNumber = rsp</span></span><br><span class="line">KiSystemCall64+<span class="number">347</span>  <span class="number">190</span> 8B F8                                               <span class="keyword">mov</span>     <span class="built_in">edi</span>, <span class="built_in">eax</span></span><br><span class="line">KiSystemCall64+<span class="number">349</span>  <span class="number">190</span> C1 EF <span class="number">07</span>                                            <span class="keyword">shr</span>     <span class="built_in">edi</span>, <span class="number">7</span>          <span class="comment">; 除以128</span></span><br><span class="line">KiSystemCall64+34C  <span class="number">190</span> <span class="number">83</span> E7 <span class="number">20</span>                                            <span class="keyword">and</span>     <span class="built_in">edi</span>, <span class="number">20h</span> <span class="comment">; ' '  ; 计算偏移号</span></span><br><span class="line">KiSystemCall64+34F  <span class="number">190</span> <span class="number">25</span> FF 0F <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">and</span>     <span class="built_in">eax</span>, <span class="number">0FFFh</span>      <span class="comment">; 修正调用号</span></span><br><span class="line">KiSystemCall64+34F                                                                                  <span class="comment">; GDI 系统调用（调用号&gt;= 0x1000</span></span><br><span class="line">KiSystemCall64+<span class="number">354</span></span><br><span class="line">KiSystemCall64+<span class="number">354</span>                                          KiSystemServiceRepeat:                  <span class="comment">; CODE XREF: KiSystemCall64+8EE↓j</span></span><br><span class="line">KiSystemCall64+<span class="number">354</span>  <span class="number">190</span> 4C <span class="number">8D</span> <span class="number">15</span> <span class="number">65</span> 9A 3B <span class="number">00</span>                                <span class="keyword">lea</span>     <span class="built_in">r10</span>, KeServiceDescriptorTable <span class="comment">;</span></span><br><span class="line">KiSystemCall64+<span class="number">354</span>                                                                                  <span class="comment">; #pragma pack(1)</span></span><br><span class="line">KiSystemCall64+<span class="number">354</span>                                                                                  <span class="comment">; typedef struct _SERVICE_DESCIPTOR_TABLE</span></span><br><span class="line">KiSystemCall64+<span class="number">354</span>                                                                                  <span class="comment">; &#123;</span></span><br><span class="line">KiSystemCall64+<span class="number">354</span>                                                                                  <span class="comment">;    PULONG ServiceTableBase;          // SSDT基址</span></span><br><span class="line">KiSystemCall64+<span class="number">354</span>                                                                                  <span class="comment">;    PVOID ServiceCounterTableBase; // SSDT中服务被调用次数计数器</span></span><br><span class="line">KiSystemCall64+<span class="number">354</span>                                                                                  <span class="comment">;    ULONGLONG NumberOfService;     // SSDT服务个数</span></span><br><span class="line">KiSystemCall64+<span class="number">354</span>                                                                                  <span class="comment">;    PVOID ParamTableBase;          // 系统服务参数表基址</span></span><br><span class="line">KiSystemCall64+<span class="number">354</span>                                                                                  <span class="comment">; &#125;SSDTEntry, *PSSDTEntry;</span></span><br><span class="line">KiSystemCall64+<span class="number">354</span>                                                                                  <span class="comment">; #pragma pack()</span></span><br><span class="line">KiSystemCall64+35B  <span class="number">190</span> 4C <span class="number">8D</span> <span class="number">1D</span> 5E 1C 3A <span class="number">00</span>                                <span class="keyword">lea</span>     <span class="built_in">r11</span>, KeServiceDescriptorTableShadow</span><br><span class="line">KiSystemCall64+<span class="number">362</span>  <span class="number">190</span> F7 <span class="number">43</span> <span class="number">78</span> <span class="number">80</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">test</span>    <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rbx</span>+<span class="number">78h</span>], <span class="number">80h</span> <span class="comment">; '€' ; _KTHREAD.ThreadFlags.GuiThread</span></span><br><span class="line">KiSystemCall64+<span class="number">362</span>                                                                                  <span class="comment">; 判断是否是gui线程</span></span><br><span class="line">KiSystemCall64+<span class="number">369</span>  <span class="number">190</span> <span class="number">74</span> <span class="number">13</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87BE3E <span class="comment">; 判断是否越界 _KSYSTEM_SERVICE_TABLE.NumberOfService</span></span><br><span class="line">KiSystemCall64+36B  <span class="number">190</span> F7 <span class="number">43</span> <span class="number">78</span> <span class="number">00</span> <span class="number">00</span> <span class="number">20</span> <span class="number">00</span>                                <span class="keyword">test</span>    <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rbx</span>+<span class="number">78h</span>], <span class="number">200000h</span> <span class="comment">; 是否启用系统调用过滤，如果启用系统调用过滤，会在进程级别上进行检测</span></span><br><span class="line">KiSystemCall64+<span class="number">372</span>  <span class="number">190</span> <span class="number">74</span> <span class="number">07</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87BE3B</span><br><span class="line">KiSystemCall64+<span class="number">374</span>  <span class="number">190</span> 4C <span class="number">8D</span> <span class="number">1D</span> <span class="number">85</span> 1C 3A <span class="number">00</span>                                <span class="keyword">lea</span>     <span class="built_in">r11</span>, KeServiceDescriptorTableFilter <span class="comment">; r11 = SSDTFilter</span></span><br><span class="line">KiSystemCall64+37B</span><br><span class="line">KiSystemCall64+37B                                          loc_FFFFF8034C87BE3B:                   <span class="comment">; CODE XREF: KiSystemCall64+372↑j</span></span><br><span class="line">KiSystemCall64+37B  <span class="number">190</span> <span class="number">4D</span> 8B D3                                            <span class="keyword">mov</span>     <span class="built_in">r10</span>, <span class="built_in">r11</span></span><br><span class="line">KiSystemCall64+37E</span><br><span class="line">KiSystemCall64+37E                                          loc_FFFFF8034C87BE3E:                   <span class="comment">; CODE XREF: KiSystemCall64+369↑j</span></span><br><span class="line">KiSystemCall64+37E  <span class="number">190</span> <span class="number">41</span> 3B <span class="number">44</span> 3A <span class="number">10</span>                                      <span class="keyword">cmp</span>     <span class="built_in">eax</span>, [<span class="built_in">r10</span>+<span class="built_in">rdi</span>+<span class="number">10h</span>] <span class="comment">; 判断是否越界 _KSYSTEM_SERVICE_TABLE.NumberOfService</span></span><br><span class="line">KiSystemCall64+<span class="number">383</span>  <span class="number">190</span> 0F <span class="number">83</span> 2C <span class="number">05</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">jnb</span>     loc_FFFFF8034C87C375</span><br><span class="line">KiSystemCall64+<span class="number">389</span>  <span class="number">190</span> <span class="number">4D</span> 8B <span class="number">14</span> 3A                                         <span class="keyword">mov</span>     <span class="built_in">r10</span>, [<span class="built_in">r10</span>+<span class="built_in">rdi</span>]  <span class="comment">; r10 = _KSYSTEM_SERVICE_TABLE.ServiceTableBase</span></span><br><span class="line">KiSystemCall64+<span class="number">38D</span>  <span class="number">190</span> <span class="number">4D</span> <span class="number">63</span> 1C <span class="number">82</span>                                         <span class="keyword">movsxd</span>  <span class="built_in">r11</span>, <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">r10</span>+<span class="built_in">rax</span>*<span class="number">4</span>] <span class="comment">; 获取调用号的SSDT [ServiceTableBase + SystemCallNumber * 4]</span></span><br><span class="line">KiSystemCall64+<span class="number">391</span>  <span class="number">190</span> <span class="number">49</span> 8B C3                                            <span class="keyword">mov</span>     <span class="built_in">rax</span>, <span class="built_in">r11</span></span><br><span class="line">KiSystemCall64+<span class="number">394</span>  <span class="number">190</span> <span class="number">49</span> C1 FB <span class="number">04</span>                                         <span class="keyword">sar</span>     <span class="built_in">r11</span>, <span class="number">4</span>          <span class="comment">; https://bbs.pediy.com/thread-194447.htm</span></span><br><span class="line">KiSystemCall64+<span class="number">394</span>                                                                                  <span class="comment">; 这个四节的偏移最后四位是例程的参数个数，所以需要右移四位后取得真正的偏移</span></span><br><span class="line">KiSystemCall64+<span class="number">394</span>                                                                                  <span class="comment">; r11 &gt;&gt; 4</span></span><br><span class="line">KiSystemCall64+<span class="number">398</span>  <span class="number">190</span> <span class="number">4D</span> <span class="number">03</span> D3                                            <span class="keyword">add</span>     <span class="built_in">r10</span>, <span class="built_in">r11</span>        <span class="comment">; r10 = ServiceTableBase +  r11</span></span><br><span class="line">KiSystemCall64+39B  <span class="number">190</span> <span class="number">83</span> FF <span class="number">20</span>                                            <span class="keyword">cmp</span>     <span class="built_in">edi</span>, <span class="number">20h</span> <span class="comment">; ' '  ; 检查是否是gdi的API，0x20&lt;&lt;4 = 0x1000</span></span><br><span class="line">KiSystemCall64+39E  <span class="number">190</span> <span class="number">75</span> <span class="number">50</span>                                               <span class="keyword">jnz</span>     short loc_FFFFF8034C87BEB0 <span class="comment">; 获取参数个数</span></span><br><span class="line">KiSystemCall64+3A0  <span class="number">190</span> 4C 8B 9B F0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">r11</span>, [<span class="built_in">rbx</span>+<span class="number">0F0h</span>] <span class="comment">; _KTHREAD.TEB</span></span><br><span class="line">KiSystemCall64+3A7</span><br><span class="line">KiSystemCall64+3A7                                          KiSystemServiceGdiTebAccess:            <span class="comment">; DATA XREF: KiSystemServiceHandler+D↑o</span></span><br><span class="line">KiSystemCall64+3A7  <span class="number">190</span> <span class="number">41</span> <span class="number">83</span> BB <span class="number">40</span> <span class="number">17</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">cmp</span>     <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">r11</span>+<span class="number">1740h</span>], <span class="number">0</span> <span class="comment">; _KTHREAD.TEB.GdiBatchCount</span></span><br><span class="line">KiSystemCall64+3AF  <span class="number">190</span> <span class="number">74</span> 3F                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87BEB0 <span class="comment">; 获取参数个数</span></span><br><span class="line">KiSystemCall64+3B1  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> B0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">50h</span>], <span class="built_in">rax</span>  <span class="comment">; 保存 _KTRAP_FRAME ra,rcx,rdx</span></span><br><span class="line">KiSystemCall64+3B5  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">4D</span> B8                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">48h</span>], <span class="built_in">rcx</span></span><br><span class="line">KiSystemCall64+3B9  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">55</span> C0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">40h</span>], <span class="built_in">rdx</span></span><br><span class="line">KiSystemCall64+3BD  <span class="number">190</span> <span class="number">49</span> 8B D8                                            <span class="keyword">mov</span>     <span class="built_in">rbx</span>, <span class="built_in">r8</span>         <span class="comment">; 保存 r8 r9 r10</span></span><br><span class="line">KiSystemCall64+3C0  <span class="number">190</span> <span class="number">49</span> 8B F9                                            <span class="keyword">mov</span>     <span class="built_in">rdi</span>, <span class="built_in">r9</span></span><br><span class="line">KiSystemCall64+3C3  <span class="number">190</span> <span class="number">49</span> 8B F2                                            <span class="keyword">mov</span>     <span class="built_in">rsi</span>, <span class="built_in">r10</span></span><br><span class="line">KiSystemCall64+3C6  <span class="number">190</span> B9 <span class="number">07</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">7</span></span><br><span class="line">KiSystemCall64+3CB  <span class="number">190</span> <span class="number">33</span> D2                                               <span class="keyword">xor</span>     <span class="built_in">edx</span>, <span class="built_in">edx</span></span><br><span class="line">KiSystemCall64+3CD  <span class="number">190</span> <span class="number">4D</span> <span class="number">33</span> C0                                            <span class="keyword">xor</span>     <span class="built_in">r8</span>, <span class="built_in">r8</span></span><br><span class="line">KiSystemCall64+3D0  <span class="number">190</span> <span class="number">4D</span> <span class="number">33</span> C9                                            <span class="keyword">xor</span>     <span class="built_in">r9</span>, <span class="built_in">r9</span></span><br><span class="line">KiSystemCall64+3D3  <span class="number">190</span> E8 <span class="number">48</span> 1A <span class="number">40</span> <span class="number">00</span>                                      <span class="keyword">call</span>    PsInvokeWin32Callout</span><br><span class="line">KiSystemCall64+3D8  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">45</span> B0                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>-<span class="number">50h</span>]  <span class="comment">; 恢复寄存器</span></span><br><span class="line">KiSystemCall64+3DC  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">4D</span> B8                                         <span class="keyword">mov</span>     <span class="built_in">rcx</span>, [<span class="built_in">rbp</span>-<span class="number">48h</span>]</span><br><span class="line">KiSystemCall64+3E0  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">55</span> C0                                         <span class="keyword">mov</span>     <span class="built_in">rdx</span>, [<span class="built_in">rbp</span>-<span class="number">40h</span>]</span><br><span class="line">KiSystemCall64+3E4  <span class="number">190</span> 4C 8B C3                                            <span class="keyword">mov</span>     <span class="built_in">r8</span>, <span class="built_in">rbx</span></span><br><span class="line">KiSystemCall64+3E7  <span class="number">190</span> 4C 8B CF                                            <span class="keyword">mov</span>     <span class="built_in">r9</span>, <span class="built_in">rdi</span></span><br><span class="line">KiSystemCall64+3EA  <span class="number">190</span> 4C 8B D6                                            <span class="keyword">mov</span>     <span class="built_in">r10</span>, <span class="built_in">rsi</span></span><br><span class="line">KiSystemCall64+3ED  <span class="number">190</span> 0F 1F <span class="number">00</span>                                            <span class="keyword">nop</span>     <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rax</span>]</span><br><span class="line">KiSystemCall64+3F0</span><br><span class="line">KiSystemCall64+3F0                                          loc_FFFFF8034C87BEB0:                   <span class="comment">; CODE XREF: KiSystemCall64+39E↑j</span></span><br><span class="line">KiSystemCall64+3F0                                                                                  <span class="comment">; KiSystemCall64+3AF↑j</span></span><br><span class="line">KiSystemCall64+3F0  <span class="number">190</span> <span class="number">83</span> E0 0F                                            <span class="keyword">and</span>     <span class="built_in">eax</span>, <span class="number">1111b</span>      <span class="comment">; 获取参数个数</span></span><br><span class="line">KiSystemCall64+3F3  <span class="number">190</span> 0F <span class="number">84</span> B7 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">jz</span>      KiSystemServiceCopyEnd <span class="comment">; 是否存在动态跟踪</span></span><br><span class="line">KiSystemCall64+3F9  <span class="number">190</span> C1 E0 <span class="number">03</span>                                            <span class="keyword">shl</span>     <span class="built_in">eax</span>, <span class="number">3</span>          <span class="comment">; 根据栈上参数个数*8，计算 KiSystemServiceCopyStart函数调用偏移</span></span><br><span class="line">KiSystemCall64+3FC  <span class="number">190</span> <span class="number">48</span> <span class="number">8D</span> <span class="number">64</span> <span class="number">24</span> <span class="number">90</span>                                      <span class="keyword">lea</span>     <span class="built_in">rsp</span>, [<span class="built_in">rsp</span>-<span class="number">70h</span>]  <span class="comment">; 开辟70h的栈</span></span><br><span class="line">KiSystemCall64+<span class="number">401</span>  <span class="number">200</span> <span class="number">48</span> <span class="number">8D</span> 7C <span class="number">24</span> <span class="number">18</span>                                      <span class="keyword">lea</span>     <span class="built_in">rdi</span>, [<span class="built_in">rsp</span>+<span class="number">18h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">406</span>  <span class="number">200</span> <span class="number">48</span> 8B B5 <span class="number">00</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rsi</span>, [<span class="built_in">rbp</span>+<span class="number">100h</span>] <span class="comment">; rsi = _KTRAP_FRAME.Rsp</span></span><br><span class="line">KiSystemCall64+<span class="number">40D</span>  <span class="number">200</span> <span class="number">48</span> <span class="number">8D</span> <span class="number">76</span> <span class="number">20</span>                                         <span class="keyword">lea</span>     <span class="built_in">rsi</span>, [<span class="built_in">rsi</span>+<span class="number">20h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">411</span>  <span class="number">200</span> F6 <span class="number">85</span> F0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">01</span>                                <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">0F0h</span>], <span class="number">1</span> <span class="comment">; _KTRAP_FRAME.SegCs 检查初始调用权限</span></span><br><span class="line">KiSystemCall64+<span class="number">418</span>  <span class="number">200</span> <span class="number">74</span> <span class="number">16</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87BEF0</span><br><span class="line">KiSystemCall64+41A  <span class="number">200</span> <span class="number">48</span> 3B <span class="number">35</span> <span class="number">97</span> F6 1A <span class="number">00</span>                                <span class="keyword">cmp</span>     <span class="built_in">rsi</span>, <span class="built_in">cs</span>:MmUserProbeAddress</span><br><span class="line">KiSystemCall64+<span class="number">421</span>  <span class="number">200</span> <span class="number">48</span> 0F <span class="number">43</span> <span class="number">35</span> 8F F6 1A <span class="number">00</span>                             <span class="keyword">cmovnb</span>  <span class="built_in">rsi</span>, <span class="built_in">cs</span>:MmUserProbeAddress <span class="comment">; rsi = 内核地址</span></span><br><span class="line">KiSystemCall64+<span class="number">429</span>  <span class="number">200</span> 0F 1F <span class="number">80</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">nop</span>     <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rax</span>+<span class="number">00000000h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">430</span></span><br><span class="line">KiSystemCall64+<span class="number">430</span>                                          loc_FFFFF8034C87BEF0:                   <span class="comment">; CODE XREF: KiSystemCall64+418↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">430</span>  <span class="number">200</span> 4C <span class="number">8D</span> <span class="number">1D</span> <span class="number">79</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">lea</span>     <span class="built_in">r11</span>, KiSystemServiceCopyEnd <span class="comment">; 是否存在动态跟踪</span></span><br><span class="line">KiSystemCall64+<span class="number">437</span>  <span class="number">200</span> 4C 2B D8                                            <span class="keyword">sub</span>     <span class="built_in">r11</span>, <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+43A  <span class="number">200</span> <span class="number">41</span> FF E3                                            <span class="keyword">jmp</span>     <span class="built_in">r11</span></span><br><span class="line">KiSystemCall64+43A                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64+<span class="number">43D</span>  <span class="number">190</span> CC CC CC                                            <span class="meta">align</span> <span class="number">20h</span></span><br><span class="line">KiSystemCall64+<span class="number">440</span></span><br><span class="line">KiSystemCall64+<span class="number">440</span>                                          KiSystemServiceCopyStart:               <span class="comment">; DATA XREF: KiSystemServiceHandler+1A↑o</span></span><br><span class="line">KiSystemCall64+<span class="number">440</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">46</span> <span class="number">70</span>                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rsi</span>+<span class="number">70h</span>]  <span class="comment">; 拷贝r3栈上的参数到0环的栈上</span></span><br><span class="line">KiSystemCall64+<span class="number">444</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">47</span> <span class="number">70</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rdi</span>+<span class="number">70h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">448</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">46</span> <span class="number">68</span>                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rsi</span>+<span class="number">68h</span>]</span><br><span class="line">KiSystemCall64+44C  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">47</span> <span class="number">68</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rdi</span>+<span class="number">68h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">450</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">46</span> <span class="number">60</span>                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rsi</span>+<span class="number">60h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">454</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">47</span> <span class="number">60</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rdi</span>+<span class="number">60h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">458</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">46</span> <span class="number">58</span>                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rsi</span>+<span class="number">58h</span>]</span><br><span class="line">KiSystemCall64+45C  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">47</span> <span class="number">58</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rdi</span>+<span class="number">58h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">460</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">46</span> <span class="number">50</span>                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rsi</span>+<span class="number">50h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">464</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">47</span> <span class="number">50</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rdi</span>+<span class="number">50h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">468</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">46</span> <span class="number">48</span>                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rsi</span>+<span class="number">48h</span>]</span><br><span class="line">KiSystemCall64+46C  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">47</span> <span class="number">48</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rdi</span>+<span class="number">48h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">470</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">46</span> <span class="number">40</span>                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rsi</span>+<span class="number">40h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">474</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">47</span> <span class="number">40</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rdi</span>+<span class="number">40h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">478</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">46</span> <span class="number">38</span>                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rsi</span>+<span class="number">38h</span>]</span><br><span class="line">KiSystemCall64+47C  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">47</span> <span class="number">38</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rdi</span>+<span class="number">38h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">480</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">46</span> <span class="number">30</span>                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rsi</span>+<span class="number">30h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">484</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">47</span> <span class="number">30</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rdi</span>+<span class="number">30h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">488</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">46</span> <span class="number">28</span>                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rsi</span>+<span class="number">28h</span>]</span><br><span class="line">KiSystemCall64+48C  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">47</span> <span class="number">28</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rdi</span>+<span class="number">28h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">490</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">46</span> <span class="number">20</span>                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rsi</span>+<span class="number">20h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">494</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">47</span> <span class="number">20</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rdi</span>+<span class="number">20h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">498</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">46</span> <span class="number">18</span>                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rsi</span>+<span class="number">18h</span>]</span><br><span class="line">KiSystemCall64+49C  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">47</span> <span class="number">18</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rdi</span>+<span class="number">18h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+4A0  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">46</span> <span class="number">10</span>                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rsi</span>+<span class="number">10h</span>]</span><br><span class="line">KiSystemCall64+4A4  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">47</span> <span class="number">10</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rdi</span>+<span class="number">10h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+4A8  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">46</span> <span class="number">08</span>                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rsi</span>+<span class="number">8</span>]</span><br><span class="line">KiSystemCall64+4AC  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">47</span> <span class="number">08</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rdi</span>+<span class="number">8</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+4B0</span><br><span class="line">KiSystemCall64+4B0                                          KiSystemServiceCopyEnd:                 <span class="comment">; CODE XREF: KiSystemCall64+3F3↑j</span></span><br><span class="line">KiSystemCall64+4B0                                                                                  <span class="comment">; DATA XREF: KiSystemServiceHandler+27↑o</span></span><br><span class="line">KiSystemCall64+4B0                                                                                  <span class="comment">; KiSystemCall64:loc_FFFFF8034C87BEF0↑o</span></span><br><span class="line">KiSystemCall64+4B0  <span class="number">190</span> F7 <span class="number">05</span> <span class="number">06</span> <span class="number">16</span> 3A <span class="number">00</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                       <span class="keyword">test</span>    <span class="built_in">cs</span>:KiDynamicTraceMask, <span class="number">1</span> <span class="comment">; 是否存在动态跟踪</span></span><br><span class="line">KiSystemCall64+4BA  <span class="number">190</span> 0F <span class="number">85</span> <span class="number">93</span> <span class="number">04</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">jnz</span>     loc_FFFFF8034C87C413</span><br><span class="line">KiSystemCall64+4C0  <span class="number">190</span> F7 <span class="number">05</span> 7E <span class="number">14</span> 3A <span class="number">00</span> <span class="number">40</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                       <span class="keyword">test</span>    <span class="built_in">dword</span> <span class="built_in">ptr</span> <span class="built_in">cs</span>:PerfGlobalGroupMask+<span class="number">8</span>, <span class="number">64</span> <span class="comment">; https://www.twblogs.net/a/5b88c3872b71775d1cde365d</span></span><br><span class="line">KiSystemCall64+4C0                                                                                  <span class="comment">; 內核日誌記錄器是一個事件提供者，它有一個預定義GUID，即內核變量SystemTraceControlGuid。內核日誌記錄器支持多種事件類，採用標誌位（flag）來指示是否記錄某一類型的事件。進一步將這些事件分爲8個組，每個組使用一個掩碼（29位）來描述。系統的全局組掩碼是由全局變量PerfGlobalGroupMask定義的。</span></span><br><span class="line">KiSystemCall64+4CA  <span class="number">190</span> 0F <span class="number">85</span> F7 <span class="number">04</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">jnz</span>     loc_FFFFF8034C87C487</span><br><span class="line">KiSystemCall64+4D0  <span class="number">190</span> <span class="number">49</span> 8B C2                                            <span class="keyword">mov</span>     <span class="built_in">rax</span>, <span class="built_in">r10</span></span><br><span class="line">KiSystemCall64+4D3  <span class="number">190</span> FF D0                                               <span class="keyword">call</span>    <span class="built_in">rax</span>             <span class="comment">; +++调用计算出来的系统服务例程+++</span></span><br><span class="line">KiSystemCall64+4D5  <span class="number">190</span> 0F 1F <span class="number">00</span>                                            <span class="keyword">nop</span>     <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rax</span>]</span><br><span class="line">KiSystemCall64+4D8</span><br><span class="line">KiSystemCall64+4D8                                          loc_FFFFF8034C87BF98:                   <span class="comment">; CODE XREF: KiSystemCall64+9C2↓j</span></span><br><span class="line">KiSystemCall64+4D8                                                                                  <span class="comment">; KiSystemCall64+A19↓j</span></span><br><span class="line">KiSystemCall64+4D8  <span class="number">190</span> <span class="number">65</span> FF <span class="number">04</span> <span class="number">25</span> B8 2E <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">inc</span>     <span class="built_in">dword</span> <span class="built_in">ptr</span> <span class="built_in">gs</span>:<span class="number">2EB8h</span> <span class="comment">; kpcr._KPRCB.KeSystemCalls + 1</span></span><br><span class="line">KiSystemCall64+4D8                                                                                  <span class="comment">; 自系统启动以来发生的系统调用数量的单调计数器。</span></span><br><span class="line">KiSystemCall64+4E0</span><br><span class="line">KiSystemCall64+4E0                                          KiSystemServiceExit:                    <span class="comment">; CODE XREF: KiSystemCall64+90F↓j</span></span><br><span class="line">KiSystemCall64+4E0                                                                                  <span class="comment">; KiSystemCall64+91A↓j</span></span><br><span class="line">KiSystemCall64+4E0                                                                                  <span class="comment">; DATA XREF: KiCallUserMode+219↑o</span></span><br><span class="line">KiSystemCall64+4E0                                                                                  <span class="comment">; KiSystemServiceHandler+48↑o</span></span><br><span class="line">KiSystemCall64+4E0  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">9D</span> C0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rbx</span>, [<span class="built_in">rbp</span>+<span class="number">0C0h</span>] <span class="comment">; _KTRAP_FRAME.Rbx 恢复寄存器 rbx,rdi,rsi</span></span><br><span class="line">KiSystemCall64+4E7  <span class="number">190</span> <span class="number">48</span> 8B BD C8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rdi</span>, [<span class="built_in">rbp</span>+<span class="number">0C8h</span>]</span><br><span class="line">KiSystemCall64+4EE  <span class="number">190</span> <span class="number">48</span> 8B B5 D0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rsi</span>, [<span class="built_in">rbp</span>+<span class="number">0D0h</span>]</span><br><span class="line">KiSystemCall64+4F5  <span class="number">190</span> <span class="number">65</span> 4C 8B 1C <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">r11</span>, <span class="built_in">gs</span>:<span class="number">188h</span>    <span class="comment">; r11 = _KTHREAD *(CurrnetThread)</span></span><br><span class="line">KiSystemCall64+4FE  <span class="number">190</span> F6 <span class="number">85</span> F0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">01</span>                                <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">0F0h</span>], <span class="number">1</span> <span class="comment">; _KTRAP_FRAME.SegCs 检查上一环权限</span></span><br><span class="line">KiSystemCall64+<span class="number">505</span>  <span class="number">190</span> 0F <span class="number">84</span> <span class="number">1D</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">jz</span>      loc_FFFFF8034C87C1E8 <span class="comment">; 0环则跳走</span></span><br><span class="line">KiSystemCall64+50B  <span class="number">190</span> <span class="number">44</span> 0F <span class="number">20</span> C1                                         <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">cr8</span>        <span class="comment">; Task Priority Register</span></span><br><span class="line">KiSystemCall64+50F  <span class="number">190</span> <span class="number">41</span> 0A 8B 4A <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">or</span>      <span class="built_in">cl</span>, [<span class="built_in">r11</span>+<span class="number">24Ah</span>]  <span class="comment">; CurrentThread.ApcStateIndex</span></span><br><span class="line">KiSystemCall64+<span class="number">516</span>  <span class="number">190</span> <span class="number">41</span> <span class="number">0B</span> 8B E4 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">or</span>      <span class="built_in">ecx</span>, [<span class="built_in">r11</span>+<span class="number">1E4h</span>] <span class="comment">; CurrentThread.KernelApcDisable</span></span><br><span class="line">KiSystemCall64+<span class="number">51D</span>  <span class="number">190</span> 0F <span class="number">85</span> FC <span class="number">03</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">jnz</span>     loc_FFFFF8034C87C3DF</span><br><span class="line">KiSystemCall64+<span class="number">523</span>  <span class="number">190</span> FA                                                  <span class="keyword">cli</span>                     <span class="comment">; 关中断</span></span><br><span class="line">KiSystemCall64+<span class="number">524</span></span><br><span class="line">KiSystemCall64+<span class="number">524</span>                                          loc_FFFFF8034C87BFE4:                   <span class="comment">; CODE XREF: KiSystemCall64+58D↓j</span></span><br><span class="line">KiSystemCall64+<span class="number">524</span>  <span class="number">190</span> <span class="number">65</span> <span class="number">48</span> 8B 0C <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">gs</span>:<span class="number">188h</span>    <span class="comment">; 循环检测APC，有则初始化</span></span><br><span class="line">KiSystemCall64+<span class="number">524</span>                                                                                  <span class="comment">; rcx = _KTHREAD *(CurrnetThread)</span></span><br><span class="line">KiSystemCall64+<span class="number">52D</span>  <span class="number">190</span> F6 <span class="number">81</span> C2 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">03</span>                                <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rcx</span>+_KTHREAD.___u25.ApcState.___u4], <span class="number">11b</span></span><br><span class="line">KiSystemCall64+<span class="number">534</span>  <span class="number">190</span> <span class="number">74</span> <span class="number">59</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C04F</span><br><span class="line">KiSystemCall64+<span class="number">536</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> B0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">50h</span>], <span class="built_in">rax</span>  <span class="comment">; 保存rax</span></span><br><span class="line">KiSystemCall64+53A  <span class="number">190</span> <span class="number">33</span> C0                                               <span class="keyword">xor</span>     <span class="built_in">eax</span>, <span class="built_in">eax</span>        <span class="comment">; 清零</span></span><br><span class="line">KiSystemCall64+53C  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> B8                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">48h</span>], <span class="built_in">rax</span>  <span class="comment">; _KTRAP_FRAME的r8,r9,r10,r11,edx清零</span></span><br><span class="line">KiSystemCall64+<span class="number">540</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> C0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">40h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">544</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> C8                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">38h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">548</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> D0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">30h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+54C  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> D8                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">28h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">550</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> E0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">20h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">554</span>  <span class="number">190</span> <span class="number">66</span> 0F EF C0                                         <span class="keyword">pxor</span>    <span class="built_in">xmm0</span>, <span class="built_in">xmm0</span>      <span class="comment">; _KTRAP_FRAME的xmm寄存器清零</span></span><br><span class="line">KiSystemCall64+<span class="number">558</span>  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">45</span> F0                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>-<span class="number">10h</span>], <span class="built_in">xmm0</span></span><br><span class="line">KiSystemCall64+55C  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">45</span> <span class="number">00</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">0</span>], <span class="built_in">xmm0</span></span><br><span class="line">KiSystemCall64+<span class="number">560</span>  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">45</span> <span class="number">10</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">10h</span>], <span class="built_in">xmm0</span></span><br><span class="line">KiSystemCall64+<span class="number">564</span>  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">45</span> <span class="number">20</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">20h</span>], <span class="built_in">xmm0</span></span><br><span class="line">KiSystemCall64+<span class="number">568</span>  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">45</span> <span class="number">30</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">30h</span>], <span class="built_in">xmm0</span></span><br><span class="line">KiSystemCall64+56C  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">45</span> <span class="number">40</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">40h</span>], <span class="built_in">xmm0</span></span><br><span class="line">KiSystemCall64+<span class="number">570</span>  <span class="number">190</span> B9 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">1</span></span><br><span class="line">KiSystemCall64+<span class="number">575</span>  <span class="number">190</span> <span class="number">44</span> 0F <span class="number">22</span> C1                                         <span class="keyword">mov</span>     <span class="built_in">cr8</span>, <span class="built_in">rcx</span>        <span class="comment">; cr8 = APC_LEVEL</span></span><br><span class="line">KiSystemCall64+<span class="number">575</span>                                                                                  <span class="comment">; https://zh.wikipedia.org/wiki/IRQL</span></span><br><span class="line">KiSystemCall64+<span class="number">579</span>  <span class="number">190</span> FB                                                  <span class="keyword">sti</span></span><br><span class="line">KiSystemCall64+57A  <span class="number">190</span> E8 E1 2C FF FF                                      <span class="keyword">call</span>    KiInitiateUserApc</span><br><span class="line">KiSystemCall64+57F  <span class="number">190</span> FA                                                  <span class="keyword">cli</span></span><br><span class="line">KiSystemCall64+<span class="number">580</span>  <span class="number">190</span> B9 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">0</span></span><br><span class="line">KiSystemCall64+<span class="number">585</span>  <span class="number">190</span> <span class="number">44</span> 0F <span class="number">22</span> C1                                         <span class="keyword">mov</span>     <span class="built_in">cr8</span>, <span class="built_in">rcx</span>        <span class="comment">; cr8 = LOW_LEVEL</span></span><br><span class="line">KiSystemCall64+<span class="number">589</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">45</span> B0                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>-<span class="number">50h</span>]  <span class="comment">; 恢复rax</span></span><br><span class="line">KiSystemCall64+<span class="number">58D</span>  <span class="number">190</span> EB <span class="number">95</span>                                               <span class="keyword">jmp</span>     short loc_FFFFF8034C87BFE4 <span class="comment">; 循环检测APC，有则初始化</span></span><br><span class="line">KiSystemCall64+<span class="number">58D</span>                                                                                  <span class="comment">; rcx = _KTHREAD *(CurrnetThread)</span></span><br><span class="line">KiSystemCall64+58F                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64+58F</span><br><span class="line">KiSystemCall64+58F                                          loc_FFFFF8034C87C04F:                   <span class="comment">; CODE XREF: KiSystemCall64+534↑j</span></span><br><span class="line">KiSystemCall64+58F  <span class="number">190</span> <span class="number">65</span> F6 <span class="number">04</span> <span class="number">25</span> 7E <span class="number">02</span> <span class="number">00</span> <span class="number">00</span> <span class="number">02</span>                          <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> <span class="built_in">gs</span>:_KPCR.Prcb.___u40.__s0.PairRegister, <span class="number">2</span></span><br><span class="line">KiSystemCall64+<span class="number">598</span>  <span class="number">190</span> <span class="number">74</span> 0F                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C069</span><br><span class="line">KiSystemCall64+59A  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> B0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">50h</span>], <span class="built_in">rax</span>  <span class="comment">; 保存rax</span></span><br><span class="line">KiSystemCall64+59E  <span class="number">190</span> <span class="number">33</span> C9                                               <span class="keyword">xor</span>     <span class="built_in">ecx</span>, <span class="built_in">ecx</span></span><br><span class="line">KiSystemCall64+5A0  <span class="number">190</span> E8 <span class="number">1B</span> 7C F2 FF                                      <span class="keyword">call</span>    KiUpdateStibpPairing</span><br><span class="line">KiSystemCall64+5A5  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">45</span> B0                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>-<span class="number">50h</span>]  <span class="comment">; 恢复rax</span></span><br><span class="line">KiSystemCall64+5A9</span><br><span class="line">KiSystemCall64+5A9                                          loc_FFFFF8034C87C069:                   <span class="comment">; CODE XREF: KiSystemCall64+598↑j</span></span><br><span class="line">KiSystemCall64+5A9  <span class="number">190</span> <span class="number">65</span> <span class="number">48</span> 8B 0C <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">gs</span>:<span class="number">188h</span></span><br><span class="line">KiSystemCall64+5B2  <span class="number">190</span> F7 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">08</span>                                   <span class="keyword">test</span>    [<span class="built_in">rcx</span>+_KTHREAD.Header.___u0.Lock], <span class="number">8000000h</span></span><br><span class="line">KiSystemCall64+5B8  <span class="number">190</span> <span class="number">74</span> 3F                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C0B9</span><br><span class="line">KiSystemCall64+5BA  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> B0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">50h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+5BE  <span class="number">190</span> <span class="number">33</span> C0                                               <span class="keyword">xor</span>     <span class="built_in">eax</span>, <span class="built_in">eax</span></span><br><span class="line">KiSystemCall64+5C0  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> B8                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">48h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+5C4  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> C0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">40h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+5C8  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> C8                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">38h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+5CC  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> D0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">30h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+5D0  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> D8                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">28h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+5D4  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> E0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">20h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+5D8  <span class="number">190</span> <span class="number">66</span> 0F EF C0                                         <span class="keyword">pxor</span>    <span class="built_in">xmm0</span>, <span class="built_in">xmm0</span></span><br><span class="line">KiSystemCall64+5DC  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">45</span> F0                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>-<span class="number">10h</span>], <span class="built_in">xmm0</span></span><br><span class="line">KiSystemCall64+5E0  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">45</span> <span class="number">00</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">0</span>], <span class="built_in">xmm0</span></span><br><span class="line">KiSystemCall64+5E4  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">45</span> <span class="number">10</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">10h</span>], <span class="built_in">xmm0</span></span><br><span class="line">KiSystemCall64+5E8  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">45</span> <span class="number">20</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">20h</span>], <span class="built_in">xmm0</span></span><br><span class="line">KiSystemCall64+5EC  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">45</span> <span class="number">30</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">30h</span>], <span class="built_in">xmm0</span></span><br><span class="line">KiSystemCall64+5F0  <span class="number">190</span> 0F <span class="number">29</span> <span class="number">45</span> <span class="number">40</span>                                         <span class="keyword">movaps</span>  xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">40h</span>], <span class="built_in">xmm0</span></span><br><span class="line">KiSystemCall64+5F4  <span class="number">190</span> E8 <span class="number">27</span> F7 FE FF                                      <span class="keyword">call</span>    KiRestoreSetContextState</span><br><span class="line">KiSystemCall64+5F9</span><br><span class="line">KiSystemCall64+5F9                                          loc_FFFFF8034C87C0B9:                   <span class="comment">; CODE XREF: KiSystemCall64+5B8↑j</span></span><br><span class="line">KiSystemCall64+5F9  <span class="number">190</span> <span class="number">65</span> <span class="number">48</span> 8B 0C <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">gs</span>:<span class="number">188h</span></span><br><span class="line">KiSystemCall64+<span class="number">602</span>  <span class="number">190</span> F7 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span> <span class="number">01</span> <span class="number">40</span>                                   <span class="keyword">test</span>    <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rcx</span>], <span class="number">1000000000000010000000000000000b</span></span><br><span class="line">KiSystemCall64+<span class="number">608</span>  <span class="number">190</span> <span class="number">74</span> <span class="number">2D</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C0F7</span><br><span class="line">KiSystemCall64+60A  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> B0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">50h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+60E  <span class="number">190</span> F6 <span class="number">41</span> <span class="number">02</span> <span class="number">01</span>                                         <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rcx</span>+<span class="number">2</span>], <span class="number">1</span></span><br><span class="line">KiSystemCall64+<span class="number">612</span>  <span class="number">190</span> <span class="number">74</span> 0E                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C0E2</span><br><span class="line">KiSystemCall64+<span class="number">614</span>  <span class="number">190</span> E8 D7 BC <span class="number">0D</span> <span class="number">00</span>                                      <span class="keyword">call</span>    KiCopyCounters</span><br><span class="line">KiSystemCall64+<span class="number">619</span>  <span class="number">190</span> <span class="number">65</span> <span class="number">48</span> 8B 0C <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">gs</span>:<span class="number">188h</span></span><br><span class="line">KiSystemCall64+<span class="number">622</span></span><br><span class="line">KiSystemCall64+<span class="number">622</span>                                          loc_FFFFF8034C87C0E2:                   <span class="comment">; CODE XREF: KiSystemCall64+612↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">622</span>  <span class="number">190</span> F6 <span class="number">41</span> <span class="number">03</span> <span class="number">40</span>                                         <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rcx</span>+<span class="number">3</span>], <span class="number">1000000b</span></span><br><span class="line">KiSystemCall64+<span class="number">626</span>  <span class="number">190</span> <span class="number">74</span> <span class="number">0B</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C0F3</span><br><span class="line">KiSystemCall64+<span class="number">628</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">8D</span> <span class="number">65</span> <span class="number">80</span>                                         <span class="keyword">lea</span>     <span class="built_in">rsp</span>, [<span class="built_in">rbp</span>-<span class="number">80h</span>]</span><br><span class="line">KiSystemCall64+62C  <span class="number">088</span> <span class="number">33</span> C9                                               <span class="keyword">xor</span>     <span class="built_in">ecx</span>, <span class="built_in">ecx</span></span><br><span class="line">KiSystemCall64+62E  <span class="number">088</span> E8 <span class="number">4D</span> <span class="number">12</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">call</span>    KiUmsExit</span><br><span class="line">KiSystemCall64+<span class="number">633</span></span><br><span class="line">KiSystemCall64+<span class="number">633</span>                                          loc_FFFFF8034C87C0F3:                   <span class="comment">; CODE XREF: KiSystemCall64+626↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">633</span>  <span class="number">088</span> <span class="number">48</span> 8B <span class="number">45</span> B0                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>-<span class="number">50h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">637</span></span><br><span class="line">KiSystemCall64+<span class="number">637</span>                                          loc_FFFFF8034C87C0F7:                   <span class="comment">; CODE XREF: KiSystemCall64+608↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">637</span>  <span class="number">088</span> 0F AE <span class="number">55</span> AC                                         <span class="keyword">ldmxcsr</span> <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rbp</span>-<span class="number">54h</span>]</span><br><span class="line">KiSystemCall64+63B  <span class="number">088</span> <span class="number">4D</span> <span class="number">33</span> D2                                            <span class="keyword">xor</span>     <span class="built_in">r10</span>, <span class="built_in">r10</span></span><br><span class="line">KiSystemCall64+63E  <span class="number">088</span> <span class="number">66</span> <span class="number">83</span> BD <span class="number">80</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">cmp</span>     <span class="built_in">word</span> <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">80h</span>], <span class="number">0</span></span><br><span class="line">KiSystemCall64+<span class="number">646</span>  <span class="number">088</span> <span class="number">74</span> <span class="number">41</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C149</span><br><span class="line">KiSystemCall64+<span class="number">648</span>  <span class="number">088</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> B0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">50h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+64C  <span class="number">088</span> E8 5F EC FE FF                                      <span class="keyword">call</span>    KiRestoreDebugRegisterState</span><br><span class="line">KiSystemCall64+<span class="number">651</span>  <span class="number">088</span> <span class="number">65</span> <span class="number">48</span> 8B <span class="number">04</span> <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rax</span>, <span class="built_in">gs</span>:<span class="number">188h</span></span><br><span class="line">KiSystemCall64+65A  <span class="number">088</span> <span class="number">48</span> 8B <span class="number">80</span> B8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rax</span>+<span class="number">0B8h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">661</span>  <span class="number">088</span> <span class="number">48</span> 8B <span class="number">80</span> D0 <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rax</span>+<span class="number">2D0h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">668</span>  <span class="number">088</span> <span class="number">48</span> <span class="number">0B</span> C0                                            <span class="keyword">or</span>      <span class="built_in">rax</span>, <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+66B  <span class="number">088</span> <span class="number">74</span> <span class="number">18</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C145</span><br><span class="line">KiSystemCall64+<span class="number">66D</span>  <span class="number">088</span> <span class="number">66</span> <span class="number">83</span> BD F0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">33</span>                             <span class="keyword">cmp</span>     <span class="built_in">word</span> <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">0F0h</span>], <span class="number">33h</span> <span class="comment">; '3'</span></span><br><span class="line">KiSystemCall64+<span class="number">675</span>  <span class="number">088</span> <span class="number">75</span> 0E                                               <span class="keyword">jnz</span>     short loc_FFFFF8034C87C145</span><br><span class="line">KiSystemCall64+<span class="number">677</span>  <span class="number">088</span> 4C 8B <span class="number">95</span> E8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">r10</span>, [<span class="built_in">rbp</span>+<span class="number">0E8h</span>]</span><br><span class="line">KiSystemCall64+67E  <span class="number">088</span> <span class="number">48</span> <span class="number">89</span> <span class="number">85</span> E8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     [<span class="built_in">rbp</span>+<span class="number">0E8h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">685</span></span><br><span class="line">KiSystemCall64+<span class="number">685</span>                                          loc_FFFFF8034C87C145:                   <span class="comment">; CODE XREF: KiSystemCall64+66B↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">685</span>                                                                                  <span class="comment">; KiSystemCall64+675↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">685</span>  <span class="number">088</span> <span class="number">48</span> 8B <span class="number">45</span> B0                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>-<span class="number">50h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">689</span></span><br><span class="line">KiSystemCall64+<span class="number">689</span>                                          loc_FFFFF8034C87C149:                   <span class="comment">; CODE XREF: KiSystemCall64+646↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">689</span>  <span class="number">088</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> B0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">50h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">68D</span>  <span class="number">088</span> <span class="number">65</span> C6 <span class="number">04</span> <span class="number">25</span> <span class="number">53</span> <span class="number">08</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">byte</span> <span class="built_in">ptr</span> <span class="built_in">gs</span>:<span class="number">853h</span>, <span class="number">0</span></span><br><span class="line">KiSystemCall64+<span class="number">696</span>  <span class="number">088</span> <span class="number">65</span> 0F B6 <span class="number">04</span> <span class="number">25</span> <span class="number">7D</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">movzx</span>   <span class="built_in">eax</span>, <span class="built_in">byte</span> <span class="built_in">ptr</span> <span class="built_in">gs</span>:<span class="number">27Dh</span></span><br><span class="line">KiSystemCall64+69F  <span class="number">088</span> <span class="number">65</span> <span class="number">38</span> <span class="number">04</span> <span class="number">25</span> 7A <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">cmp</span>     <span class="built_in">gs</span>:<span class="number">27Ah</span>, <span class="built_in">al</span></span><br><span class="line">KiSystemCall64+6A7  <span class="number">088</span> <span class="number">74</span> <span class="number">11</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C17A</span><br><span class="line">KiSystemCall64+6A9  <span class="number">088</span> <span class="number">65</span> <span class="number">88</span> <span class="number">04</span> <span class="number">25</span> 7A <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">mov</span>     <span class="built_in">gs</span>:<span class="number">27Ah</span>, <span class="built_in">al</span></span><br><span class="line">KiSystemCall64+6B1  <span class="number">088</span> B9 <span class="number">48</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">48h</span> <span class="comment">; 'H'</span></span><br><span class="line">KiSystemCall64+6B6  <span class="number">088</span> <span class="number">33</span> D2                                               <span class="keyword">xor</span>     <span class="built_in">edx</span>, <span class="built_in">edx</span></span><br><span class="line">KiSystemCall64+6B8  <span class="number">088</span> 0F <span class="number">30</span>                                               <span class="keyword">wrmsr</span></span><br><span class="line">KiSystemCall64+6BA</span><br><span class="line">KiSystemCall64+6BA                                          loc_FFFFF8034C87C17A:                   <span class="comment">; CODE XREF: KiSystemCall64+6A7↑j</span></span><br><span class="line">KiSystemCall64+6BA  <span class="number">088</span> <span class="number">66</span> <span class="number">65</span> 0F BA <span class="number">34</span> <span class="number">25</span> <span class="number">78</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span> <span class="number">02</span>                    <span class="keyword">btr</span>     <span class="built_in">word</span> <span class="built_in">ptr</span> <span class="built_in">gs</span>:<span class="number">278h</span>, <span class="number">2</span></span><br><span class="line">KiSystemCall64+6C5  <span class="number">088</span> <span class="number">73</span> 0E                                               <span class="keyword">jnb</span>     short loc_FFFFF8034C87C195</span><br><span class="line">KiSystemCall64+6C7  <span class="number">088</span> B8 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">1</span></span><br><span class="line">KiSystemCall64+6CC  <span class="number">088</span> <span class="number">33</span> D2                                               <span class="keyword">xor</span>     <span class="built_in">edx</span>, <span class="built_in">edx</span></span><br><span class="line">KiSystemCall64+6CE  <span class="number">088</span> B9 <span class="number">49</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">49h</span> <span class="comment">; 'I'</span></span><br><span class="line">KiSystemCall64+6D3  <span class="number">088</span> 0F <span class="number">30</span>                                               <span class="keyword">wrmsr</span></span><br><span class="line">KiSystemCall64+6D5</span><br><span class="line">KiSystemCall64+6D5                                          loc_FFFFF8034C87C195:                   <span class="comment">; CODE XREF: KiSystemCall64+6C5↑j</span></span><br><span class="line">KiSystemCall64+6D5  <span class="number">088</span> <span class="number">48</span> 8B <span class="number">45</span> B0                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>-<span class="number">50h</span>]</span><br><span class="line">KiSystemCall64+6D9  <span class="number">088</span> 4C 8B <span class="number">85</span> <span class="number">00</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">r8</span>, [<span class="built_in">rbp</span>+<span class="number">100h</span>]</span><br><span class="line">KiSystemCall64+6E0  <span class="number">088</span> 4C 8B <span class="number">8D</span> D8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">r9</span>, [<span class="built_in">rbp</span>+<span class="number">0D8h</span>]</span><br><span class="line">KiSystemCall64+6E7  <span class="number">088</span> <span class="number">33</span> D2                                               <span class="keyword">xor</span>     <span class="built_in">edx</span>, <span class="built_in">edx</span></span><br><span class="line">KiSystemCall64+6E9  <span class="number">088</span> <span class="number">66</span> 0F EF C0                                         <span class="keyword">pxor</span>    <span class="built_in">xmm0</span>, <span class="built_in">xmm0</span></span><br><span class="line">KiSystemCall64+6ED  <span class="number">088</span> <span class="number">66</span> 0F EF C9                                         <span class="keyword">pxor</span>    <span class="built_in">xmm1</span>, <span class="built_in">xmm1</span></span><br><span class="line">KiSystemCall64+6F1  <span class="number">088</span> <span class="number">66</span> 0F EF D2                                         <span class="keyword">pxor</span>    <span class="built_in">xmm2</span>, <span class="built_in">xmm2</span></span><br><span class="line">KiSystemCall64+6F5  <span class="number">088</span> <span class="number">66</span> 0F EF <span class="built_in">DB</span>                                         <span class="keyword">pxor</span>    <span class="built_in">xmm3</span>, <span class="built_in">xmm3</span></span><br><span class="line">KiSystemCall64+6F9  <span class="number">088</span> <span class="number">66</span> 0F EF E4                                         <span class="keyword">pxor</span>    <span class="built_in">xmm4</span>, <span class="built_in">xmm4</span></span><br><span class="line">KiSystemCall64+6FD  <span class="number">088</span> <span class="number">66</span> 0F EF ED                                         <span class="keyword">pxor</span>    <span class="built_in">xmm5</span>, <span class="built_in">xmm5</span></span><br><span class="line">KiSystemCall64+<span class="number">701</span>  <span class="number">088</span> <span class="number">48</span> 8B <span class="number">8D</span> E8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rcx</span>, [<span class="built_in">rbp</span>+<span class="number">0E8h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">708</span>  <span class="number">088</span> 4C 8B <span class="number">9D</span> F8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">r11</span>, [<span class="built_in">rbp</span>+<span class="number">0F8h</span>]</span><br><span class="line">KiSystemCall64+70F  <span class="number">088</span> F6 <span class="number">05</span> 6A <span class="number">96</span> 3B <span class="number">00</span> <span class="number">01</span>                                <span class="keyword">test</span>    <span class="built_in">cs</span>:KiKvaShadow, <span class="number">1</span> <span class="comment">; 判断是否开启KVAS，1为开启</span></span><br><span class="line">KiSystemCall64+<span class="number">716</span>  <span class="number">088</span> 0F <span class="number">85</span> A4 <span class="number">0B</span> <span class="number">18</span> <span class="number">00</span>                                   <span class="keyword">jnz</span>     KiKernelSysretExit <span class="comment">; 切换cr3和栈</span></span><br><span class="line">KiSystemCall64+71C  <span class="number">088</span> <span class="number">49</span> 8B E9                                            <span class="keyword">mov</span>     <span class="built_in">rbp</span>, <span class="built_in">r9</span></span><br><span class="line">KiSystemCall64+71F  <span class="number">088</span> <span class="number">49</span> 8B E0                                            <span class="keyword">mov</span>     <span class="built_in">rsp</span>, <span class="built_in">r8</span></span><br><span class="line">KiSystemCall64+<span class="number">722</span>  <span class="number">088</span> 0F <span class="number">01</span> F8                                            <span class="keyword">swapgs</span></span><br><span class="line">KiSystemCall64+<span class="number">725</span>  <span class="number">088</span> <span class="number">48</span> 0F <span class="number">07</span>                                            <span class="keyword">sysret</span></span><br><span class="line">KiSystemCall64+<span class="number">728</span>                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64+<span class="number">728</span></span><br><span class="line">KiSystemCall64+<span class="number">728</span>                                          loc_FFFFF8034C87C1E8:                   <span class="comment">; CODE XREF: KiSystemCall64+505↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">728</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">95</span> B8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rdx</span>, [<span class="built_in">rbp</span>+<span class="number">0B8h</span>]</span><br><span class="line">KiSystemCall64+72F  <span class="number">190</span> <span class="number">49</span> <span class="number">89</span> <span class="number">93</span> <span class="number">90</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     [<span class="built_in">r11</span>+<span class="number">90h</span>], <span class="built_in">rdx</span></span><br><span class="line">KiSystemCall64+<span class="number">736</span>  <span class="number">190</span> 8A <span class="number">55</span> A8                                            <span class="keyword">mov</span>     <span class="built_in">dl</span>, [<span class="built_in">rbp</span>-<span class="number">58h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">739</span>  <span class="number">190</span> <span class="number">41</span> <span class="number">88</span> <span class="number">93</span> <span class="number">32</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     [<span class="built_in">r11</span>+<span class="number">232h</span>], <span class="built_in">dl</span></span><br><span class="line">KiSystemCall64+<span class="number">740</span>  <span class="number">190</span> FA                                                  <span class="keyword">cli</span></span><br><span class="line">KiSystemCall64+<span class="number">741</span>  <span class="number">190</span> <span class="number">48</span> 8B E5                                            <span class="keyword">mov</span>     <span class="built_in">rsp</span>, <span class="built_in">rbp</span></span><br><span class="line">KiSystemCall64+<span class="number">744</span>  <span class="number">190</span> <span class="number">48</span> 8B AD D8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rbp</span>, [<span class="built_in">rbp</span>+<span class="number">0D8h</span>]</span><br><span class="line">KiSystemCall64+74B  <span class="number">190</span> <span class="number">48</span> 8B A4 <span class="number">24</span> <span class="number">00</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">mov</span>     <span class="built_in">rsp</span>, [<span class="built_in">rsp</span>+<span class="number">190h</span>+var_90]</span><br><span class="line">KiSystemCall64+<span class="number">753</span>  <span class="number">190</span> FB                                                  <span class="keyword">sti</span></span><br><span class="line">KiSystemCall64+<span class="number">754</span>  <span class="number">190</span> C3                                                  <span class="keyword">retn</span></span><br><span class="line">KiSystemCall64+<span class="number">755</span>                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64+<span class="number">755</span></span><br><span class="line">KiSystemCall64+<span class="number">755</span>                                          KiSystemServiceExitPico:                <span class="comment">; CODE XREF: KiSystemCall64+2B8↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">755</span>  <span class="number">190</span> <span class="number">65</span> 4C 8B 1C <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">r11</span>, <span class="built_in">gs</span>:<span class="number">188h</span></span><br><span class="line">KiSystemCall64+75E  <span class="number">190</span> <span class="number">44</span> 0F <span class="number">20</span> C1                                         <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">cr8</span></span><br><span class="line">KiSystemCall64+<span class="number">762</span>  <span class="number">190</span> <span class="number">41</span> 0A 8B 4A <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">or</span>      <span class="built_in">cl</span>, [<span class="built_in">r11</span>+<span class="number">24Ah</span>]</span><br><span class="line">KiSystemCall64+<span class="number">769</span>  <span class="number">190</span> <span class="number">41</span> <span class="number">0B</span> 8B E4 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">or</span>      <span class="built_in">ecx</span>, [<span class="built_in">r11</span>+<span class="number">1E4h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">770</span>  <span class="number">190</span> 0F <span class="number">85</span> A9 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">jnz</span>     loc_FFFFF8034C87C3DF</span><br><span class="line">KiSystemCall64+<span class="number">776</span>  <span class="number">190</span> FA                                                  <span class="keyword">cli</span></span><br><span class="line">KiSystemCall64+<span class="number">777</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> B0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">50h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+77B</span><br><span class="line">KiSystemCall64+77B                                          loc_FFFFF8034C87C23B:                   <span class="comment">; CODE XREF: KiSystemCall64+7A6↓j</span></span><br><span class="line">KiSystemCall64+77B  <span class="number">190</span> <span class="number">65</span> <span class="number">48</span> 8B 0C <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">gs</span>:<span class="number">188h</span></span><br><span class="line">KiSystemCall64+<span class="number">784</span>  <span class="number">190</span> F6 <span class="number">81</span> C2 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">03</span>                                <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rcx</span>+<span class="number">0C2h</span>], <span class="number">3</span></span><br><span class="line">KiSystemCall64+78B  <span class="number">190</span> <span class="number">74</span> <span class="number">1B</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C268</span><br><span class="line">KiSystemCall64+<span class="number">78D</span>  <span class="number">190</span> B9 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">1</span></span><br><span class="line">KiSystemCall64+<span class="number">792</span>  <span class="number">190</span> <span class="number">44</span> 0F <span class="number">22</span> C1                                         <span class="keyword">mov</span>     <span class="built_in">cr8</span>, <span class="built_in">rcx</span></span><br><span class="line">KiSystemCall64+<span class="number">796</span>  <span class="number">190</span> FB                                                  <span class="keyword">sti</span></span><br><span class="line">KiSystemCall64+<span class="number">797</span>  <span class="number">190</span> E8 C4 2A FF FF                                      <span class="keyword">call</span>    KiInitiateUserApc</span><br><span class="line">KiSystemCall64+79C  <span class="number">190</span> B9 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">0</span></span><br><span class="line">KiSystemCall64+7A1  <span class="number">190</span> <span class="number">44</span> 0F <span class="number">22</span> C1                                         <span class="keyword">mov</span>     <span class="built_in">cr8</span>, <span class="built_in">rcx</span></span><br><span class="line">KiSystemCall64+7A5  <span class="number">190</span> FA                                                  <span class="keyword">cli</span></span><br><span class="line">KiSystemCall64+7A6  <span class="number">190</span> EB D3                                               <span class="keyword">jmp</span>     short loc_FFFFF8034C87C23B</span><br><span class="line">KiSystemCall64+7A8                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64+7A8</span><br><span class="line">KiSystemCall64+7A8                                          loc_FFFFF8034C87C268:                   <span class="comment">; CODE XREF: KiSystemCall64+78B↑j</span></span><br><span class="line">KiSystemCall64+7A8  <span class="number">190</span> <span class="number">65</span> F6 <span class="number">04</span> <span class="number">25</span> 7E <span class="number">02</span> <span class="number">00</span> <span class="number">00</span> <span class="number">02</span>                          <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> <span class="built_in">gs</span>:<span class="number">27Eh</span>, <span class="number">2</span></span><br><span class="line">KiSystemCall64+7B1  <span class="number">190</span> <span class="number">74</span> <span class="number">07</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C27A</span><br><span class="line">KiSystemCall64+7B3  <span class="number">190</span> <span class="number">33</span> C9                                               <span class="keyword">xor</span>     <span class="built_in">ecx</span>, <span class="built_in">ecx</span></span><br><span class="line">KiSystemCall64+7B5  <span class="number">190</span> E8 <span class="number">06</span> 7A F2 FF                                      <span class="keyword">call</span>    KiUpdateStibpPairing</span><br><span class="line">KiSystemCall64+7BA</span><br><span class="line">KiSystemCall64+7BA                                          loc_FFFFF8034C87C27A:                   <span class="comment">; CODE XREF: KiSystemCall64+7B1↑j</span></span><br><span class="line">KiSystemCall64+7BA  <span class="number">190</span> <span class="number">65</span> <span class="number">48</span> 8B 0C <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">gs</span>:<span class="number">188h</span></span><br><span class="line">KiSystemCall64+7C3  <span class="number">190</span> F7 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">08</span>                                   <span class="keyword">test</span>    <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rcx</span>], <span class="number">8000000h</span></span><br><span class="line">KiSystemCall64+7C9  <span class="number">190</span> <span class="number">74</span> <span class="number">05</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C290</span><br><span class="line">KiSystemCall64+7CB  <span class="number">190</span> E8 <span class="number">50</span> F5 FE FF                                      <span class="keyword">call</span>    KiRestoreSetContextState</span><br><span class="line">KiSystemCall64+7D0</span><br><span class="line">KiSystemCall64+7D0                                          loc_FFFFF8034C87C290:                   <span class="comment">; CODE XREF: KiSystemCall64+7C9↑j</span></span><br><span class="line">KiSystemCall64+7D0  <span class="number">190</span> <span class="number">65</span> <span class="number">48</span> 8B 0C <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">gs</span>:<span class="number">188h</span></span><br><span class="line">KiSystemCall64+7D9  <span class="number">190</span> F6 <span class="number">41</span> <span class="number">02</span> <span class="number">01</span>                                         <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rcx</span>+<span class="number">2</span>], <span class="number">1</span></span><br><span class="line">KiSystemCall64+7<span class="built_in">DD</span>  <span class="number">190</span> <span class="number">74</span> 0E                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C2AD</span><br><span class="line">KiSystemCall64+7DF  <span class="number">190</span> E8 0C BB <span class="number">0D</span> <span class="number">00</span>                                      <span class="keyword">call</span>    KiCopyCounters</span><br><span class="line">KiSystemCall64+7E4  <span class="number">190</span> <span class="number">65</span> <span class="number">48</span> 8B 0C <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">gs</span>:<span class="number">188h</span></span><br><span class="line">KiSystemCall64+7ED</span><br><span class="line">KiSystemCall64+7ED                                          loc_FFFFF8034C87C2AD:                   <span class="comment">; CODE XREF: KiSystemCall64+7DD↑j</span></span><br><span class="line">KiSystemCall64+7ED  <span class="number">190</span> <span class="number">66</span> <span class="number">83</span> BD <span class="number">80</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">cmp</span>     <span class="built_in">word</span> <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">80h</span>], <span class="number">0</span></span><br><span class="line">KiSystemCall64+7F5  <span class="number">190</span> <span class="number">74</span> <span class="number">05</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C2BC</span><br><span class="line">KiSystemCall64+7F7  <span class="number">190</span> E8 B4 EA FE FF                                      <span class="keyword">call</span>    KiRestoreDebugRegisterState</span><br><span class="line">KiSystemCall64+7FC</span><br><span class="line">KiSystemCall64+7FC                                          loc_FFFFF8034C87C2BC:                   <span class="comment">; CODE XREF: KiSystemCall64+7F5↑j</span></span><br><span class="line">KiSystemCall64+7FC  <span class="number">190</span> <span class="number">65</span> C6 <span class="number">04</span> <span class="number">25</span> <span class="number">53</span> <span class="number">08</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">byte</span> <span class="built_in">ptr</span> <span class="built_in">gs</span>:<span class="number">853h</span>, <span class="number">0</span></span><br><span class="line">KiSystemCall64+<span class="number">805</span>  <span class="number">190</span> <span class="number">65</span> 0F B6 <span class="number">04</span> <span class="number">25</span> <span class="number">7D</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">movzx</span>   <span class="built_in">eax</span>, <span class="built_in">byte</span> <span class="built_in">ptr</span> <span class="built_in">gs</span>:<span class="number">27Dh</span></span><br><span class="line">KiSystemCall64+80E  <span class="number">190</span> <span class="number">65</span> <span class="number">38</span> <span class="number">04</span> <span class="number">25</span> 7A <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">cmp</span>     <span class="built_in">gs</span>:<span class="number">27Ah</span>, <span class="built_in">al</span></span><br><span class="line">KiSystemCall64+<span class="number">816</span>  <span class="number">190</span> <span class="number">74</span> <span class="number">11</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C2E9</span><br><span class="line">KiSystemCall64+<span class="number">818</span>  <span class="number">190</span> <span class="number">65</span> <span class="number">88</span> <span class="number">04</span> <span class="number">25</span> 7A <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">mov</span>     <span class="built_in">gs</span>:<span class="number">27Ah</span>, <span class="built_in">al</span></span><br><span class="line">KiSystemCall64+<span class="number">820</span>  <span class="number">190</span> B9 <span class="number">48</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">48h</span> <span class="comment">; 'H'</span></span><br><span class="line">KiSystemCall64+<span class="number">825</span>  <span class="number">190</span> <span class="number">33</span> D2                                               <span class="keyword">xor</span>     <span class="built_in">edx</span>, <span class="built_in">edx</span></span><br><span class="line">KiSystemCall64+<span class="number">827</span>  <span class="number">190</span> 0F <span class="number">30</span>                                               <span class="keyword">wrmsr</span></span><br><span class="line">KiSystemCall64+<span class="number">829</span></span><br><span class="line">KiSystemCall64+<span class="number">829</span>                                          loc_FFFFF8034C87C2E9:                   <span class="comment">; CODE XREF: KiSystemCall64+816↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">829</span>  <span class="number">190</span> <span class="number">66</span> <span class="number">65</span> 0F BA <span class="number">34</span> <span class="number">25</span> <span class="number">78</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span> <span class="number">02</span>                    <span class="keyword">btr</span>     <span class="built_in">word</span> <span class="built_in">ptr</span> <span class="built_in">gs</span>:<span class="number">278h</span>, <span class="number">2</span></span><br><span class="line">KiSystemCall64+<span class="number">834</span>  <span class="number">190</span> <span class="number">73</span> 0E                                               <span class="keyword">jnb</span>     short loc_FFFFF8034C87C304</span><br><span class="line">KiSystemCall64+<span class="number">836</span>  <span class="number">190</span> B8 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">1</span></span><br><span class="line">KiSystemCall64+83B  <span class="number">190</span> <span class="number">33</span> D2                                               <span class="keyword">xor</span>     <span class="built_in">edx</span>, <span class="built_in">edx</span></span><br><span class="line">KiSystemCall64+<span class="number">83D</span>  <span class="number">190</span> B9 <span class="number">49</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">49h</span> <span class="comment">; 'I'</span></span><br><span class="line">KiSystemCall64+<span class="number">842</span>  <span class="number">190</span> 0F <span class="number">30</span>                                               <span class="keyword">wrmsr</span></span><br><span class="line">KiSystemCall64+<span class="number">844</span></span><br><span class="line">KiSystemCall64+<span class="number">844</span>                                          loc_FFFFF8034C87C304:                   <span class="comment">; CODE XREF: KiSystemCall64+834↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">844</span>  <span class="number">190</span> 0F AE <span class="number">55</span> AC                                         <span class="keyword">ldmxcsr</span> <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rbp</span>-<span class="number">54h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">848</span>  <span class="number">190</span> 0F <span class="number">28</span> <span class="number">45</span> F0                                         <span class="keyword">movaps</span>  <span class="built_in">xmm0</span>, xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>-<span class="number">10h</span>]</span><br><span class="line">KiSystemCall64+84C  <span class="number">190</span> 0F <span class="number">28</span> <span class="number">4D</span> <span class="number">00</span>                                         <span class="keyword">movaps</span>  <span class="built_in">xmm1</span>, xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">0</span>]</span><br><span class="line">KiSystemCall64+<span class="number">850</span>  <span class="number">190</span> 0F <span class="number">28</span> <span class="number">55</span> <span class="number">10</span>                                         <span class="keyword">movaps</span>  <span class="built_in">xmm2</span>, xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">10h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">854</span>  <span class="number">190</span> 0F <span class="number">28</span> <span class="number">5D</span> <span class="number">20</span>                                         <span class="keyword">movaps</span>  <span class="built_in">xmm3</span>, xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">20h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">858</span>  <span class="number">190</span> 0F <span class="number">28</span> <span class="number">65</span> <span class="number">30</span>                                         <span class="keyword">movaps</span>  <span class="built_in">xmm4</span>, xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">30h</span>]</span><br><span class="line">KiSystemCall64+85C  <span class="number">190</span> 0F <span class="number">28</span> <span class="number">6D</span> <span class="number">40</span>                                         <span class="keyword">movaps</span>  <span class="built_in">xmm5</span>, xmmword <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">40h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">860</span>  <span class="number">190</span> 4C 8B <span class="number">5D</span> E0                                         <span class="keyword">mov</span>     <span class="built_in">r11</span>, [<span class="built_in">rbp</span>-<span class="number">20h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">864</span>  <span class="number">190</span> 4C 8B <span class="number">55</span> D8                                         <span class="keyword">mov</span>     <span class="built_in">r10</span>, [<span class="built_in">rbp</span>-<span class="number">28h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">868</span>  <span class="number">190</span> 4C 8B <span class="number">4D</span> D0                                         <span class="keyword">mov</span>     <span class="built_in">r9</span>, [<span class="built_in">rbp</span>-<span class="number">30h</span>]</span><br><span class="line">KiSystemCall64+86C  <span class="number">190</span> 4C 8B <span class="number">45</span> C8                                         <span class="keyword">mov</span>     <span class="built_in">r8</span>, [<span class="built_in">rbp</span>-<span class="number">38h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">870</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">55</span> C0                                         <span class="keyword">mov</span>     <span class="built_in">rdx</span>, [<span class="built_in">rbp</span>-<span class="number">40h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">874</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">4D</span> B8                                         <span class="keyword">mov</span>     <span class="built_in">rcx</span>, [<span class="built_in">rbp</span>-<span class="number">48h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">878</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">45</span> B0                                         <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>-<span class="number">50h</span>]</span><br><span class="line">KiSystemCall64+87C  <span class="number">190</span> <span class="number">48</span> 8B B5 D0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rsi</span>, [<span class="built_in">rbp</span>+<span class="number">0D0h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">883</span>  <span class="number">190</span> <span class="number">48</span> 8B BD C8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rdi</span>, [<span class="built_in">rbp</span>+<span class="number">0C8h</span>]</span><br><span class="line">KiSystemCall64+88A  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">9D</span> C0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rbx</span>, [<span class="built_in">rbp</span>+<span class="number">0C0h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">891</span>  <span class="number">190</span> <span class="number">48</span> 8B E5                                            <span class="keyword">mov</span>     <span class="built_in">rsp</span>, <span class="built_in">rbp</span></span><br><span class="line">KiSystemCall64+<span class="number">894</span>  <span class="number">190</span> <span class="number">48</span> 8B AD D8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rbp</span>, [<span class="built_in">rbp</span>+<span class="number">0D8h</span>]</span><br><span class="line">KiSystemCall64+89B  <span class="number">190</span> <span class="number">48</span> <span class="number">81</span> C4 E8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">0E8h</span></span><br><span class="line">KiSystemCall64+8A2  0A8 F6 <span class="number">05</span> D7 <span class="number">94</span> 3B <span class="number">00</span> <span class="number">01</span>                                <span class="keyword">test</span>    <span class="built_in">cs</span>:KiKvaShadow, <span class="number">1</span></span><br><span class="line">KiSystemCall64+8A9  0A8 <span class="number">74</span> <span class="number">05</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C87C370</span><br><span class="line">KiSystemCall64+8AB  0A8 E9 D0 <span class="number">07</span> <span class="number">18</span> <span class="number">00</span>                                      <span class="keyword">jmp</span>     KiKernelExit</span><br><span class="line">KiSystemCall64+8B0                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64+8B0</span><br><span class="line">KiSystemCall64+8B0                                          loc_FFFFF8034C87C370:                   <span class="comment">; CODE XREF: KiSystemCall64+8A9↑j</span></span><br><span class="line">KiSystemCall64+8B0  0A8 0F <span class="number">01</span> F8                                            <span class="keyword">swapgs</span></span><br><span class="line">KiSystemCall64+8B3  0A8 <span class="number">48</span> CF                                               <span class="keyword">iretq</span></span><br><span class="line">KiSystemCall64+8B5                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64+8B5</span><br><span class="line">KiSystemCall64+8B5                                          loc_FFFFF8034C87C375:                   <span class="comment">; CODE XREF: KiSystemCall64+383↑j</span></span><br><span class="line">KiSystemCall64+8B5  <span class="number">190</span> <span class="number">83</span> FF <span class="number">20</span>                                            <span class="keyword">cmp</span>     <span class="built_in">edi</span>, <span class="number">20h</span> <span class="comment">; ' '</span></span><br><span class="line">KiSystemCall64+8B8  <span class="number">190</span> <span class="number">75</span> 5B                                               <span class="keyword">jnz</span>     short loc_FFFFF8034C87C3D5</span><br><span class="line">KiSystemCall64+8BA  <span class="number">190</span> <span class="number">89</span> <span class="number">45</span> <span class="number">80</span>                                            <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">80h</span>], <span class="built_in">eax</span></span><br><span class="line">KiSystemCall64+8BD  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">4D</span> <span class="number">88</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">78h</span>], <span class="built_in">rcx</span></span><br><span class="line">KiSystemCall64+8C1  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">55</span> <span class="number">90</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">70h</span>], <span class="built_in">rdx</span></span><br><span class="line">KiSystemCall64+8C5  <span class="number">190</span> 4C <span class="number">89</span> <span class="number">45</span> <span class="number">98</span>                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">68h</span>], <span class="built_in">r8</span></span><br><span class="line">KiSystemCall64+8C9  <span class="number">190</span> 4C <span class="number">89</span> <span class="number">4D</span> A0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">60h</span>], <span class="built_in">r9</span></span><br><span class="line">KiSystemCall64+8CD  <span class="number">190</span> E8 0E <span class="number">21</span> FF FF                                      <span class="keyword">call</span>    KiConvertToGuiThread</span><br><span class="line">KiSystemCall64+8D2  <span class="number">190</span> <span class="number">0B</span> C0                                               <span class="keyword">or</span>      <span class="built_in">eax</span>, <span class="built_in">eax</span></span><br><span class="line">KiSystemCall64+8D4  <span class="number">190</span> 8B <span class="number">45</span> <span class="number">80</span>                                            <span class="keyword">mov</span>     <span class="built_in">eax</span>, [<span class="built_in">rbp</span>-<span class="number">80h</span>]</span><br><span class="line">KiSystemCall64+8D7  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">4D</span> <span class="number">88</span>                                         <span class="keyword">mov</span>     <span class="built_in">rcx</span>, [<span class="built_in">rbp</span>-<span class="number">78h</span>]</span><br><span class="line">KiSystemCall64+8<span class="built_in">DB</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">55</span> <span class="number">90</span>                                         <span class="keyword">mov</span>     <span class="built_in">rdx</span>, [<span class="built_in">rbp</span>-<span class="number">70h</span>]</span><br><span class="line">KiSystemCall64+8DF  <span class="number">190</span> 4C 8B <span class="number">45</span> <span class="number">98</span>                                         <span class="keyword">mov</span>     <span class="built_in">r8</span>, [<span class="built_in">rbp</span>-<span class="number">68h</span>]</span><br><span class="line">KiSystemCall64+8E3  <span class="number">190</span> 4C 8B <span class="number">4D</span> A0                                         <span class="keyword">mov</span>     <span class="built_in">r9</span>, [<span class="built_in">rbp</span>-<span class="number">60h</span>]</span><br><span class="line">KiSystemCall64+8E7  <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> A3 <span class="number">90</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     [<span class="built_in">rbx</span>+<span class="number">90h</span>], <span class="built_in">rsp</span></span><br><span class="line">KiSystemCall64+8EE  <span class="number">190</span> 0F <span class="number">84</span> <span class="number">60</span> FA FF FF                                   <span class="keyword">jz</span>      KiSystemServiceRepeat <span class="comment">;</span></span><br><span class="line">KiSystemCall64+8EE                                                                                  <span class="comment">; #pragma pack(1)</span></span><br><span class="line">KiSystemCall64+8EE                                                                                  <span class="comment">; typedef struct _SERVICE_DESCIPTOR_TABLE</span></span><br><span class="line">KiSystemCall64+8EE                                                                                  <span class="comment">; &#123;</span></span><br><span class="line">KiSystemCall64+8EE                                                                                  <span class="comment">;    PULONG ServiceTableBase;          // SSDT基址</span></span><br><span class="line">KiSystemCall64+8EE                                                                                  <span class="comment">;    PVOID ServiceCounterTableBase; // SSDT中服务被调用次数计数器</span></span><br><span class="line">KiSystemCall64+8EE                                                                                  <span class="comment">;    ULONGLONG NumberOfService;     // SSDT服务个数</span></span><br><span class="line">KiSystemCall64+8EE                                                                                  <span class="comment">;    PVOID ParamTableBase;          // 系统服务参数表基址</span></span><br><span class="line">KiSystemCall64+8EE                                                                                  <span class="comment">; &#125;SSDTEntry, *PSSDTEntry;</span></span><br><span class="line">KiSystemCall64+8EE                                                                                  <span class="comment">; #pragma pack()</span></span><br><span class="line">KiSystemCall64+8F4  <span class="number">190</span> <span class="number">48</span> <span class="number">8D</span> <span class="number">3D</span> E5 <span class="number">16</span> 3A <span class="number">00</span>                                <span class="keyword">lea</span>     <span class="built_in">rdi</span>, xmmword_FFFFF8034CC1DAA0</span><br><span class="line">KiSystemCall64+8FB  <span class="number">190</span> 8B <span class="number">77</span> <span class="number">10</span>                                            <span class="keyword">mov</span>     <span class="built_in">esi</span>, [<span class="built_in">rdi</span>+<span class="number">10h</span>]</span><br><span class="line">KiSystemCall64+8FE  <span class="number">190</span> <span class="number">48</span> 8B 3F                                            <span class="keyword">mov</span>     <span class="built_in">rdi</span>, [<span class="built_in">rdi</span>]</span><br><span class="line">KiSystemCall64+<span class="number">901</span>  <span class="number">190</span> 3B C6                                               <span class="keyword">cmp</span>     <span class="built_in">eax</span>, <span class="built_in">esi</span></span><br><span class="line">KiSystemCall64+<span class="number">903</span>  <span class="number">190</span> <span class="number">73</span> <span class="number">10</span>                                               <span class="keyword">jnb</span>     short loc_FFFFF8034C87C3D5</span><br><span class="line">KiSystemCall64+<span class="number">905</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">8D</span> 3C B7                                         <span class="keyword">lea</span>     <span class="built_in">rdi</span>, [<span class="built_in">rdi</span>+<span class="built_in">rsi</span>*<span class="number">4</span>]</span><br><span class="line">KiSystemCall64+<span class="number">909</span>  <span class="number">190</span> 0F BE <span class="number">04</span> <span class="number">07</span>                                         <span class="keyword">movsx</span>   <span class="built_in">eax</span>, <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rdi</span>+<span class="built_in">rax</span>]</span><br><span class="line">KiSystemCall64+<span class="number">90D</span>  <span class="number">190</span> <span class="number">0B</span> C0                                               <span class="keyword">or</span>      <span class="built_in">eax</span>, <span class="built_in">eax</span></span><br><span class="line">KiSystemCall64+90F  <span class="number">190</span> 0F 8E CB FB FF FF                                   <span class="keyword">jle</span>     KiSystemServiceExit <span class="comment">; _KTRAP_FRAME.Rbx 恢复寄存器 rbx,rdi,rsi</span></span><br><span class="line">KiSystemCall64+<span class="number">915</span></span><br><span class="line">KiSystemCall64+<span class="number">915</span>                                          loc_FFFFF8034C87C3D5:                   <span class="comment">; CODE XREF: KiSystemCall64+8B8↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">915</span>                                                                                  <span class="comment">; KiSystemCall64+903↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">915</span>  <span class="number">190</span> B8 1C <span class="number">00</span> <span class="number">00</span> C0                                      <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">0C000001Ch</span></span><br><span class="line">KiSystemCall64+91A  <span class="number">190</span> E9 C1 FB FF FF                                      <span class="keyword">jmp</span>     KiSystemServiceExit <span class="comment">; _KTRAP_FRAME.Rbx 恢复寄存器 rbx,rdi,rsi</span></span><br><span class="line">KiSystemCall64+91F                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64+91F</span><br><span class="line">KiSystemCall64+91F                                          loc_FFFFF8034C87C3DF:                   <span class="comment">; CODE XREF: KiSystemCall64+51D↑j</span></span><br><span class="line">KiSystemCall64+91F                                                                                  <span class="comment">; KiSystemCall64+770↑j</span></span><br><span class="line">KiSystemCall64+91F  <span class="number">190</span> B9 4A <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">4Ah</span> <span class="comment">; 'J'</span></span><br><span class="line">KiSystemCall64+<span class="number">924</span>  <span class="number">190</span> <span class="number">45</span> <span class="number">33</span> C9                                            <span class="keyword">xor</span>     <span class="built_in">r9d</span>, <span class="built_in">r9d</span></span><br><span class="line">KiSystemCall64+<span class="number">927</span>  <span class="number">190</span> <span class="number">45</span> 0F <span class="number">20</span> C0                                         <span class="keyword">mov</span>     <span class="built_in">r8</span>, <span class="built_in">cr8</span></span><br><span class="line">KiSystemCall64+92B  <span class="number">190</span> <span class="number">45</span> <span class="number">0B</span> C0                                            <span class="keyword">or</span>      <span class="built_in">r8d</span>, <span class="built_in">r8d</span></span><br><span class="line">KiSystemCall64+92E  <span class="number">190</span> <span class="number">75</span> <span class="number">14</span>                                               <span class="keyword">jnz</span>     short loc_FFFFF8034C87C404</span><br><span class="line">KiSystemCall64+<span class="number">930</span>  <span class="number">190</span> B9 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">1</span></span><br><span class="line">KiSystemCall64+<span class="number">935</span>  <span class="number">190</span> <span class="number">45</span> 0F B6 <span class="number">83</span> 4A <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">movzx</span>   <span class="built_in">r8d</span>, <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">r11</span>+<span class="number">24Ah</span>]</span><br><span class="line">KiSystemCall64+<span class="number">93D</span>  <span class="number">190</span> <span class="number">45</span> 8B 8B E4 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">r9d</span>, [<span class="built_in">r11</span>+<span class="number">1E4h</span>]</span><br><span class="line">KiSystemCall64+<span class="number">944</span></span><br><span class="line">KiSystemCall64+<span class="number">944</span>                                          loc_FFFFF8034C87C404:                   <span class="comment">; CODE XREF: KiSystemCall64+92E↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">944</span>  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">95</span> E8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rdx</span>, [<span class="built_in">rbp</span>+<span class="number">0E8h</span>]</span><br><span class="line">KiSystemCall64+94B  <span class="number">190</span> 4C 8B D5                                            <span class="keyword">mov</span>     <span class="built_in">r10</span>, <span class="built_in">rbp</span></span><br><span class="line">KiSystemCall64+94E  <span class="number">190</span> E8 ED <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">call</span>    KiBugCheckDispatch</span><br><span class="line">KiSystemCall64+<span class="number">953</span>                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64+<span class="number">953</span></span><br><span class="line">KiSystemCall64+<span class="number">953</span>                                          loc_FFFFF8034C87C413:                   <span class="comment">; CODE XREF: KiSystemCall64+4BA↑j</span></span><br><span class="line">KiSystemCall64+<span class="number">953</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">83</span> EC <span class="number">50</span>                                         <span class="keyword">sub</span>     <span class="built_in">rsp</span>, <span class="number">50h</span></span><br><span class="line">KiSystemCall64+<span class="number">957</span>  1E0 <span class="number">48</span> <span class="number">89</span> 4C <span class="number">24</span> <span class="number">20</span>                                      <span class="keyword">mov</span>     [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1C0], <span class="built_in">rcx</span></span><br><span class="line">KiSystemCall64+95C  1E0 <span class="number">48</span> <span class="number">89</span> <span class="number">54</span> <span class="number">24</span> <span class="number">28</span>                                      <span class="keyword">mov</span>     [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1B8], <span class="built_in">rdx</span></span><br><span class="line">KiSystemCall64+<span class="number">961</span>  1E0 4C <span class="number">89</span> <span class="number">44</span> <span class="number">24</span> <span class="number">30</span>                                      <span class="keyword">mov</span>     [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1B0], <span class="built_in">r8</span></span><br><span class="line">KiSystemCall64+<span class="number">966</span>  1E0 4C <span class="number">89</span> 4C <span class="number">24</span> <span class="number">38</span>                                      <span class="keyword">mov</span>     [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1A8], <span class="built_in">r9</span></span><br><span class="line">KiSystemCall64+96B  1E0 4C <span class="number">89</span> <span class="number">54</span> <span class="number">24</span> <span class="number">40</span>                                      <span class="keyword">mov</span>     [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1A0], <span class="built_in">r10</span></span><br><span class="line">KiSystemCall64+<span class="number">970</span>  1E0 <span class="number">49</span> 8B CA                                            <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">r10</span></span><br><span class="line">KiSystemCall64+<span class="number">973</span>  1E0 <span class="number">48</span> 8B D4                                            <span class="keyword">mov</span>     <span class="built_in">rdx</span>, <span class="built_in">rsp</span></span><br><span class="line">KiSystemCall64+<span class="number">976</span>  1E0 <span class="number">48</span> <span class="number">83</span> C2 <span class="number">20</span>                                         <span class="keyword">add</span>     <span class="built_in">rdx</span>, <span class="number">20h</span> <span class="comment">; ' '</span></span><br><span class="line">KiSystemCall64+97A  1E0 <span class="number">49</span> C7 C0 <span class="number">04</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">r8</span>, <span class="number">4</span></span><br><span class="line">KiSystemCall64+<span class="number">981</span>  1E0 4C 8B CC                                            <span class="keyword">mov</span>     <span class="built_in">r9</span>, <span class="built_in">rsp</span></span><br><span class="line">KiSystemCall64+<span class="number">984</span>  1E0 <span class="number">49</span> <span class="number">83</span> C1 <span class="number">70</span>                                         <span class="keyword">add</span>     <span class="built_in">r9</span>, <span class="number">70h</span> <span class="comment">; 'p'</span></span><br><span class="line">KiSystemCall64+<span class="number">988</span>  1E0 E8 B3 F4 6A <span class="number">00</span>                                      <span class="keyword">call</span>    KiTrackSystemCallEntry</span><br><span class="line">KiSystemCall64+<span class="number">98D</span>  1E0 <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> B0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">50h</span>], <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+<span class="number">991</span>  1E0 <span class="number">48</span> 8B 4C <span class="number">24</span> <span class="number">20</span>                                      <span class="keyword">mov</span>     <span class="built_in">rcx</span>, [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1C0]</span><br><span class="line">KiSystemCall64+<span class="number">996</span>  1E0 <span class="number">48</span> 8B <span class="number">54</span> <span class="number">24</span> <span class="number">28</span>                                      <span class="keyword">mov</span>     <span class="built_in">rdx</span>, [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1B8]</span><br><span class="line">KiSystemCall64+99B  1E0 4C 8B <span class="number">44</span> <span class="number">24</span> <span class="number">30</span>                                      <span class="keyword">mov</span>     <span class="built_in">r8</span>, [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1B0]</span><br><span class="line">KiSystemCall64+9A0  1E0 4C 8B 4C <span class="number">24</span> <span class="number">38</span>                                      <span class="keyword">mov</span>     <span class="built_in">r9</span>, [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1A8]</span><br><span class="line">KiSystemCall64+9A5  1E0 4C 8B <span class="number">54</span> <span class="number">24</span> <span class="number">40</span>                                      <span class="keyword">mov</span>     <span class="built_in">r10</span>, [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1A0]</span><br><span class="line">KiSystemCall64+9AA  1E0 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">50</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">50h</span></span><br><span class="line">KiSystemCall64+9AE  <span class="number">190</span> <span class="number">49</span> 8B C2                                            <span class="keyword">mov</span>     <span class="built_in">rax</span>, <span class="built_in">r10</span></span><br><span class="line">KiSystemCall64+9B1  <span class="number">190</span> FF D0                                               <span class="keyword">call</span>    <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+9B3  <span class="number">190</span> 0F 1F <span class="number">00</span>                                            <span class="keyword">nop</span>     <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rax</span>]</span><br><span class="line">KiSystemCall64+9B6  <span class="number">190</span> <span class="number">48</span> 8B <span class="number">4D</span> B0                                         <span class="keyword">mov</span>     <span class="built_in">rcx</span>, [<span class="built_in">rbp</span>-<span class="number">50h</span>]</span><br><span class="line">KiSystemCall64+9BA  <span class="number">190</span> <span class="number">48</span> 8B D0                                            <span class="keyword">mov</span>     <span class="built_in">rdx</span>, <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+9BD  <span class="number">190</span> E8 9E F5 6A <span class="number">00</span>                                      <span class="keyword">call</span>    KiTrackSystemCallExit</span><br><span class="line">KiSystemCall64+9C2  <span class="number">190</span> E9 <span class="number">11</span> FB FF FF                                      <span class="keyword">jmp</span>     loc_FFFFF8034C87BF98 <span class="comment">; kpcr._KPRCB.KeSystemCalls + 1</span></span><br><span class="line">KiSystemCall64+9C2                                                                                  <span class="comment">; 自系统启动以来发生的系统调用数量的单调计数器。</span></span><br><span class="line">KiSystemCall64+9C7                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64+9C7</span><br><span class="line">KiSystemCall64+9C7                                          loc_FFFFF8034C87C487:                   <span class="comment">; CODE XREF: KiSystemCall64+4CA↑j</span></span><br><span class="line">KiSystemCall64+9C7  <span class="number">190</span> <span class="number">48</span> <span class="number">83</span> EC <span class="number">50</span>                                         <span class="keyword">sub</span>     <span class="built_in">rsp</span>, <span class="number">50h</span></span><br><span class="line">KiSystemCall64+9CB  1E0 <span class="number">48</span> <span class="number">89</span> 4C <span class="number">24</span> <span class="number">20</span>                                      <span class="keyword">mov</span>     [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1C0], <span class="built_in">rcx</span></span><br><span class="line">KiSystemCall64+9D0  1E0 <span class="number">48</span> <span class="number">89</span> <span class="number">54</span> <span class="number">24</span> <span class="number">28</span>                                      <span class="keyword">mov</span>     [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1B8], <span class="built_in">rdx</span></span><br><span class="line">KiSystemCall64+9D5  1E0 4C <span class="number">89</span> <span class="number">44</span> <span class="number">24</span> <span class="number">30</span>                                      <span class="keyword">mov</span>     [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1B0], <span class="built_in">r8</span></span><br><span class="line">KiSystemCall64+9DA  1E0 4C <span class="number">89</span> 4C <span class="number">24</span> <span class="number">38</span>                                      <span class="keyword">mov</span>     [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1A8], <span class="built_in">r9</span></span><br><span class="line">KiSystemCall64+9DF  1E0 4C <span class="number">89</span> <span class="number">54</span> <span class="number">24</span> <span class="number">40</span>                                      <span class="keyword">mov</span>     [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1A0], <span class="built_in">r10</span></span><br><span class="line">KiSystemCall64+9E4  1E0 <span class="number">49</span> 8B CA                                            <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">r10</span></span><br><span class="line">KiSystemCall64+9E7  1E0 E8 <span class="number">54</span> F7 <span class="number">15</span> <span class="number">00</span>                                      <span class="keyword">call</span>    PerfInfoLogSysCallEntry</span><br><span class="line">KiSystemCall64+9EC  1E0 <span class="number">48</span> 8B 4C <span class="number">24</span> <span class="number">20</span>                                      <span class="keyword">mov</span>     <span class="built_in">rcx</span>, [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1C0]</span><br><span class="line">KiSystemCall64+9F1  1E0 <span class="number">48</span> 8B <span class="number">54</span> <span class="number">24</span> <span class="number">28</span>                                      <span class="keyword">mov</span>     <span class="built_in">rdx</span>, [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1B8]</span><br><span class="line">KiSystemCall64+9F6  1E0 4C 8B <span class="number">44</span> <span class="number">24</span> <span class="number">30</span>                                      <span class="keyword">mov</span>     <span class="built_in">r8</span>, [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1B0]</span><br><span class="line">KiSystemCall64+9FB  1E0 4C 8B 4C <span class="number">24</span> <span class="number">38</span>                                      <span class="keyword">mov</span>     <span class="built_in">r9</span>, [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1A8]</span><br><span class="line">KiSystemCall64+A00  1E0 4C 8B <span class="number">54</span> <span class="number">24</span> <span class="number">40</span>                                      <span class="keyword">mov</span>     <span class="built_in">r10</span>, [<span class="built_in">rsp</span>+<span class="number">1E0h</span>+var_1A0]</span><br><span class="line">KiSystemCall64+A05  1E0 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">50</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">50h</span></span><br><span class="line">KiSystemCall64+A09  <span class="number">190</span> <span class="number">49</span> 8B C2                                            <span class="keyword">mov</span>     <span class="built_in">rax</span>, <span class="built_in">r10</span></span><br><span class="line">KiSystemCall64+A0C  <span class="number">190</span> FF D0                                               <span class="keyword">call</span>    <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+A0E  <span class="number">190</span> 0F 1F <span class="number">00</span>                                            <span class="keyword">nop</span>     <span class="built_in">dword</span> <span class="built_in">ptr</span> [<span class="built_in">rax</span>]</span><br><span class="line">KiSystemCall64+A11  <span class="number">190</span> <span class="number">48</span> 8B C8                                            <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">rax</span></span><br><span class="line">KiSystemCall64+A14  <span class="number">190</span> E8 C7 F7 <span class="number">15</span> <span class="number">00</span>                                      <span class="keyword">call</span>    PerfInfoLogSysCallExit</span><br><span class="line">KiSystemCall64+A19  <span class="number">190</span> E9 BA FA FF FF                                      <span class="keyword">jmp</span>     loc_FFFFF8034C87BF98 <span class="comment">; kpcr._KPRCB.KeSystemCalls + 1</span></span><br><span class="line">KiSystemCall64+A19                                                                                  <span class="comment">; 自系统启动以来发生的系统调用数量的单调计数器。</span></span><br><span class="line">KiSystemCall64+A1E                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64+A1E  <span class="number">000</span> C3                                                  <span class="keyword">retn</span></span><br><span class="line">KiSystemCall64+A1E                                          <span class="comment">; &#125; // starts at FFFFF8034C87BAC0</span></span><br><span class="line">KiSystemCall64+A1E                                          KiSystemCall64  endp <span class="comment">; sp-analysis failed</span></span><br></pre></td></tr></table></figure><h3 id="KiSystemCall64Shadow"><a href="#KiSystemCall64Shadow" class="headerlink" title="KiSystemCall64Shadow"></a>KiSystemCall64Shadow</h3><p>和KisystemCall64区别不大，多了一个上文RPL校验，进行cr3的切换，最终都去调用 <code>KiSystemServiceUser</code>,通过访问SSDT表，获取函数地址。</p><figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br></pre></td><td class="code"><pre><span class="line">KiSystemCall64Shadow                                              KiSystemCall64Shadow proc <span class="built_in">near</span>          <span class="comment">; DATA XREF: sub_FFFFF8034C8622F4+34↑o</span></span><br><span class="line">KiSystemCall64Shadow                                                                                      <span class="comment">; .pdata:FFFFF8034CBE5BCC↓o</span></span><br><span class="line">KiSystemCall64Shadow                                                                                      <span class="comment">; KiInitializeBootStructures+1B7↓o</span></span><br><span class="line">KiSystemCall64Shadow</span><br><span class="line">KiSystemCall64Shadow                                              var_110         = <span class="built_in">byte</span> <span class="built_in">ptr</span> -<span class="number">110h</span></span><br><span class="line">KiSystemCall64Shadow</span><br><span class="line">KiSystemCall64Shadow      <span class="number">000</span> 0F <span class="number">01</span> F8                                            <span class="keyword">swapgs</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">3</span>    <span class="number">000</span> <span class="number">65</span> <span class="number">48</span> <span class="number">89</span> <span class="number">24</span> <span class="number">25</span> <span class="number">10</span> <span class="number">70</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">gs</span>:_KPCR.Prcb.UserRspShadow, <span class="built_in">rsp</span> <span class="comment">; 保存r3的rsp</span></span><br><span class="line">KiSystemCall64Shadow+C    <span class="number">000</span> <span class="number">65</span> <span class="number">48</span> 8B <span class="number">24</span> <span class="number">25</span> <span class="number">00</span> <span class="number">70</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rsp</span>, <span class="built_in">gs</span>:_KPCR.Prcb.KernelDirectoryTableBase</span><br><span class="line">KiSystemCall64Shadow+<span class="number">15</span>   <span class="number">000</span> <span class="number">65</span> 0F BA <span class="number">24</span> <span class="number">25</span> <span class="number">18</span> <span class="number">70</span> <span class="number">00</span> <span class="number">00</span> <span class="number">01</span>                       <span class="keyword">bt</span>      <span class="built_in">gs</span>:_KPCR.Prcb.ShadowFlags, <span class="number">1</span></span><br><span class="line">KiSystemCall64Shadow+1F   <span class="number">000</span> <span class="number">72</span> <span class="number">03</span>                                               <span class="keyword">jb</span>      short loc_FFFFF8034C9FD164 <span class="comment">; 切换内核栈</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">21</span>   <span class="number">000</span> 0F <span class="number">22</span> DC                                            <span class="keyword">mov</span>     <span class="built_in">cr3</span>, <span class="built_in">rsp</span>        <span class="comment">; 切换cr3</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">24</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">24</span>                                           loc_FFFFF8034C9FD164:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+1F↑j</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">24</span>   <span class="number">000</span> <span class="number">65</span> <span class="number">48</span> 8B <span class="number">24</span> <span class="number">25</span> <span class="number">08</span> <span class="number">70</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rsp</span>, <span class="built_in">gs</span>:_KPCR.Prcb.RspBaseShadow <span class="comment">; 切换内核栈</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">2D</span>   <span class="number">000</span> 6A 2B                                               <span class="keyword">push</span>    <span class="number">2Bh</span> <span class="comment">; '+'       ; SegSs 构造kTRAP_FRAME</span></span><br><span class="line">KiSystemCall64Shadow+2F   <span class="number">008</span> <span class="number">65</span> FF <span class="number">34</span> <span class="number">25</span> <span class="number">10</span> <span class="number">70</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">push</span>    <span class="built_in">gs</span>:_KPCR.Prcb.UserRspShadow <span class="comment">; Rsp</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">37</span>   <span class="number">010</span> <span class="number">41</span> <span class="number">53</span>                                               <span class="keyword">push</span>    <span class="built_in">r11</span>             <span class="comment">; EFLAGS</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">39</span>   <span class="number">018</span> 6A <span class="number">33</span>                                               <span class="keyword">push</span>    <span class="number">33h</span> <span class="comment">; '3'       ; SegCs</span></span><br><span class="line">KiSystemCall64Shadow+3B   <span class="number">020</span> <span class="number">51</span>                                                  <span class="keyword">push</span>    <span class="built_in">rcx</span>             <span class="comment">; Rip</span></span><br><span class="line">KiSystemCall64Shadow+3C   <span class="number">028</span> <span class="number">49</span> 8B CA                                            <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">r10</span></span><br><span class="line">KiSystemCall64Shadow+3F   <span class="number">028</span> <span class="number">48</span> <span class="number">83</span> EC <span class="number">08</span>                                         <span class="keyword">sub</span>     <span class="built_in">rsp</span>, <span class="number">8</span>          <span class="comment">; 填充ExceptionFrame</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">43</span>   <span class="number">030</span> <span class="number">55</span>                                                  <span class="keyword">push</span>    <span class="built_in">rbp</span>             <span class="comment">; Rbp</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">44</span>   <span class="number">038</span> <span class="number">48</span> <span class="number">81</span> EC <span class="number">58</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">sub</span>     <span class="built_in">rsp</span>, <span class="number">158h</span>       <span class="comment">; 申请剩余栈空间</span></span><br><span class="line">KiSystemCall64Shadow+4B   <span class="number">190</span> <span class="number">48</span> <span class="number">8D</span> AC <span class="number">24</span> <span class="number">80</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">lea</span>     <span class="built_in">rbp</span>, [<span class="built_in">rsp</span>+<span class="number">80h</span>]  <span class="comment">; 指向xmm1</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">53</span>   <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">9D</span> C0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     [<span class="built_in">rbp</span>+<span class="number">0C0h</span>], <span class="built_in">rbx</span> <span class="comment">; Rbx</span></span><br><span class="line">KiSystemCall64Shadow+5A   <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> BD C8 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     [<span class="built_in">rbp</span>+<span class="number">0C8h</span>], <span class="built_in">rdi</span> <span class="comment">; Rdi</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">61</span>   <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> B5 D0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     [<span class="built_in">rbp</span>+<span class="number">0D0h</span>], <span class="built_in">rsi</span> <span class="comment">; Rsi</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">68</span>   <span class="number">190</span> <span class="number">65</span> F6 <span class="number">04</span> <span class="number">25</span> <span class="number">24</span> <span class="number">64</span> <span class="number">00</span> <span class="number">00</span> <span class="number">02</span>                          <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> <span class="built_in">gs</span>:_KPCR.Prcb.FeatureBits+<span class="number">4</span>, <span class="number">2</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">71</span>   <span class="number">190</span> <span class="number">74</span> 0C                                               <span class="keyword">jz</span>      short loc_FFFFF8034C9FD1BF <span class="comment">; 保存寄存器</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">73</span>   <span class="number">190</span> F6 <span class="number">85</span> F0 <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">01</span>                                <span class="keyword">test</span>    <span class="built_in">byte</span> <span class="built_in">ptr</span> [<span class="built_in">rbp</span>+<span class="number">0F0h</span>], <span class="number">1</span> <span class="comment">; RegCs 校验是否由r3调用 ，3环则关闭SMAP</span></span><br><span class="line">KiSystemCall64Shadow+7A   <span class="number">190</span> <span class="number">74</span> <span class="number">03</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C9FD1BF <span class="comment">; 保存寄存器</span></span><br><span class="line">KiSystemCall64Shadow+7C   <span class="number">190</span> 0F <span class="number">01</span> CB                                            <span class="keyword">stac</span>                    <span class="comment">; 关闭smap</span></span><br><span class="line">KiSystemCall64Shadow+7F</span><br><span class="line">KiSystemCall64Shadow+7F                                           loc_FFFFF8034C9FD1BF:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+71↑j</span></span><br><span class="line">KiSystemCall64Shadow+7F                                                                                   <span class="comment">; KiSystemCall64Shadow+7A↑j</span></span><br><span class="line">KiSystemCall64Shadow+7F   <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">45</span> B0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">50h</span>], <span class="built_in">rax</span>  <span class="comment">; 保存寄存器</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">83</span>   <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">4D</span> B8                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">48h</span>], <span class="built_in">rcx</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">87</span>   <span class="number">190</span> <span class="number">48</span> <span class="number">89</span> <span class="number">55</span> C0                                         <span class="keyword">mov</span>     [<span class="built_in">rbp</span>-<span class="number">40h</span>], <span class="built_in">rdx</span></span><br><span class="line">KiSystemCall64Shadow+8B   <span class="number">190</span> <span class="number">65</span> <span class="number">48</span> 8B 0C <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">gs</span>:_KPCR.Prcb.CurrentThread</span><br><span class="line">KiSystemCall64Shadow+<span class="number">94</span>   <span class="number">190</span> <span class="number">48</span> 8B <span class="number">89</span> <span class="number">20</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rcx</span>, [<span class="built_in">rcx</span>+_KTHREAD.Process]</span><br><span class="line">KiSystemCall64Shadow+9B   <span class="number">190</span> <span class="number">48</span> 8B <span class="number">89</span> <span class="number">60</span> <span class="number">08</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rcx</span>, <span class="built_in">qword</span> <span class="built_in">ptr</span> [<span class="built_in">rcx</span>+(_KPROCESS.Spare2+<span class="number">5D7h</span>)]</span><br><span class="line">KiSystemCall64Shadow+A2   <span class="number">190</span> <span class="number">65</span> <span class="number">48</span> <span class="number">89</span> 0C <span class="number">25</span> <span class="number">70</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">gs</span>:_KPCR.Prcb.___u40.__s0.TrappedSecurityDomain, <span class="built_in">rcx</span></span><br><span class="line">KiSystemCall64Shadow+AB   <span class="number">190</span> <span class="number">65</span> 8A 0C <span class="number">25</span> <span class="number">50</span> <span class="number">08</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">mov</span>     <span class="built_in">cl</span>, <span class="built_in">gs</span>:_KPCR.Prcb.___u45.__s0.BpbRetpolineExitSpecCtrl</span><br><span class="line">KiSystemCall64Shadow+B3   <span class="number">190</span> <span class="number">65</span> <span class="number">88</span> 0C <span class="number">25</span> <span class="number">51</span> <span class="number">08</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">mov</span>     <span class="built_in">gs</span>:_KPCR.Prcb.___u45.__s0.BpbTrappedRetpolineExitSpecCtrl, <span class="built_in">cl</span></span><br><span class="line">KiSystemCall64Shadow+BB   <span class="number">190</span> <span class="number">65</span> 8A 0C <span class="number">25</span> <span class="number">78</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">mov</span>     <span class="built_in">cl</span>, <span class="built_in">gs</span>:_KPCR.Prcb.___u40.__s0.BpbState</span><br><span class="line">KiSystemCall64Shadow+C3   <span class="number">190</span> <span class="number">65</span> <span class="number">88</span> 0C <span class="number">25</span> <span class="number">52</span> <span class="number">08</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">mov</span>     <span class="built_in">gs</span>:_KPCR.Prcb.___u45.__s0.BpbTrappedBpbState, <span class="built_in">cl</span></span><br><span class="line">KiSystemCall64Shadow+CB   <span class="number">190</span> <span class="number">65</span> 0F B6 <span class="number">04</span> <span class="number">25</span> 7B <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">movzx</span>   <span class="built_in">eax</span>, <span class="built_in">gs</span>:_KPCR.Prcb.___u40.__s0.BpbKernelSpecCtrl</span><br><span class="line">KiSystemCall64Shadow+D4   <span class="number">190</span> <span class="number">65</span> <span class="number">38</span> <span class="number">04</span> <span class="number">25</span> 7A <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">cmp</span>     <span class="built_in">gs</span>:_KPCR.Prcb.___u40.__s0.BpbCurrentSpecCtrl, <span class="built_in">al</span></span><br><span class="line">KiSystemCall64Shadow+DC   <span class="number">190</span> <span class="number">74</span> <span class="number">11</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C9FD22F</span><br><span class="line">KiSystemCall64Shadow+DE   <span class="number">190</span> <span class="number">65</span> <span class="number">88</span> <span class="number">04</span> <span class="number">25</span> 7A <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">mov</span>     <span class="built_in">gs</span>:_KPCR.Prcb.___u40.__s0.BpbCurrentSpecCtrl, <span class="built_in">al</span></span><br><span class="line">KiSystemCall64Shadow+E6   <span class="number">190</span> B9 <span class="number">48</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">48h</span> <span class="comment">; 'H'</span></span><br><span class="line">KiSystemCall64Shadow+EB   <span class="number">190</span> <span class="number">33</span> D2                                               <span class="keyword">xor</span>     <span class="built_in">edx</span>, <span class="built_in">edx</span>        <span class="comment">;  IA32_SPEC_CTRL</span></span><br><span class="line">KiSystemCall64Shadow+ED   <span class="number">190</span> 0F <span class="number">30</span>                                               <span class="keyword">wrmsr</span></span><br><span class="line">KiSystemCall64Shadow+EF</span><br><span class="line">KiSystemCall64Shadow+EF                                           loc_FFFFF8034C9FD22F:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+DC↑j</span></span><br><span class="line">KiSystemCall64Shadow+EF   <span class="number">190</span> <span class="number">65</span> 0F B6 <span class="number">14</span> <span class="number">25</span> <span class="number">78</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">movzx</span>   <span class="built_in">edx</span>, <span class="built_in">gs</span>:_KPCR.Prcb.___u40.__s0.BpbState</span><br><span class="line">KiSystemCall64Shadow+F8   <span class="number">190</span> F7 C2 <span class="number">08</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">test</span>    <span class="built_in">edx</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+FE   <span class="number">190</span> <span class="number">74</span> <span class="number">13</span>                                               <span class="keyword">jz</span>      short loc_FFFFF8034C9FD253</span><br><span class="line">KiSystemCall64Shadow+<span class="number">100</span>  <span class="number">190</span> B8 <span class="number">01</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">1</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">105</span>  <span class="number">190</span> <span class="number">33</span> D2                                               <span class="keyword">xor</span>     <span class="built_in">edx</span>, <span class="built_in">edx</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">107</span>  <span class="number">190</span> B9 <span class="number">49</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">49h</span> <span class="comment">; 'I'</span></span><br><span class="line">KiSystemCall64Shadow+10C  <span class="number">190</span> 0F <span class="number">30</span>                                               <span class="keyword">wrmsr</span>                   <span class="comment">;  IA32_PRED_CMD</span></span><br><span class="line">KiSystemCall64Shadow+10E  <span class="number">190</span> E9 3E <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">jmp</span>     loc_FFFFF8034C9FD391 <span class="comment">; 分支预测补丁</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">113</span>                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">113</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">113</span>                                          loc_FFFFF8034C9FD253:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+FE↑j</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">113</span>  <span class="number">190</span> F7 C2 <span class="number">02</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">test</span>    <span class="built_in">edx</span>, <span class="number">2</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">119</span>  <span class="number">190</span> 0F <span class="number">84</span> 2F <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">jz</span>      loc_FFFFF8034C9FD38E</span><br><span class="line">KiSystemCall64Shadow+11F  <span class="number">190</span> <span class="number">65</span> F6 <span class="number">04</span> <span class="number">25</span> <span class="number">79</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span> <span class="number">04</span>                          <span class="keyword">test</span>    <span class="built_in">gs</span>:_KPCR.Prcb.___u40.__s0.BpbFeatures, <span class="number">4</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">128</span>  <span class="number">190</span> 0F <span class="number">85</span> <span class="number">20</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                   <span class="keyword">jnz</span>     loc_FFFFF8034C9FD38E</span><br><span class="line">KiSystemCall64Shadow+12E  <span class="number">190</span> E8 0E <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD381</span><br><span class="line">KiSystemCall64Shadow+<span class="number">133</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">133</span>                                          loc_FFFFF8034C9FD273:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+140↓p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">133</span>  <span class="number">190</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">137</span>  <span class="number">188</span> E8 0E <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD38A</span><br><span class="line">KiSystemCall64Shadow+13C</span><br><span class="line">KiSystemCall64Shadow+13C                                          loc_FFFFF8034C9FD27C:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+149↓p</span></span><br><span class="line">KiSystemCall64Shadow+13C  <span class="number">188</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">140</span>  <span class="number">180</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD273</span><br><span class="line">KiSystemCall64Shadow+<span class="number">145</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">145</span>                                          loc_FFFFF8034C9FD285:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+152↓p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">145</span>  <span class="number">180</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">149</span>  <span class="number">178</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD27C</span><br><span class="line">KiSystemCall64Shadow+14E</span><br><span class="line">KiSystemCall64Shadow+14E                                          loc_FFFFF8034C9FD28E:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+15B↓p</span></span><br><span class="line">KiSystemCall64Shadow+14E  <span class="number">178</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">152</span>  <span class="number">170</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD285</span><br><span class="line">KiSystemCall64Shadow+<span class="number">157</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">157</span>                                          loc_FFFFF8034C9FD297:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+164↓p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">157</span>  <span class="number">170</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+15B  <span class="number">168</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD28E</span><br><span class="line">KiSystemCall64Shadow+<span class="number">160</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">160</span>                                          loc_FFFFF8034C9FD2A0:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+16D↓p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">160</span>  <span class="number">168</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">164</span>  <span class="number">160</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD297</span><br><span class="line">KiSystemCall64Shadow+<span class="number">169</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">169</span>                                          loc_FFFFF8034C9FD2A9:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+176↓p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">169</span>  <span class="number">160</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">16D</span>  <span class="number">158</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD2A0</span><br><span class="line">KiSystemCall64Shadow+<span class="number">172</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">172</span>                                          loc_FFFFF8034C9FD2B2:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+17F↓p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">172</span>  <span class="number">158</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">176</span>  <span class="number">150</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD2A9</span><br><span class="line">KiSystemCall64Shadow+17B</span><br><span class="line">KiSystemCall64Shadow+17B                                          loc_FFFFF8034C9FD2BB:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+188↓p</span></span><br><span class="line">KiSystemCall64Shadow+17B  <span class="number">150</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+17F  <span class="number">148</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD2B2</span><br><span class="line">KiSystemCall64Shadow+<span class="number">184</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">184</span>                                          loc_FFFFF8034C9FD2C4:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+191↓p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">184</span>  <span class="number">148</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">188</span>  <span class="number">140</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD2BB</span><br><span class="line">KiSystemCall64Shadow+<span class="number">18D</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">18D</span>                                          loc_FFFFF8034C9FD2CD:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+19A↓p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">18D</span>  <span class="number">140</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">191</span>  <span class="number">138</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD2C4</span><br><span class="line">KiSystemCall64Shadow+<span class="number">196</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">196</span>                                          loc_FFFFF8034C9FD2D6:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+1A3↓p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">196</span>  <span class="number">138</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+19A  <span class="number">130</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD2CD</span><br><span class="line">KiSystemCall64Shadow+19F</span><br><span class="line">KiSystemCall64Shadow+19F                                          loc_FFFFF8034C9FD2DF:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+1AC↓p</span></span><br><span class="line">KiSystemCall64Shadow+19F  <span class="number">130</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+1A3  <span class="number">128</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD2D6</span><br><span class="line">KiSystemCall64Shadow+1A8</span><br><span class="line">KiSystemCall64Shadow+1A8                                          loc_FFFFF8034C9FD2E8:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+1B5↓p</span></span><br><span class="line">KiSystemCall64Shadow+1A8  <span class="number">128</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+1AC  <span class="number">120</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD2DF</span><br><span class="line">KiSystemCall64Shadow+1B1</span><br><span class="line">KiSystemCall64Shadow+1B1                                          loc_FFFFF8034C9FD2F1:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+1BE↓p</span></span><br><span class="line">KiSystemCall64Shadow+1B1  <span class="number">120</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+1B5  <span class="number">118</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD2E8</span><br><span class="line">KiSystemCall64Shadow+1BA</span><br><span class="line">KiSystemCall64Shadow+1BA                                          loc_FFFFF8034C9FD2FA:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+1C7↓p</span></span><br><span class="line">KiSystemCall64Shadow+1BA  <span class="number">118</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+1BE  <span class="number">110</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD2F1</span><br><span class="line">KiSystemCall64Shadow+1C3</span><br><span class="line">KiSystemCall64Shadow+1C3                                          loc_FFFFF8034C9FD303:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+1D0↓p</span></span><br><span class="line">KiSystemCall64Shadow+1C3  <span class="number">110</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+1C7  <span class="number">108</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD2FA</span><br><span class="line">KiSystemCall64Shadow+1CC</span><br><span class="line">KiSystemCall64Shadow+1CC                                          loc_FFFFF8034C9FD30C:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+1D9↓p</span></span><br><span class="line">KiSystemCall64Shadow+1CC  <span class="number">108</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+1D0  <span class="number">100</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD303</span><br><span class="line">KiSystemCall64Shadow+1D5</span><br><span class="line">KiSystemCall64Shadow+1D5                                          loc_FFFFF8034C9FD315:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+1E2↓p</span></span><br><span class="line">KiSystemCall64Shadow+1D5  <span class="number">100</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+1D9  0F8 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD30C</span><br><span class="line">KiSystemCall64Shadow+1DE</span><br><span class="line">KiSystemCall64Shadow+1DE                                          loc_FFFFF8034C9FD31E:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+1EB↓p</span></span><br><span class="line">KiSystemCall64Shadow+1DE  0F8 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+1E2  0F0 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD315</span><br><span class="line">KiSystemCall64Shadow+1E7</span><br><span class="line">KiSystemCall64Shadow+1E7                                          loc_FFFFF8034C9FD327:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+1F4↓p</span></span><br><span class="line">KiSystemCall64Shadow+1E7  0F0 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+1EB  0E8 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD31E</span><br><span class="line">KiSystemCall64Shadow+1F0</span><br><span class="line">KiSystemCall64Shadow+1F0                                          loc_FFFFF8034C9FD330:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+1FD↓p</span></span><br><span class="line">KiSystemCall64Shadow+1F0  0E8 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+1F4  0E0 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD327</span><br><span class="line">KiSystemCall64Shadow+1F9</span><br><span class="line">KiSystemCall64Shadow+1F9                                          loc_FFFFF8034C9FD339:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+206↓p</span></span><br><span class="line">KiSystemCall64Shadow+1F9  0E0 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+1FD  <span class="number">0D8</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD330</span><br><span class="line">KiSystemCall64Shadow+<span class="number">202</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">202</span>                                          loc_FFFFF8034C9FD342:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+20F↓p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">202</span>  <span class="number">0D8</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">206</span>  <span class="number">0D0</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD339</span><br><span class="line">KiSystemCall64Shadow+20B</span><br><span class="line">KiSystemCall64Shadow+20B                                          loc_FFFFF8034C9FD34B:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+218↓p</span></span><br><span class="line">KiSystemCall64Shadow+20B  <span class="number">0D0</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+20F  0C8 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD342</span><br><span class="line">KiSystemCall64Shadow+<span class="number">214</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">214</span>                                          loc_FFFFF8034C9FD354:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+221↓p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">214</span>  0C8 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">218</span>  0C0 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD34B</span><br><span class="line">KiSystemCall64Shadow+<span class="number">21D</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">21D</span>                                          loc_FFFFF8034C9FD35D:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+22A↓p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">21D</span>  0C0 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">221</span>  0B8 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD354</span><br><span class="line">KiSystemCall64Shadow+<span class="number">226</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">226</span>                                          loc_FFFFF8034C9FD366:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+233↓p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">226</span>  0B8 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+22A  <span class="number">0B0</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD35D</span><br><span class="line">KiSystemCall64Shadow+22F</span><br><span class="line">KiSystemCall64Shadow+22F                                          loc_FFFFF8034C9FD36F:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+23C↓p</span></span><br><span class="line">KiSystemCall64Shadow+22F  <span class="number">0B0</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">233</span>  0A8 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD366</span><br><span class="line">KiSystemCall64Shadow+<span class="number">238</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">238</span>                                          loc_FFFFF8034C9FD378:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+245↓p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">238</span>  0A8 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+23C  0A0 E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD36F</span><br><span class="line">KiSystemCall64Shadow+<span class="number">241</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">241</span>                                          loc_FFFFF8034C9FD381:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+12E↑p</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">241</span>  0A0 <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">245</span>  <span class="number">098</span> E8 EE FF FF FF                                      <span class="keyword">call</span>    loc_FFFFF8034C9FD378</span><br><span class="line">KiSystemCall64Shadow+24A</span><br><span class="line">KiSystemCall64Shadow+24A                                          loc_FFFFF8034C9FD38A:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+137↑p</span></span><br><span class="line">KiSystemCall64Shadow+24A  <span class="number">098</span> <span class="number">48</span> <span class="number">83</span> C4 <span class="number">08</span>                                         <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">8</span></span><br><span class="line">KiSystemCall64Shadow+24E</span><br><span class="line">KiSystemCall64Shadow+24E                                          loc_FFFFF8034C9FD38E:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+119↑j</span></span><br><span class="line">KiSystemCall64Shadow+24E                                                                                  <span class="comment">; KiSystemCall64Shadow+128↑j</span></span><br><span class="line">KiSystemCall64Shadow+24E  <span class="number">090</span> 0F AE E8                                            <span class="keyword">lfence</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">251</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">251</span>                                          loc_FFFFF8034C9FD391:                   <span class="comment">; CODE XREF: KiSystemCall64Shadow+10E↑j</span></span><br><span class="line">KiSystemCall64Shadow+<span class="number">251</span>  <span class="number">190</span> <span class="number">65</span> C6 <span class="number">04</span> <span class="number">25</span> <span class="number">53</span> <span class="number">08</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">gs</span>:_KPCR.Prcb.___u45.__s0.BpbRetpolineState, <span class="number">0</span></span><br><span class="line">KiSystemCall64Shadow+25A  <span class="number">190</span> E9 <span class="number">63</span> E9 E7 FF                                      <span class="keyword">jmp</span>     KiSystemServiceUser</span><br><span class="line">KiSystemCall64Shadow+25F                                          <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiSystemCall64Shadow+25F  <span class="number">000</span> C3                                                  <span class="keyword">retn</span></span><br><span class="line">KiSystemCall64Shadow+25F                                          KiSystemCall64Shadow endp <span class="comment">; sp-analysis failed</span></span><br></pre></td></tr></table></figure><h3 id="KiKernelSysretExit"><a href="#KiKernelSysretExit" class="headerlink" title="KiKernelSysretExit"></a>KiKernelSysretExit</h3><p>从UserDirectoryTableBase中恢复cr3，恢复栈的rbp和rsp。</p><figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">KiKernelSysretExit                                              KiKernelSysretExit proc <span class="built_in">near</span>            <span class="comment">; CODE XREF: KiCallUserMode+1BD↑j</span></span><br><span class="line">KiKernelSysretExit                                                                                      <span class="comment">; KiSystemCall64+716↑j</span></span><br><span class="line">KiKernelSysretExit                                                                                      <span class="comment">; KiUmsFastReturnToUser+254↑j</span></span><br><span class="line">KiKernelSysretExit                                                                                      <span class="comment">; DATA XREF: .pdata:FFFFF8034CBE5BB4↓o</span></span><br><span class="line">KiKernelSysretExit      <span class="number">000</span> <span class="number">65</span> 8B <span class="number">24</span> <span class="number">25</span> <span class="number">18</span> <span class="number">70</span> <span class="number">00</span> <span class="number">00</span>                             <span class="keyword">mov</span>     <span class="built_in">esp</span>, <span class="built_in">gs</span>:_KPCR.Prcb.ShadowFlags</span><br><span class="line">KiKernelSysretExit+<span class="number">8</span>    <span class="number">000</span> 0F BA E4 <span class="number">01</span>                                         <span class="keyword">bt</span>      <span class="built_in">esp</span>, <span class="number">1</span></span><br><span class="line">KiKernelSysretExit+C    <span class="number">000</span> <span class="number">72</span> <span class="number">36</span>                                               <span class="keyword">jb</span>      short loc_FFFFF8034C9FCDC4 <span class="comment">; 恢复rbp r9 = _KTRAP_FRAME.Rbp</span></span><br><span class="line">KiKernelSysretExit+E    <span class="number">000</span> <span class="number">65</span> <span class="number">48</span> 8B 2C <span class="number">25</span> <span class="number">88</span> <span class="number">01</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">mov</span>     <span class="built_in">rbp</span>, <span class="built_in">gs</span>:_KPCR.Prcb.CurrentThread</span><br><span class="line">KiKernelSysretExit+<span class="number">17</span>   <span class="number">000</span> <span class="number">48</span> 8B AD <span class="number">20</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rbp</span>, [<span class="built_in">rbp</span>+_KTHREAD.Process]</span><br><span class="line">KiKernelSysretExit+1E   <span class="number">000</span> <span class="number">48</span> 8B AD <span class="number">80</span> <span class="number">02</span> <span class="number">00</span> <span class="number">00</span>                                <span class="keyword">mov</span>     <span class="built_in">rbp</span>, [<span class="built_in">rbp</span>+_KPROCESS.UserDirectoryTableBase]</span><br><span class="line">KiKernelSysretExit+<span class="number">25</span>   <span class="number">000</span> 0F BA E5 <span class="number">00</span>                                         <span class="keyword">bt</span>      <span class="built_in">ebp</span>, <span class="number">0</span></span><br><span class="line">KiKernelSysretExit+<span class="number">29</span>   <span class="number">000</span> <span class="number">73</span> <span class="number">16</span>                                               <span class="keyword">jnb</span>     short loc_FFFFF8034C9FCDC1 <span class="comment">; 切回cr3</span></span><br><span class="line">KiKernelSysretExit+2B   <span class="number">000</span> 0F BA E4 <span class="number">00</span>                                         <span class="keyword">bt</span>      <span class="built_in">esp</span>, <span class="number">0</span></span><br><span class="line">KiKernelSysretExit+2F   <span class="number">000</span> <span class="number">72</span> <span class="number">07</span>                                               <span class="keyword">jb</span>      short loc_FFFFF8034C9FCDB8</span><br><span class="line">KiKernelSysretExit+<span class="number">31</span>   <span class="number">000</span> <span class="number">48</span> 0F BA ED 3F                                      <span class="keyword">bts</span>     <span class="built_in">rbp</span>, <span class="number">111111b</span></span><br><span class="line">KiKernelSysretExit+<span class="number">36</span>   <span class="number">000</span> EB <span class="number">09</span>                                               <span class="keyword">jmp</span>     short loc_FFFFF8034C9FCDC1 <span class="comment">; 切回cr3</span></span><br><span class="line">KiKernelSysretExit+<span class="number">38</span>                                           <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiKernelSysretExit+<span class="number">38</span></span><br><span class="line">KiKernelSysretExit+<span class="number">38</span>                                           loc_FFFFF8034C9FCDB8:                   <span class="comment">; CODE XREF: KiKernelSysretExit+2F↑j</span></span><br><span class="line">KiKernelSysretExit+<span class="number">38</span>   <span class="number">000</span> <span class="number">65</span> <span class="number">83</span> <span class="number">24</span> <span class="number">25</span> <span class="number">18</span> <span class="number">70</span> <span class="number">00</span> <span class="number">00</span> FE                          <span class="keyword">and</span>     <span class="built_in">gs</span>:_KPCR.Prcb.ShadowFlags, <span class="number">0FFFFFFFEh</span></span><br><span class="line">KiKernelSysretExit+<span class="number">41</span></span><br><span class="line">KiKernelSysretExit+<span class="number">41</span>                                           loc_FFFFF8034C9FCDC1:                   <span class="comment">; CODE XREF: KiKernelSysretExit+29↑j</span></span><br><span class="line">KiKernelSysretExit+<span class="number">41</span>                                                                                   <span class="comment">; KiKernelSysretExit+36↑j</span></span><br><span class="line">KiKernelSysretExit+<span class="number">41</span>   <span class="number">000</span> 0F <span class="number">22</span> <span class="built_in">DD</span>                                            <span class="keyword">mov</span>     <span class="built_in">cr3</span>, <span class="built_in">rbp</span>        <span class="comment">; 切回cr3</span></span><br><span class="line">KiKernelSysretExit+<span class="number">44</span></span><br><span class="line">KiKernelSysretExit+<span class="number">44</span>                                           loc_FFFFF8034C9FCDC4:                   <span class="comment">; CODE XREF: KiKernelSysretExit+C↑j</span></span><br><span class="line">KiKernelSysretExit+<span class="number">44</span>   <span class="number">000</span> <span class="number">49</span> 8B E9                                            <span class="keyword">mov</span>     <span class="built_in">rbp</span>, <span class="built_in">r9</span>         <span class="comment">; 恢复rbp r9 = _KTRAP_FRAME.Rbp</span></span><br><span class="line">KiKernelSysretExit+<span class="number">47</span>   <span class="number">000</span> 0F BA E4 <span class="number">01</span>                                         <span class="keyword">bt</span>      <span class="built_in">esp</span>, <span class="number">1</span></span><br><span class="line">KiKernelSysretExit+4B   <span class="number">000</span> <span class="number">72</span> <span class="number">09</span>                                               <span class="keyword">jb</span>      short loc_FFFFF8034C9FCDD6 <span class="comment">; 恢复rsp</span></span><br><span class="line">KiKernelSysretExit+<span class="number">4D</span>   <span class="number">000</span> <span class="number">65</span> 0F <span class="number">00</span> 2C <span class="number">25</span> 2A <span class="number">70</span> <span class="number">00</span> <span class="number">00</span>                          <span class="keyword">verw</span>    <span class="built_in">gs</span>:_KPCR.Prcb.VerwSelector</span><br><span class="line">KiKernelSysretExit+<span class="number">56</span></span><br><span class="line">KiKernelSysretExit+<span class="number">56</span>                                           loc_FFFFF8034C9FCDD6:                   <span class="comment">; CODE XREF: KiKernelSysretExit+4B↑j</span></span><br><span class="line">KiKernelSysretExit+<span class="number">56</span>   <span class="number">000</span> <span class="number">49</span> 8B E0                                            <span class="keyword">mov</span>     <span class="built_in">rsp</span>, <span class="built_in">r8</span>         <span class="comment">; 恢复rsp</span></span><br><span class="line">KiKernelSysretExit+<span class="number">59</span>   <span class="number">000</span> 0F <span class="number">01</span> F8                                            <span class="keyword">swapgs</span></span><br><span class="line">KiKernelSysretExit+5C   <span class="number">000</span> <span class="number">48</span> 0F <span class="number">07</span>                                            <span class="keyword">sysret</span></span><br><span class="line">KiKernelSysretExit+5F                                           <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line">KiKernelSysretExit+5F   <span class="number">000</span> C3                                                  <span class="keyword">retn</span></span><br><span class="line">KiKernelSysretExit+5F                                           KiKernelSysretExit endp</span><br></pre></td></tr></table></figure><h2 id="KiSystemCall32"><a href="#KiSystemCall32" class="headerlink" title="KiSystemCall32"></a>KiSystemCall32</h2><h2 id="int-2e"><a href="#int-2e" class="headerlink" title="int 2e"></a>int 2e</h2>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;系统调用备份，后面填坑，现在做备份&quot;&gt;&lt;a href=&quot;#系统调用备份，后面填坑，现在做备份&quot; class=&quot;headerlink&quot; title=&quot;系统调用备份，后面填坑，现在做备份&quot;&gt;&lt;/a&gt;系统调用备份，后面填坑，现在做备份&lt;/h3&gt;&lt;h2 id=&quot;Win10-1903-x64&quot;&gt;&lt;a href=&quot;#Win10-1903-x64&quot; class=&quot;headerlink&quot; title=&quot;Win10 1903 x64&quot;&gt;&lt;/a&gt;Win10 1903 x64&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.matteomalvica.com/minutes/windows_kernel/#nt-kisystemcall64shadow-under-the-miscroscope&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.matteomalvica.com/minutes/windows_kernel/#nt-kisystemcall64shadow-under-the-miscroscope&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mirokaku.github.io/Blog/2017/2-System-Call/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mirokaku.github.io/Blog/2017/2-System-Call/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;KiSystemCall64&quot;&gt;&lt;a href=&quot;#KiSystemCall64&quot; class=&quot;headerlink&quot; title=&quot;KiSystemCall64&quot;&gt;&lt;/a&gt;KiSystemCall64&lt;/h3&gt;&lt;p&gt;调用 &lt;code&gt;KiSystemServiceUser&lt;/code&gt;,通过访问SSDT表，获取函数地址。&lt;/p&gt;
    
    </summary>
    
      <category term="windows内核" scheme="http://blog.imjalen.top/categories/windows%E5%86%85%E6%A0%B8/"/>
    
    
      <category term="驱动" scheme="http://blog.imjalen.top/tags/%E9%A9%B1%E5%8A%A8/"/>
    
  </entry>
  
  <entry>
    <title>Windows内核函数基础</title>
    <link href="http://blog.imjalen.top/2021/09/03/2021-09-03-%E9%A9%B1%E5%8A%A8%E5%9F%BA%E7%A1%80/"/>
    <id>http://blog.imjalen.top/2021/09/03/2021-09-03-驱动基础/</id>
    <published>2021-09-02T16:00:00.000Z</published>
    <updated>2021-10-11T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="代码地址"><a href="#代码地址" class="headerlink" title="代码地址"></a>代码地址</h2><p>配合<em>git</em> –no-pager 和 git checkout进行代码查看 </p><p><a href="https://github.com/aW3ikun/Windows-Kernel-Driver-programming-practice" target="_blank" rel="noopener">https://github.com/aW3ikun/Windows-Kernel-Driver-programming-practice</a></p><h3 id="常用初始化"><a href="#常用初始化" class="headerlink" title="常用初始化"></a>常用初始化</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">OBJECT_ATTRIBUTES obja = &#123; <span class="number">0</span> &#125;;</span><br><span class="line">InitializeObjectAttributes(&amp;obja, &amp;str, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, <span class="literal">NULL</span>, <span class="literal">NULL</span>);</span><br></pre></td></tr></table></figure><h2 id="入门"><a href="#入门" class="headerlink" title="入门"></a>入门</h2><p>driver的PUNICODE_STRING指向注册表地址，注册表存储着服务的相关信息。</p><p><img src="/assets/blog/2021-09-03-驱动基础/image-20210817163550400.png" alt="image-20210817163550400"></p><p>如果pDriverObject-&gt;Unload没有对应的卸载函数，则不进行卸载，是一种保护措施。</p><a id="more"></a><p>需要在Unload函数中进行数据清理。</p><p>IRP————&gt;IO请求包 ，发送给设备。</p><p>硬件设备–&gt; hal.dll (设备虚拟层)</p><p>应用层————&gt;DEVICE_OBJECT(FDO)（可不发送）-&gt;物理设备(PDO)</p><p><img src="https://docs.microsoft.com/zh-cn/windows-hardware/drivers/kernel/images/3devobj.png" alt="阐释设备对象的关系图。"></p><p>DEVICE_OBJECT可以不关联物理设备，可以实现r3进程间的通信。</p><p>名字结构<img src="/assets/blog/2021-09-03-驱动基础/image-20210819011519026.png" alt="image-20210819011519026"></p><p>应用层无法直接打开物理设备，也无法直接打开虚拟设备，通过符号链接形式打开设备。</p><p>例如使用磁盘时：”WriteFile(C:\123.txt)”,<code>\\??\\C:</code>就是一个符号链接,最终是<code>\\Device\\Harddiskvolume3</code></p><p><img src="/image-20210819013014149.png" alt="image-20210819013014149"></p><p>即使有了符号链接，但是消息分发没有注册，也无法处理相关信息。</p><h2 id="驱动层与应用层的通信"><a href="#驱动层与应用层的通信" class="headerlink" title="驱动层与应用层的通信"></a>驱动层与应用层的通信</h2><p>一个驱动对象对应数个设备对象，应用层通过符号链接访问设备对象，然后驱动内部处理请求。</p><ul><li>ReadFile WriteFile 通过缓冲区通信</li><li>DeviceIoControl 加 IRP_MJ_DEVICE_CONTROL</li></ul><h3 id="IRP派遣函数"><a href="#IRP派遣函数" class="headerlink" title="IRP派遣函数"></a>IRP派遣函数</h3><h3 id="注册"><a href="#注册" class="headerlink" title="注册"></a>注册</h3><p><code>pDriverObject-&gt;MajorFunction[IRP_MJ_CREATE] = MyCreate;</code></p><h3 id="派遣函数"><a href="#派遣函数" class="headerlink" title="派遣函数"></a>派遣函数</h3><h4 id="派遣函数定义"><a href="#派遣函数定义" class="headerlink" title="派遣函数定义"></a>派遣函数定义</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">DRIVER_DISPATCH (</span><br><span class="line">    _In_ struct _DEVICE_OBJECT *DeviceObject,</span><br><span class="line">    _Inout_ struct _IRP *Irp</span><br><span class="line">    );</span><br></pre></td></tr></table></figure><h4 id="派遣函数返回值"><a href="#派遣函数返回值" class="headerlink" title="派遣函数返回值"></a>派遣函数返回值</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">pIRP-&gt;IoStatus.Status = status; <span class="comment">//返回任务执行结果</span></span><br><span class="line"></span><br><span class="line">pIRP-&gt;IoStatus.Information = <span class="number">0</span>; <span class="comment">//输出Buffer的大小</span></span><br><span class="line"></span><br><span class="line">IoCompleteRequest(pIRP, IO_NO_INCREMENT); <span class="comment">//完成派遣函数</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> STATUS_SUCCESS; <span class="comment">//返回执行成功</span></span><br></pre></td></tr></table></figure><h4 id="事例"><a href="#事例" class="headerlink" title="事例"></a>事例</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">NTSTATUS <span class="title">MyCreate</span><span class="params">(PDEVICE_OBJECT pDevice, PIRP pIRP)</span> </span>&#123;</span><br><span class="line">NTSTATUS status = STATUS_SUCCESS;</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"My Device has be opened\n"</span>);</span><br><span class="line"></span><br><span class="line">pIRP-&gt;IoStatus.Status = status;</span><br><span class="line"></span><br><span class="line">pIRP-&gt;IoStatus.Information = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">IoCompleteRequest(pIRP, IO_NO_INCREMENT);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> STATUS_SUCCESS;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="设备IO"><a href="#设备IO" class="headerlink" title="设备IO"></a>设备IO</h3><h3 id="创建设备对象"><a href="#创建设备对象" class="headerlink" title="创建设备对象"></a>创建设备对象</h3><p><code>IoCreateDevice.</code></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//DriverEntry(PDRIVER_OBJECT pDriverObject,)</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> DEVICE_NAME <span class="meta-string">L"\\Device\\MyFirstDevice"</span></span></span><br><span class="line"></span><br><span class="line">UNICODE_STRING DeviceName = &#123; <span class="number">0</span> &#125;;</span><br><span class="line">PDEVICE_OBJECT pDevice = <span class="literal">NULL</span>;</span><br><span class="line">RtlInitUnicodeString(&amp;DeviceName, DEVICE_NAME);</span><br><span class="line"></span><br><span class="line">status = IoCreateDevice(pDriverObject, <span class="number">200</span><span class="comment">/*DeviceExtensionSize 设备扩展大小*/</span>, &amp;DeviceName, FILE_DEVICE_UNKNOWN, <span class="number">0</span>, TRUE, &amp;pDevice);</span><br></pre></td></tr></table></figure><h3 id="设置驱动读写方式"><a href="#设置驱动读写方式" class="headerlink" title="设置驱动读写方式"></a>设置驱动读写方式</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pDevice-&gt;Flags |= DO_BUFFERED_IO; <span class="comment">// 0xc8 | 0x200 = 0x2c</span></span><br></pre></td></tr></table></figure><h3 id="创建符号链接"><a href="#创建符号链接" class="headerlink" title="创建符号链接"></a>创建符号链接</h3><p><code>IoCreateSymbolicLink</code></p><p>只有创建符号链接，才能让应用层访问到，实现交互</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> SYM_NAME <span class="meta-string">L"\\??\\MyFirstDevice"</span></span></span><br><span class="line"></span><br><span class="line">UNICODE_STRING symname = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">RtlInitUnicodeString(&amp;symname, SYM_NAME);</span><br><span class="line"></span><br><span class="line"><span class="comment">//IoDeleteSymbolicLink(&amp;symname);</span></span><br><span class="line">status = IoCreateSymbolicLink(&amp;symname, &amp;DeviceName);</span><br></pre></td></tr></table></figure><h3 id="注册设备控制IRP"><a href="#注册设备控制IRP" class="headerlink" title="注册设备控制IRP"></a>注册设备控制IRP</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pDriverObject-&gt;MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyControl;</span><br></pre></td></tr></table></figure><h3 id="设置控制IRP常规写法"><a href="#设置控制IRP常规写法" class="headerlink" title="设置控制IRP常规写法"></a>设置控制IRP常规写法</h3><p>获取输入输出缓冲区的长度，避免溢出。获取控制码，方便进行函数分发。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> IOCTL_MUL (ULONG)CTL_CODE(FILE_DEVICE_UNKNOWN,0x9888,METHOD_BUFFERED,FILE_ANY_ACCESS)</span></span><br><span class="line"><span class="function">NTSTATUS <span class="title">MyControl</span><span class="params">(PDEVICE_OBJECT pDevice, PIRP pIRP)</span> </span>&#123;</span><br><span class="line">NTSTATUS status = STATUS_SUCCESS;</span><br><span class="line"><span class="comment">//请求的消息通过IRP保存。</span></span><br><span class="line"><span class="comment">//获得缓冲区</span></span><br><span class="line">PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIRP);</span><br><span class="line"><span class="comment">//获取功能号</span></span><br><span class="line">ULONG uIocode = pStack-&gt;Parameters.DeviceIoControl.IoControlCode;</span><br><span class="line"><span class="comment">//获得输入缓冲区长度</span></span><br><span class="line">ULONG ulInlen = pStack-&gt;Parameters.DeviceIoControl.InputBufferLength;</span><br><span class="line"><span class="comment">//获得输出缓冲区长度</span></span><br><span class="line">ULONG ulOutlen = pStack-&gt;Parameters.DeviceIoControl.OutputBufferLength;</span><br><span class="line"></span><br><span class="line">ULONG ulIoinfo = <span class="number">0</span>;</span><br><span class="line"><span class="comment">//进行控制码的分发</span></span><br><span class="line"><span class="keyword">switch</span> (uIocode)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">case</span> IOCTL_COPY: &#123;</span><br><span class="line">FILEPATH filepath = *(FILEPATH*)pIRP-&gt;AssociatedIrp.SystemBuffer;</span><br><span class="line">        </span><br><span class="line">             <span class="comment">//do something......</span></span><br><span class="line"></span><br><span class="line">ulIoinfo = ulOutlen;</span><br><span class="line"></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">default</span>:</span><br><span class="line">status = STATUS_UNSUCCESSFUL;</span><br><span class="line"></span><br><span class="line">ulIoinfo = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">pIRP-&gt;IoStatus.Status = status;</span><br><span class="line"></span><br><span class="line">       <span class="comment">//通过指针返回给r3的长度，长度不对容易溢出。</span></span><br><span class="line">pIRP-&gt;IoStatus.Information = ulIoinfo;</span><br><span class="line"></span><br><span class="line">IoCompleteRequest(pIRP, IO_NO_INCREMENT);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> STATUS_SUCCESS;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="字符串操作"><a href="#字符串操作" class="headerlink" title="字符串操作"></a>字符串操作</h2><h3 id="字符串初始化"><a href="#字符串初始化" class="headerlink" title="字符串初始化"></a>字符串初始化</h3><ul><li><p>RTL_CONSTANT_STRING(),初始化不可修改的字符</p></li><li><p>RtlInitUnicodeString()，不申请内存，只是buffer指针指向字符串。</p></li><li><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">PWCHAR testbuffer = ExAllocatePool(NonPagedPool, <span class="number">0x1000</span>);</span><br><span class="line"></span><br><span class="line">RtlZeroMemory(testbuffer, <span class="number">0x1000</span>);</span><br><span class="line"></span><br><span class="line">RtlCopyMemory(testbuffer,<span class="string">L"buffFFFFF"</span>,<span class="keyword">sizeof</span>(<span class="string">L"buffFFFFF"</span>));</span><br><span class="line"></span><br><span class="line">RtlInitUnicodeString(&amp;DeviceName, testbuffer);</span><br></pre></td></tr></table></figure></li></ul><h3 id="窄字符转成成宽字符"><a href="#窄字符转成成宽字符" class="headerlink" title="窄字符转成成宽字符"></a>窄字符转成成宽字符</h3><ul><li><p>窄字符转成成宽字符,RtlAnsiStringToUnicodeString();</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">PCHARtempbuffer = <span class="string">"C:\\123\\312\\123\\123.txt"</span>;</span><br><span class="line">STRINGstr = &#123; <span class="number">0</span> &#125;;</span><br><span class="line">RtlInitString(&amp;str, tempbuffer);</span><br><span class="line"><span class="comment">//转换成宽字符</span></span><br><span class="line">RtlAnsiStringToUnicodeString(&amp;DeviceName, &amp;str, TRUE);</span><br><span class="line">RtlFreeUnicodeString(&amp;DeviceName);<span class="comment">//一定要释放</span></span><br></pre></td></tr></table></figure></li></ul><h3 id="字符串的拷贝"><a href="#字符串的拷贝" class="headerlink" title="字符串的拷贝"></a>字符串的拷贝</h3><ul><li><p>字符串的拷贝，定义缓冲区，长度。缓冲区清零。拷贝内存。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">uTargetUnicode.Buffer = ExAllocatePool(NonPagedPool, <span class="number">0x1000</span>);</span><br><span class="line">uTargetUnicode.MaximumLength = <span class="number">0x1000</span>;</span><br><span class="line"></span><br><span class="line">RtlZeroMemory(uTargetUnicode.Buffer,<span class="number">0x1000</span>);</span><br><span class="line"></span><br><span class="line">RtlCopyUnicodeString(&amp;uTargetUnicode, &amp;DeviceName);</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"--%wZ--\n"</span>, &amp;uTargetUnicode);</span><br><span class="line"></span><br><span class="line"><span class="comment">//释放之前申请的缓冲区</span></span><br><span class="line">RtlFreeUnicodeString(&amp;DeviceName);</span><br><span class="line">RtlFreeUnicodeString(&amp;uTargetUnicode);</span><br></pre></td></tr></table></figure><p> RtlInitEmptyUnicodeString初始化temp1的缓冲区指向dst_buf。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">WCHAR dst_buf[<span class="number">256</span>];</span><br><span class="line">UNICODE_STRING temp1 = &#123; <span class="number">0</span> &#125;;</span><br><span class="line">RtlInitEmptyUnicodeString(&amp;temp1, dst_buf, <span class="keyword">sizeof</span>(dst_buf));</span><br><span class="line">RtlCopyUnicodeString(&amp;strTest3, &amp;strTest);</span><br></pre></td></tr></table></figure></li></ul><h3 id="字符转成大写"><a href="#字符转成大写" class="headerlink" title="字符转成大写"></a>字符转成大写</h3><ul><li>转换为大写，RtlUpcaseUnicodeString(),可以自己转自己，也可以转乘其他字符串的缓冲区中。第三个标志位决定。</li></ul><h3 id="安全拷贝字符"><a href="#安全拷贝字符" class="headerlink" title="安全拷贝字符"></a>安全拷贝字符</h3><ul><li><p>安全拷贝字符函数,RtlStringCbCopyW。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;ntstrsafe.h&gt;</span></span></span><br><span class="line"></span><br><span class="line">PWCHAR tempbuffer2 = ExAllocatePool(NonPagedPool, <span class="number">0x1000</span>);</span><br><span class="line"></span><br><span class="line">RtlZeroMemory(tempbuffer2, <span class="number">0x1000</span>);</span><br><span class="line"></span><br><span class="line">RtlStringCbCopyW(&amp;tempbuffer2, <span class="number">0x1000</span>, <span class="string">L"\\??\\"</span>);</span><br></pre></td></tr></table></figure></li></ul><h3 id="字符追加"><a href="#字符追加" class="headerlink" title="字符追加"></a>字符追加</h3><ul><li>字符追加 RtlStringCbCatW(),<code>RtlStringCbCatW(tempbuffer2, 0x1000, L&quot;C:\\ABc\\ccc\\bbb\\eee.txt&quot;);</code></li></ul><h3 id="字符前缀判断"><a href="#字符前缀判断" class="headerlink" title="字符前缀判断"></a>字符前缀判断</h3><ul><li>字符前缀判断 RtlPrefixUnicodeString(1，2，大小写敏感标志位),判断2有没有1的前缀。TRUE大小写不敏感。</li></ul><h3 id="字符串比较"><a href="#字符串比较" class="headerlink" title="字符串比较"></a>字符串比较</h3><ul><li>字符串比较， RtlEqualString(1，2，大小写敏感标志位)</li></ul><h3 id="字符搜索"><a href="#字符搜索" class="headerlink" title="字符搜索"></a>字符搜索</h3><ul><li><p>搜寻字符,通配符配大写字符串。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//字符查找</span></span><br><span class="line">RtlInitUnicodeString(&amp;temp4, <span class="string">L"C:\\ABc\\CCC\\bbb\\eee.txt"</span>);</span><br><span class="line">UNICODE_STRING temp5 = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"><span class="comment">//一定要大写</span></span><br><span class="line">RtlInitUnicodeString(&amp;temp5, <span class="string">L"*EEE*"</span>);<span class="comment">//*EEE.TXT</span></span><br><span class="line">  </span><br><span class="line"><span class="keyword">if</span> (FsRtlIsNameInExpression(&amp;temp5, &amp;temp4, TRUE, <span class="literal">NULL</span>)) &#123;</span><br><span class="line">DbgPrint(<span class="string">"Searched\n"</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><h2 id="文件操作"><a href="#文件操作" class="headerlink" title="文件操作"></a>文件操作</h2><p>ZW函数–&gt;检查参数，检查发起操作的模式-&gt;NT函数</p><h3 id="删除文件"><a href="#删除文件" class="headerlink" title="删除文件"></a>删除文件</h3><ul><li><p>ZwDeleteFile 删除文件.初始化OBJECT_ATTRIBUTES结构体。但不能删除被占用的文件。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">OBJECT_ATTRIBUTES obja = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">RtlInitUnicodeString(&amp;uFilePath, file_path);</span><br><span class="line"></span><br><span class="line">InitializeObjectAttributes(&amp;obja, &amp;uFilePath, OBJ_CASE_INSENSITIVE, <span class="literal">NULL</span>, <span class="literal">NULL</span>);</span><br><span class="line"></span><br><span class="line">status = ZwDeleteFile(&amp;obja);</span><br></pre></td></tr></table></figure></li></ul><h3 id="文件拷贝"><a href="#文件拷贝" class="headerlink" title="文件拷贝"></a>文件拷贝</h3><ul><li><p>文件读取写入实现拷贝,ZwCreateFile,ZwReadFile,ZwWriteFile.</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">TSTATUS <span class="title">KernelSmallCopyFile</span><span class="params">(PWCHAR pwDestPath, PWCHAR pwSourcePath)</span> </span>&#123;</span><br><span class="line">UINT64 count = <span class="number">0</span>;</span><br><span class="line">NTSTATUS status = STATUS_SUCCESS;</span><br><span class="line">UNICODE_STRING target = &#123; <span class="number">0</span> &#125;;</span><br><span class="line">UNICODE_STRING source = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">//初始化文件字符串</span></span><br><span class="line">RtlInitUnicodeString(&amp;target, pwDestPath);</span><br><span class="line">RtlInitUnicodeString(&amp;source, pwSourcePath);</span><br><span class="line"></span><br><span class="line">HANDLE htarget = <span class="literal">NULL</span>;</span><br><span class="line">HANDLE hsource = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">PVOID buffer = <span class="literal">NULL</span>;</span><br><span class="line">LARGE_INTEGER offset = &#123; <span class="number">0</span> &#125;;</span><br><span class="line">IO_STATUS_BLOCK io_stack = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">&#123;</span><br><span class="line">buffer = ExAllocatePool(NonPagedPool, <span class="number">1024</span> * <span class="number">4</span>);</span><br><span class="line"><span class="keyword">if</span> (!buffer) &#123;</span><br><span class="line">DbgPrint(<span class="string">"AllocateBuffer Failed\n"</span>);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">OBJECT_ATTRIBUTES obja_target = &#123; <span class="number">0</span> &#125;;</span><br><span class="line">OBJECT_ATTRIBUTES obja_source = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">InitializeObjectAttributes(&amp;obja_target, &amp;target, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, <span class="literal">NULL</span>, <span class="literal">NULL</span>);</span><br><span class="line">InitializeObjectAttributes(&amp;obja_source, &amp;source, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, <span class="literal">NULL</span>, <span class="literal">NULL</span>);</span><br><span class="line"></span><br><span class="line">status = ZwCreateFile(</span><br><span class="line">&amp;htarget,</span><br><span class="line">GENERIC_ALL,</span><br><span class="line">&amp;obja_target,</span><br><span class="line">&amp;io_stack,</span><br><span class="line"><span class="literal">NULL</span>,</span><br><span class="line">FILE_ATTRIBUTE_NORMAL,</span><br><span class="line">FILE_SHARE_READ,</span><br><span class="line">FILE_SUPERSEDE,<span class="comment">//文件不存在 则创建</span></span><br><span class="line">FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,</span><br><span class="line"><span class="literal">NULL</span>,</span><br><span class="line"><span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!NT_SUCCESS(status)) &#123;</span><br><span class="line">DbgPrint(<span class="string">"CreateFile target Failed: %x\n"</span>, status);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">status = ZwCreateFile(</span><br><span class="line">&amp;hsource,</span><br><span class="line">GENERIC_ALL,</span><br><span class="line">&amp;obja_source,</span><br><span class="line">&amp;io_stack,</span><br><span class="line"><span class="literal">NULL</span>,</span><br><span class="line">FILE_ATTRIBUTE_NORMAL,</span><br><span class="line">FILE_SHARE_READ,</span><br><span class="line">FILE_OPEN_IF,<span class="comment">//文件存在才打开</span></span><br><span class="line">FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,</span><br><span class="line"><span class="literal">NULL</span>,</span><br><span class="line"><span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!NT_SUCCESS(status)) &#123;</span><br><span class="line">DbgPrint(<span class="string">"CreateFile Source Failed: %x\n"</span>, status);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> (<span class="number">1</span>) &#123;</span><br><span class="line">UINT64 length = <span class="number">4</span> * <span class="number">1024</span>;</span><br><span class="line">status = ZwReadFile(</span><br><span class="line">hsource, <span class="literal">NULL</span>, <span class="literal">NULL</span>, <span class="literal">NULL</span>,</span><br><span class="line">&amp;io_stack, buffer, length, &amp;offset, <span class="literal">NULL</span></span><br><span class="line">);</span><br><span class="line"><span class="keyword">if</span> (!NT_SUCCESS(status)) &#123;</span><br><span class="line"><span class="keyword">if</span> (status == STATUS_END_OF_FILE)</span><br><span class="line">status = STATUS_SUCCESS;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">DbgPrint(<span class="string">"ReadFile Failed: %x\n"</span>, status);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//获得实际读取的长度</span></span><br><span class="line">length = io_stack.Information;</span><br><span class="line"></span><br><span class="line">status = ZwWriteFile(</span><br><span class="line">htarget, <span class="literal">NULL</span>, <span class="literal">NULL</span>, <span class="literal">NULL</span>,</span><br><span class="line">&amp;io_stack, buffer, length, &amp;offset, <span class="literal">NULL</span></span><br><span class="line">);</span><br><span class="line"><span class="keyword">if</span> (!NT_SUCCESS(status)) &#123;</span><br><span class="line"><span class="keyword">if</span> (status == STATUS_END_OF_FILE)</span><br><span class="line">status = STATUS_SUCCESS;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">DbgPrint(<span class="string">"WriteFile Failed: %x\n"</span>, status);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">offset.QuadPart += length;</span><br><span class="line">count += <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125; <span class="keyword">while</span> (<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (htarget != <span class="literal">NULL</span>)</span><br><span class="line">ZwClose(htarget);</span><br><span class="line"><span class="keyword">if</span> (hsource != <span class="literal">NULL</span>)</span><br><span class="line">ZwClose(hsource);</span><br><span class="line"><span class="keyword">if</span> (buffer != <span class="literal">NULL</span>)</span><br><span class="line">ExFreePool(buffer);</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"Copy File %d 4kPage\n"</span>, count);</span><br><span class="line"><span class="keyword">return</span> status;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><h3 id="文件属性查询"><a href="#文件属性查询" class="headerlink" title="文件属性查询"></a>文件属性查询</h3><p>ZwQueryInformationFile</p><h2 id="注册表操作"><a href="#注册表操作" class="headerlink" title="注册表操作"></a>注册表操作</h2><p>start决定了驱动的启动方式，3为DemandStart，2为AutoStart,1为SystemStart，0为BootStart。4是禁用。启动方式存在限制。</p><p><img src="/assets/blog/2021-09-03-驱动基础/image-20210824160504496.png" alt="image-20210824160504496"></p><p><img src="/assets/blog/2021-09-03-驱动基础/image-20210824161411502.png" alt="image-20210824161411502"></p><h3 id="Zw函数"><a href="#Zw函数" class="headerlink" title="Zw函数"></a>Zw函数</h3><h3 id="打开注册表"><a href="#打开注册表" class="headerlink" title="打开注册表"></a>打开注册表</h3><ul><li>ZwCreateKey,ZwOpenKey。</li></ul><h3 id="查询注册表"><a href="#查询注册表" class="headerlink" title="查询注册表"></a>查询注册表</h3><ul><li>ZwQueryValueKey</li></ul><h3 id="修改注册表值"><a href="#修改注册表值" class="headerlink" title="修改注册表值"></a>修改注册表值</h3><ul><li>ZwSetValueKey</li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br></pre></td><td class="code"><pre><span class="line">HANDLE hKey = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">ULONG ulRetSize = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">OBJECT_ATTRIBUTES objaReg = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">PKEY_VALUE_PARTIAL_INFORMATION keyinfo = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">InitializeObjectAttributes(&amp;objaReg,pRegistryPath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, <span class="literal">NULL</span>, <span class="literal">NULL</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//Open Key</span></span><br><span class="line"><span class="comment">//ZwCreateKey可以创建也可以打开</span></span><br><span class="line"><span class="comment">/*status = ZwCreateKey(&amp;hKey, KEY_ALL_ACCESS, &amp;objaReg, NULL, NULL, REG_OPTION_NON_VOLATILE, &amp;ulDispostion);</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">if (NT_SUCCESS(status)) &#123;</span></span><br><span class="line"><span class="comment">if (ulDispostion == REG_CREATED_NEW_KEY) &#123;</span></span><br><span class="line"><span class="comment">DbgPrint("Key has be Created\n");</span></span><br><span class="line"><span class="comment">&#125;</span></span><br><span class="line"><span class="comment">else if (ulDispostion == REG_OPENED_EXISTING_KEY)</span></span><br><span class="line"><span class="comment">&#123;</span></span><br><span class="line"><span class="comment">DbgPrint("Key has be Opened\n");</span></span><br><span class="line"><span class="comment">&#125;</span></span><br><span class="line"><span class="comment">else &#123;</span></span><br><span class="line"><span class="comment">DbgPrint("Error\n");</span></span><br><span class="line"><span class="comment">&#125;</span></span><br><span class="line"><span class="comment">&#125;</span></span><br><span class="line"><span class="comment">else &#123;</span></span><br><span class="line"><span class="comment">DbgPrint("Create Key Failed: %x\n", status);</span></span><br><span class="line"><span class="comment">&#125;</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//确定该注册表存在的时候使用</span></span><br><span class="line"></span><br><span class="line">status = ZwOpenKey(&amp;hKey, KEY_ALL_ACCESS, &amp;objaReg);</span><br><span class="line"></span><br><span class="line"><span class="keyword">do</span> &#123;</span><br><span class="line">    UNICODE_STRING name = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">    RtlInitUnicodeString(&amp;name, <span class="string">L"ImagePath"</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (!NT_SUCCESS(status))</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line">    status = ZwQueryValueKey(hKey, &amp;name, KeyValuePartialInformation, <span class="literal">NULL</span>, <span class="number">0</span>, &amp;ulRetSize);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (status == STATUS_BUFFER_TOO_SMALL &amp;&amp; ulRetSize != <span class="number">0</span>) &#123;</span><br><span class="line"></span><br><span class="line">        keyinfo = ExAllocatePool(NonPagedPool, ulRetSize);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (!keyinfo) &#123;</span><br><span class="line"></span><br><span class="line">            DbgPrint(<span class="string">"ExAllocatePool Secondly Failed\n"</span>);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        RtlZeroMemory(keyinfo, ulRetSize);</span><br><span class="line">    &#125;</span><br><span class="line">    status = ZwQueryValueKey(hKey, &amp;name, KeyValuePartialInformation, keyinfo, ulRetSize, &amp;ulRetSize);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (!NT_SUCCESS(status))</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line">    PWCHAR imagepath = (PWCHAR)(keyinfo-&gt;Data);</span><br><span class="line"></span><br><span class="line">    DbgPrint(<span class="string">"---ImagePath---%ws\n"</span>, imagepath);</span><br><span class="line"></span><br><span class="line">    <span class="comment">//C:\\Windows\System32\drivers \SystemRoot\System32\drivers\acpipmi.sys 更早的启动</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">//课后作业 判断前缀是否是\\SystemRoot\\ 则已经拷贝</span></span><br><span class="line"></span><br><span class="line">    UNICODE_STRING prefix = &#123; <span class="number">0</span> &#125;;</span><br><span class="line">    UNICODE_STRING uImagePath = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">    RtlInitUnicodeString(&amp;prefix, <span class="string">L"\\SystemRoot\\"</span>);</span><br><span class="line">    RtlInitUnicodeString(&amp;uImagePath, imagepath);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (RtlPrefixUnicodeString(&amp;prefix, &amp;uImagePath, TRUE)) &#123;</span><br><span class="line"></span><br><span class="line">        DbgPrint(<span class="string">"Already Copied File\n"</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    status = KernelSmallCopyFile(<span class="string">L"\\??\\C:\\Windows\\System32\\drivers\\NewDriver.sys"</span>, imagepath);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (!NT_SUCCESS(status)) &#123;</span><br><span class="line">        DbgPrint(<span class="string">"Copy File Failed :%x\n"</span>, status);</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//change path</span></span><br><span class="line">    PWCHAR  rootpath = <span class="string">L"\\SystemRoot\\system32\\drivers\\NewDriver.sys"</span>;</span><br><span class="line"></span><br><span class="line">    status = ZwSetValueKey(hKey, &amp;name, <span class="number">0</span>, REG_EXPAND_SZ<span class="comment">/*使用环境变量的UNICODE字符串*/</span>,rootpath, wcslen(rootpath) * <span class="number">2</span> + <span class="number">2</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (!NT_SUCCESS(status)) &#123;</span><br><span class="line">        DbgPrint(<span class="string">"SetValueKey Failed :%x\n"</span>, status);</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;<span class="keyword">while</span> (<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (keyinfo != <span class="literal">NULL</span>)</span><br><span class="line">    ExFreePool(keyinfo);</span><br><span class="line"><span class="keyword">if</span> (hKey != <span class="literal">NULL</span>) &#123;</span><br><span class="line">    ZwClose(hKey);</span><br><span class="line">    hKey = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//先删除子项 才能删除父项</span></span><br><span class="line"><span class="comment">//ZwDeleteKey(hKey);</span></span><br></pre></td></tr></table></figure><h3 id="运行时函数"><a href="#运行时函数" class="headerlink" title="运行时函数"></a>运行时函数</h3><ul><li>RtlWriteRegistryValue，写入注册表值</li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ULONG tempstart = <span class="number">1</span>;</span><br><span class="line"><span class="comment">//封装好的函数</span></span><br><span class="line">RtlWriteRegistryValue(RTL_REGISTRY_ABSOLUTE, pRegistryPath-&gt;Buffer, <span class="string">L"Start"</span>, REG_DWORD, &amp;tempstart, <span class="number">4</span>);</span><br></pre></td></tr></table></figure><ul><li><p>注册表快速检查 RtlCheckRegistryKey</p><p>  //检测注册表是否存在<br>  //status = RtlCheckRegistryKey(RTL_REGISTRY_SERVICES, L”123456”);</p></li><li>注册表创建 RtlCreateRegistryKey</li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">RtlCreateRegistryKey(RTL_REGISTRY_SERVICES, <span class="string">L"123456"</span>);</span><br></pre></td></tr></table></figure><h3 id="R3注册表操作"><a href="#R3注册表操作" class="headerlink" title="R3注册表操作"></a>R3注册表操作</h3><p>RegCreateKeyEx,RegSetValueEx,RegGetValue。句柄关闭RegCloseKey();</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">HKEY hkey = <span class="literal">NULL</span>;</span><br><span class="line">DWORD dwdisp = <span class="number">0</span>;</span><br><span class="line">DWORD dwRet = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> WCHAR* value = <span class="string">L"Number"</span>;</span><br><span class="line"><span class="keyword">const</span> WCHAR* reg = <span class="string">L"SYSTEM\\ControlSet001\\Services\\AddNumber"</span>;</span><br><span class="line">DWORD dwData = <span class="number">1</span>;</span><br><span class="line">DWORD cbData =  <span class="number">4</span> ;</span><br><span class="line">DWORD dwType = <span class="number">0</span>;</span><br><span class="line">dwRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, reg, <span class="number">0</span>,</span><br><span class="line">                       <span class="literal">NULL</span>, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, <span class="literal">NULL</span>, &amp;hkey, &amp;dwdisp);</span><br><span class="line"></span><br><span class="line">dwRet = RegSetValueEx(hkey, value, <span class="number">0</span>, REG_DWORD, (PBYTE)&amp;dwData, cbData);</span><br><span class="line"></span><br><span class="line">RegGetValue(HKEY_LOCAL_MACHINE, reg, value, REG_DWORD, &amp;dwType, (PBYTE)&amp;dwData, &amp;cbData);</span><br><span class="line">RegCloseKey(hkey);</span><br></pre></td></tr></table></figure><h2 id="中断级"><a href="#中断级" class="headerlink" title="中断级"></a>中断级</h2><p>IRQL 软中断</p><p>0    PASSIVE_LEVEL (pass_level)</p><p>1    APC_LEVEL</p><p>2    DISPATCH_LEVEL (dpc_level)  非硬件中断最高级别，只能访问非分页内存。（当页面在物理内存不会出现问题。内存页面没在物理内存中时，触动缺页异常引发中断进行换页操作，但无法中断DPC，触发访问无效地址蓝屏）</p><p>Driver_Entry中断级别为0。</p><p><code>ISR：Interrupt Service Routines</code>中断服务例程。使用dpc延迟过程调用，当某个硬件设备引发高级别中断的时候，将不那么紧急的任务放到dpc里跑。（降低了中断级别，又可以让以其他硬件设备引发中断，通知CPU。</p><p>DPC是一个队列，当CPU处理完高于DPC中断级的任务后，就来找这个队列，拿出例程按顺序执行。</p><p>也可能使用不插队的形式，短暂的把当前任务请求级提高的DPC。 </p><p>提高irql后，要降回原来的irql。</p><h3 id="提高IRQL的好处"><a href="#提高IRQL的好处" class="headerlink" title="提高IRQL的好处"></a>提高IRQL的好处</h3><p>进行HOOK的时候，</p><ol><li>不希望该函数执行</li><li>不希望HOOK过程被打断</li></ol><p>先把IRQL提升到DPC，然后关中断。中断级别高，外部中断无法介入，顺利完成HOOK，避免出错。</p><h3 id="手动提高中断级别到DPC"><a href="#手动提高中断级别到DPC" class="headerlink" title="手动提高中断级别到DPC"></a>手动提高中断级别到DPC</h3><p>KeRaiseIrqlToDpcLevel提升，KeLowerIrql()恢复。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">KIRQL oldirql = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">oldirql = KeRaiseIrqlToDpcLevel();</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"---Current Irql = %d---\n"</span>, KeGetCurrentIrql());</span><br><span class="line"></span><br><span class="line">KeLowerIrql(oldirql);</span><br></pre></td></tr></table></figure><h2 id="自旋锁"><a href="#自旋锁" class="headerlink" title="自旋锁"></a>自旋锁</h2><p>自选锁的本质是一种忙等待，一直在询问获取。</p><p>保护多线程安全性</p><ul><li>操作重入危险数据 全局变量</li><li>可重入代码</li></ul><p><img src="/assets/blog/2021-09-03-驱动基础/image-20210825155847137.png" alt="image-20210825155847137"></p><p>自旋锁是将该处中断级别提高到dpc_level,保证这段代码不会被抢占。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//wdm.h</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> KeAcquireSpinLock(SpinLock, OldIrql) \</span></span><br><span class="line">    *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)</span><br></pre></td></tr></table></figure><p>pdb中的ldr</p><h3 id="自旋锁初始化"><a href="#自旋锁初始化" class="headerlink" title="自旋锁初始化"></a>自旋锁初始化</h3><p>静态变量 ，全局变量 <code>KSPIN_LOCK spinlock = { 0 };</code></p><p><code>KeInitializeSpinLock(&amp;spinlock);</code>,一般在DriverEntry中</p><h3 id="加锁，解锁"><a href="#加锁，解锁" class="headerlink" title="加锁，解锁"></a>加锁，解锁</h3><p>KeAcquireSpinLock()，KeReleaseSpinLock()</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">KIRQL oldirql = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//加锁</span></span><br><span class="line">KeAcquireSpinLock(&amp;spinlock, &amp;oldirql);</span><br><span class="line"></span><br><span class="line"><span class="comment">//...to do something</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//解锁</span></span><br><span class="line">KeReleaseSpinLock(&amp;spinlock,oldirql);</span><br></pre></td></tr></table></figure><h3 id="优雅的锁"><a href="#优雅的锁" class="headerlink" title="优雅的锁"></a>优雅的锁</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//ndis.h</span></span><br><span class="line">BOOL bLock = FALSE;</span><br><span class="line"><span class="comment">//避免高中断级跑过多代码</span></span><br><span class="line"><span class="keyword">if</span> (!bLock) &#123; </span><br><span class="line">    <span class="comment">//加锁</span></span><br><span class="line">    KeAcquireSpinLock(&amp;spinlock, &amp;oldirql);</span><br><span class="line"></span><br><span class="line">    bLock = TRUE;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//解锁</span></span><br><span class="line">    KeReleaseSpinLock(&amp;spinlock, oldirql);</span><br><span class="line"></span><br><span class="line">    <span class="comment">//</span></span><br><span class="line">    <span class="comment">//遍历链表</span></span><br><span class="line">    <span class="comment">//</span></span><br><span class="line"></span><br><span class="line">    DbgPrint(<span class="string">"AAAAAAAAAAAAAAA\n"</span>);</span><br><span class="line"></span><br><span class="line">    bLock = FALSE;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="DPC操作"><a href="#DPC操作" class="headerlink" title="DPC操作"></a>DPC操作</h2><h3 id="手动插入DPC队列"><a href="#手动插入DPC队列" class="headerlink" title="手动插入DPC队列"></a>手动插入DPC队列</h3><p>KeInitializeDpc初始化，KeInsertQueueDpc插入。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">KDPC dpcobj = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line"><span class="function">VOID <span class="title">DpcRoutine</span><span class="params">(PVOID context)</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"---Dpc Run Current Irql=%d\n"</span>, KeGetCurrentIrql());</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">NTSTATUS <span class="title">DriverEntry</span><span class="params">(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">pDriverObject-&gt;DriverUnload = DrvierUnload;</span><br><span class="line"></span><br><span class="line">NTSTATUS status = STATUS_SUCCESS;</span><br><span class="line"></span><br><span class="line">KeInitializeDpc(&amp;dpcobj, DpcRoutine, <span class="literal">NULL</span>);</span><br><span class="line"></span><br><span class="line">KeInsertQueueDpc(&amp;dpcobj, <span class="literal">NULL</span>, <span class="literal">NULL</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> status;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="内存"><a href="#内存" class="headerlink" title="内存"></a>内存</h2><h3 id="带标识符分配内存"><a href="#带标识符分配内存" class="headerlink" title="带标识符分配内存"></a>带标识符分配内存</h3><p><code>PVOID tempbuffer = ExAllocatePoolWithTag(NonPagedPool, 0x1000, &#39;xxaa&#39;);</code></p><h3 id="常用的标识符"><a href="#常用的标识符" class="headerlink" title="常用的标识符"></a>常用的标识符</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> _Enum_is_bitflag_ <span class="keyword">enum</span> _POOL_TYPE &#123;</span><br><span class="line">    NonPagedPool,</span><br><span class="line">    NonPagedPoolExecute = NonPagedPool,</span><br><span class="line">    PagedPool,</span><br><span class="line">    NonPagedPoolMustSucceed = NonPagedPool + <span class="number">2</span>,<span class="comment">//分配必须成功</span></span><br><span class="line">    DontUseThisType,</span><br><span class="line">    NonPagedPoolCacheAligned = NonPagedPool + <span class="number">4</span>, <span class="comment">//内存对齐，32位系统四字节，64位8字节</span></span><br><span class="line">    PagedPoolCacheAligned,</span><br><span class="line">    NonPagedPoolCacheAlignedMustS = NonPagedPool + <span class="number">6</span>, <span class="comment">//内存对齐加分配必须成功</span></span><br><span class="line">    MaxPoolType</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="内存清零"><a href="#内存清零" class="headerlink" title="内存清零"></a>内存清零</h3><p>RtlZeroMemory(tempbuffer, 0x1000);</p><h3 id="内存填充"><a href="#内存填充" class="headerlink" title="内存填充"></a>内存填充</h3><p>RtlFillMemory(tempbuffer, 0x1000, 0xcc);</p><h3 id="释放"><a href="#释放" class="headerlink" title="释放"></a>释放</h3><p>ExFreePoolWithTag(tempbuffer, ‘xxaa’);</p><h3 id="内存是否相等"><a href="#内存是否相等" class="headerlink" title="内存是否相等"></a>内存是否相等</h3><p>//RtlCompareMemory()<br>RtlEqualMemory((Destination,Source,Length);用的比较多，相等返回TRUE，不等返回FALSE。</p><p>本质都是由C语言实现的宏</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length)))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))</span></span><br></pre></td></tr></table></figure><p>可以使用WDK自带的poolMon.exe进行查看</p><p><img src="/assets/blog/2021-09-03-驱动基础/image-20210826162454725.png" alt="image-20210826162454725"></p><h3 id="旁视列表-LookAside"><a href="#旁视列表-LookAside" class="headerlink" title="旁视列表 LookAside"></a>旁视列表 LookAside</h3><p>为了减少内存碎片，一开始就申请一片复用的内存空间，在固定的内存空间，再次分配或者释放内存。</p><p>详情看书3.7.2旁视列表.</p><p>非分页主要函数位ExInitializeNPagedLookasideList(),</p><h2 id="链表"><a href="#链表" class="headerlink" title="链表"></a>链表</h2><p>进行全局变量的链表修改时，容易造成多线程安全，应合理使用自旋锁。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">LIST_ENTRY</span> &#123;</span></span><br><span class="line">   <span class="class"><span class="keyword">struct</span> _<span class="title">LIST_ENTRY</span> *<span class="title">Flink</span>;</span></span><br><span class="line">   <span class="class"><span class="keyword">struct</span> _<span class="title">LIST_ENTRY</span> *<span class="title">Blink</span>;</span></span><br><span class="line">&#125; LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;</span><br></pre></td></tr></table></figure><h3 id="链表初始化"><a href="#链表初始化" class="headerlink" title="链表初始化"></a>链表初始化</h3><p>填充为自己的地址</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">LIST_ENTRY listhead = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">InitializeListHead(&amp;listhead);</span><br></pre></td></tr></table></figure><h3 id="链表插入"><a href="#链表插入" class="headerlink" title="链表插入"></a>链表插入</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">InsertHeadList(,)<span class="comment">//头部插入</span></span><br><span class="line">InsertTailList(&amp;listhead, &amp;(ptempptr-&gt;<span class="built_in">list</span>)); <span class="comment">//尾部插入</span></span><br></pre></td></tr></table></figure><h3 id="链表删除"><a href="#链表删除" class="headerlink" title="链表删除"></a>链表删除</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">RemoveTailList <span class="comment">//移除头部</span></span><br><span class="line">RemoveHeadList <span class="comment">//移除部</span></span><br></pre></td></tr></table></figure><h3 id="链表遍历"><a href="#链表遍历" class="headerlink" title="链表遍历"></a>链表遍历</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">MyStruct</span> &#123;</span></span><br><span class="line">HANDLE pid;</span><br><span class="line">LIST_ENTRY <span class="built_in">list</span>;</span><br><span class="line">&#125;MyStruct, * PMyStruct;</span><br><span class="line"></span><br><span class="line">PLIST_ENTRY  templist = <span class="literal">NULL</span>;</span><br><span class="line">PMyStruct tempptr = <span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">for</span> (PLIST_ENTRY templist = listhead.Flink; templist != &amp;listhead; templist = templist-&gt;Flink) &#123;</span><br><span class="line">    PMyStruct tempptr = CONTAINING_RECORD(templist, MyStruct, <span class="built_in">list</span>);</span><br><span class="line">    DbgPrint(<span class="string">"--%d--%p--%s\n"</span>,tempptr-&gt;pid, tempptr-&gt;pEprocesspbj, tempptr-&gt;processname);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="链表遍历并删除"><a href="#链表遍历并删除" class="headerlink" title="链表遍历并删除"></a>链表遍历并删除</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">while</span> (listhead.Flink != &amp;listhead) &#123;</span><br><span class="line">    <span class="comment">//返回节点指针</span></span><br><span class="line">    templist = RemoveTailList(&amp;listhead);</span><br><span class="line"></span><br><span class="line">    tempptr = CONTAINING_RECORD(templist, MyStruct, <span class="built_in">list</span>);</span><br><span class="line"></span><br><span class="line">    DbgPrint(<span class="string">"--%d--%p--%s\n"</span>,</span><br><span class="line">             tempptr-&gt;pid, tempptr-&gt;pEprocesspbj, tempptr-&gt;processname);</span><br><span class="line"></span><br><span class="line">    ExFreePool(tempptr);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (IsListEmpty(&amp;listhead)) &#123;</span><br><span class="line">    DbgPrint(<span class="string">"Free List Succeed\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="线程与事件"><a href="#线程与事件" class="headerlink" title="线程与事件"></a>线程与事件</h2><h3 id="申请事件"><a href="#申请事件" class="headerlink" title="申请事件"></a>申请事件</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">KEVENT gkevent = &#123; <span class="number">0</span> &#125;;</span><br></pre></td></tr></table></figure><h3 id="初始化事件"><a href="#初始化事件" class="headerlink" title="初始化事件"></a>初始化事件</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">KeInitializeEvent(&amp;gkevent, NotificationEvent, FALSE);</span><br></pre></td></tr></table></figure><h3 id="创建线程"><a href="#创建线程" class="headerlink" title="创建线程"></a>创建线程</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">NTSTATUS status = PsCreateSystemThread(&amp;hthread, <span class="number">0</span>, <span class="literal">NULL</span>, <span class="literal">NULL</span>, <span class="literal">NULL</span>, KernelThread2, &amp;gkevent);</span><br></pre></td></tr></table></figure><h3 id="结束线程"><a href="#结束线程" class="headerlink" title="结束线程"></a>结束线程</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">PsTerminateSystemThread(<span class="number">0</span>);</span><br></pre></td></tr></table></figure><h3 id="等待线程"><a href="#等待线程" class="headerlink" title="等待线程"></a>等待线程</h3><p><code>KeWaitForSingleObject(&amp;gkevent, Executive, KernelMode, FALSE, NULL);</code></p><h4 id="设置超时等待"><a href="#设置超时等待" class="headerlink" title="设置超时等待"></a>设置超时等待</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">LARGE_INTEGER timeout = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line">timeout.QuadPart = <span class="number">-10</span> * <span class="number">1000</span> * <span class="number">1000</span> * <span class="number">5</span>;</span><br><span class="line">    </span><br><span class="line"><span class="keyword">while</span> (<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//设置超时时间</span></span><br><span class="line">NTSTATUS status =  KeWaitForSingleObject(pKernelEvent, Executive, KernelMode, FALSE, &amp;timeout);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (status == STATUS_TIMEOUT) &#123;</span><br><span class="line">DbgPrint(<span class="string">"Time Out\n"</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"This Requset com from R3 Routine\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">PsTerminateSystemThread(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="通知事件NotificationEvent"><a href="#通知事件NotificationEvent" class="headerlink" title="通知事件NotificationEvent"></a>通知事件NotificationEvent</h3><p>如果一个事件被设置为通知事件<code>(NotificationEvent)</code>,那么当这个事件被设置成激发态以后,如果还需要用到这个事件进行同步,那么需要开发人员手动设置为不激发状态。</p><p>通常的情况就只是使用一次。</p><h3 id="同步事件SynchronizationEvent"><a href="#同步事件SynchronizationEvent" class="headerlink" title="同步事件SynchronizationEvent"></a>同步事件SynchronizationEvent</h3><p>如果某一个事件我们设置为同步事件SynchronizationEvent<br>那么当这个事件遇到KeWt等待函数通过然后系统会自动将事件重置为未激发态。</p><h3 id="设置时间为激发态"><a href="#设置时间为激发态" class="headerlink" title="设置时间为激发态"></a>设置时间为激发态</h3><p><code>KeSetEvent(&amp;gkevent, IO_NO_INCREMENT, FALSE);</code></p><h3 id="设置时间为非激发态"><a href="#设置时间为非激发态" class="headerlink" title="设置时间为非激发态"></a>设置时间为非激发态</h3><p><code>KeResetEvent(&amp;gkevent);</code></p><h3 id="事例-1"><a href="#事例-1" class="headerlink" title="事例"></a>事例</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">VOID <span class="title">KernelThread1</span><span class="params">(PVOID context)</span> </span>&#123;</span><br><span class="line">KeInitializeEvent(&amp;gkevent, NotificationEvent, FALSE);</span><br><span class="line"></span><br><span class="line">HANDLE hthread = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">NTSTATUS status = PsCreateSystemThread(&amp;hthread, <span class="number">0</span>, <span class="literal">NULL</span>, <span class="literal">NULL</span>, <span class="literal">NULL</span>, KernelThread2, &amp;gkevent);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!NT_SUCCESS(status)) &#123;</span><br><span class="line">DbgPrint(<span class="string">"Create Thread Failed : %x"</span>, status);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">ZwClose(hthread);</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span>(<span class="number">1</span>) &#123;</span><br><span class="line">KeWaitForSingleObject(&amp;gkevent, Executive, KernelMode, FALSE, <span class="literal">NULL</span>);</span><br><span class="line"></span><br><span class="line">KeResetEvent(&amp;gkevent);</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"Event Has be seted\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line">PsTerminateSystemThread(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="r3和r0进行同步"><a href="#r3和r0进行同步" class="headerlink" title="r3和r0进行同步"></a>r3和r0进行同步</h2><h3 id="获取r3的句柄的内核对象"><a href="#获取r3的句柄的内核对象" class="headerlink" title="获取r3的句柄的内核对象"></a>获取r3的句柄的内核对象</h3><p>ObReferenceObjectByHandle()</p><h3 id="释放引用"><a href="#释放引用" class="headerlink" title="释放引用"></a>释放引用</h3><p>ObDereferenceObject()</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">HANDLE hEvent = (HANDLE)dwIndata;</span><br><span class="line"><span class="comment">//句柄只隶属于当前进程,获取当前的事件对象</span></span><br><span class="line"><span class="comment">//https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-obreferenceobjectbyhandle</span></span><br><span class="line">status = ObReferenceObjectByHandle(hEvent, EVENT_MODIFY_STATE, *ExEventObjectType, KernelMode, &amp;pKernelEvent, <span class="literal">NULL</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (NT_SUCCESS(status)) &#123;</span><br><span class="line">    <span class="comment">//提前引用计数减一</span></span><br><span class="line">    <span class="comment">//方便其他操作该内核对象</span></span><br><span class="line">    ObDereferenceObject(pKernelEvent);</span><br><span class="line"></span><br><span class="line">    HANDLE hThread = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">    status = PsCreateSystemThread(&amp;hThread, <span class="number">0</span>, <span class="literal">NULL</span>, <span class="literal">NULL</span>, <span class="literal">NULL</span>, KernelThread3, <span class="literal">NULL</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="r0与r3的线程同步技巧"><a href="#r0与r3的线程同步技巧" class="headerlink" title="r0与r3的线程同步技巧"></a>r0与r3的线程同步技巧</h3><ul><li>不要设置线程超时，因为调试器很慢，有时候内核直接超市掉线，失去交互了。</li><li>使用调试器分别调试r3和r0，r3的有些错误并不会通过返回值并不会通过返回值表现出来，使用调试器接收异常是一个好的选择。</li></ul><h2 id="定时器"><a href="#定时器" class="headerlink" title="定时器"></a>定时器</h2><p>负数表示相对时间，从现在起。</p><p>-10<em>1000\</em>1000 = 1s 使用100纳秒为单位。</p><p>1s = 1000ms = 10^6微秒 = 10^9 纳秒 </p><h3 id="IO定时器"><a href="#IO定时器" class="headerlink" title="IO定时器"></a>IO定时器</h3><p>是基于设备的派遣函数，可能会切到其他进程。</p><p>1s一次。</p><h4 id="IO定时器初始化"><a href="#IO定时器初始化" class="headerlink" title="IO定时器初始化"></a>IO定时器初始化</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">VOID <span class="title">TimeWorker</span><span class="params">(PVOID context)</span> </span>&#123;</span><br><span class="line">    DbgPrint(<span class="string">"Irql = %d\n"</span>, KeGetCurrentIrql());</span><br><span class="line">    DbgPrint(<span class="string">"Processname = %s\n"</span>,            </span><br><span class="line">    PsGetProcessImageFileName(PsGetCurrentProcess()));</span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">IoInitializeTimer(pDevice, TimeWorker, <span class="literal">NULL</span>);</span><br></pre></td></tr></table></figure><h4 id="IO定时器启动"><a href="#IO定时器启动" class="headerlink" title="IO定时器启动"></a>IO定时器启动</h4><p>IoStartTimer(pDevice);</p><h4 id="IO定时器卸载"><a href="#IO定时器卸载" class="headerlink" title="IO定时器卸载"></a>IO定时器卸载</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DrvierUnload</span><span class="params">(PDRIVER_OBJECT pDriverObject)</span> </span>&#123;</span><br><span class="line">DbgPrint(<span class="string">"Unload\n"</span>);</span><br><span class="line">IoStopTimer(pDriverObject-&gt;DeviceObject);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="DISPATCHER-HEADER的重要性"><a href="#DISPATCHER-HEADER的重要性" class="headerlink" title="DISPATCHER_HEADER的重要性"></a>DISPATCHER_HEADER的重要性</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">DISPATCHER_HEADER</span> &#123;</span></span><br><span class="line">    <span class="keyword">union</span> &#123;</span><br><span class="line">        <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">            UCHAR Type;</span><br><span class="line">            <span class="keyword">union</span> &#123;</span><br><span class="line">                UCHAR Absolute;</span><br><span class="line">                UCHAR NpxIrql;</span><br><span class="line">            &#125;;</span><br><span class="line">            <span class="keyword">union</span> &#123;</span><br><span class="line">                UCHAR Size;</span><br><span class="line">                UCHAR Hand;</span><br><span class="line">            &#125;;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">union</span> &#123;</span><br><span class="line">                UCHAR Inserted;</span><br><span class="line">                BOOLEAN DebugActive;</span><br><span class="line">            &#125;;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">volatile</span> LONG Lock;</span><br><span class="line">    &#125;;</span><br><span class="line">    LONG SignalState;</span><br><span class="line">    LIST_ENTRY WaitListHead;</span><br><span class="line">&#125; DISPATCHER_HEADER;</span><br></pre></td></tr></table></figure><p>比较重要的，一个是<code>SignalState</code>，指定信号量或者事件的信号状态，小于等于0时线程需要等待。另一个<code>WaitListHead</code>，本质上是个双向循环链表</p><h3 id="反PChunter小技巧"><a href="#反PChunter小技巧" class="headerlink" title="反PChunter小技巧"></a>反PChunter小技巧</h3><p>初始化两次IO定时器</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">IoInitializeTimer(pDevice, TimeWorker, <span class="literal">NULL</span>);</span><br><span class="line">IoInitializeTimer(pDevice, TimeWorker, <span class="literal">NULL</span>);</span><br><span class="line"></span><br><span class="line">IoStartTimer(pDevice);</span><br></pre></td></tr></table></figure><h3 id="DPC定时器"><a href="#DPC定时器" class="headerlink" title="DPC定时器"></a>DPC定时器</h3><p>为何使用DPC定时器，使用高中断级执行代码。</p><h4 id="DPC定时器-1"><a href="#DPC定时器-1" class="headerlink" title="DPC定时器"></a>DPC定时器</h4><p><code>KeInitializeTimer(&amp;kerneltimer);</code></p><h4 id="初始化DPC"><a href="#初始化DPC" class="headerlink" title="初始化DPC"></a>初始化DPC</h4><p><code>KeInitializeDpc(&amp;dpcobj, DpcRoutine, NULL);</code></p><h4 id="插入dpc队列后-两秒后执行"><a href="#插入dpc队列后-两秒后执行" class="headerlink" title="插入dpc队列后 两秒后执行"></a>插入dpc队列后 两秒后执行</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">LARGE_INTEGER dpctime = &#123; <span class="number">0</span> &#125;;</span><br><span class="line">dpctime.QuadPart = <span class="number">-10</span> * <span class="number">1000</span> * <span class="number">1000</span> * <span class="number">2</span>;</span><br></pre></td></tr></table></figure><h4 id="设置DPCtimer"><a href="#设置DPCtimer" class="headerlink" title="设置DPCtimer"></a>设置DPCtimer</h4><p>KeSetTimer()</p><h4 id="事例-2"><a href="#事例-2" class="headerlink" title="事例"></a>事例</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//DPC定时器</span></span><br><span class="line">KeInitializeTimer(&amp;kerneltimer);</span><br><span class="line"></span><br><span class="line"><span class="comment">//初始化DPC</span></span><br><span class="line">KeInitializeDpc(&amp;dpcobj, DpcRoutine, <span class="literal">NULL</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//插入dpc队列后 两秒后执行</span></span><br><span class="line">LARGE_INTEGER dpctime = &#123; <span class="number">0</span> &#125;;</span><br><span class="line">dpctime.QuadPart = <span class="number">-10</span> * <span class="number">1000</span> * <span class="number">1000</span> * <span class="number">2</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//设置timer</span></span><br><span class="line"><span class="comment">//KeSetTimer(&amp;kerneltimer, dpctime, &amp;dpcobj);</span></span><br><span class="line">KeSetTimer(&amp;kerneltimer, dpctime, <span class="literal">NULL</span>);</span><br><span class="line"></span><br><span class="line">KeWaitForSingleObject(&amp;kerneltimer,Executive,KernelMode,FALSE,<span class="literal">NULL</span>);</span><br><span class="line"></span><br><span class="line">DbgPrint(<span class="string">"Dpc Timer has worked\n"</span>);</span><br></pre></td></tr></table></figure><h3 id="向系统线程池中插入自身函数"><a href="#向系统线程池中插入自身函数" class="headerlink" title="向系统线程池中插入自身函数"></a>向系统线程池中插入自身函数</h3><h4 id="初始化工作例程"><a href="#初始化工作例程" class="headerlink" title="初始化工作例程"></a>初始化工作例程</h4><p><code>ExInitializeWorkItem(&amp;workobj, WorkItemRoutine, NULL);</code></p><h4 id="插入工作例程"><a href="#插入工作例程" class="headerlink" title="插入工作例程"></a>插入工作例程</h4><p><code>ExQueueWorkItem(&amp;workobj, CriticalWorkQueue);</code></p><p>一般使用CriticalWorkQueue,DelayedWorkQueue。</p><table><thead><tr><th style="text-align:left"><code>CriticalWorkQueue</code></th><th>表示实时系统工作线程。分配的优先级为 13。</th></tr></thead><tbody><tr><td style="text-align:left"><code>DelayedWorkQueue</code></td><td>表示普通工作线程。分配的优先级为 12。</td></tr></tbody></table><p>可以使用事件进行线程延迟同步。</p><h2 id="Ps函数"><a href="#Ps函数" class="headerlink" title="Ps函数"></a>Ps函数</h2><h3 id="获取进程名"><a href="#获取进程名" class="headerlink" title="获取进程名"></a>获取进程名</h3><p>PsGetProcessImageFileName(PsGetCurrentProcess())</p><h2 id="Mm函数"><a href="#Mm函数" class="headerlink" title="Mm函数"></a>Mm函数</h2><h3 id="获取导出函数地址"><a href="#获取导出函数地址" class="headerlink" title="获取导出函数地址"></a>获取导出函数地址</h3><p>MmGetSystemRoutineAddress() </p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;代码地址&quot;&gt;&lt;a href=&quot;#代码地址&quot; class=&quot;headerlink&quot; title=&quot;代码地址&quot;&gt;&lt;/a&gt;代码地址&lt;/h2&gt;&lt;p&gt;配合&lt;em&gt;git&lt;/em&gt; –no-pager 和 git checkout进行代码查看 &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/aW3ikun/Windows-Kernel-Driver-programming-practice&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/aW3ikun/Windows-Kernel-Driver-programming-practice&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;常用初始化&quot;&gt;&lt;a href=&quot;#常用初始化&quot; class=&quot;headerlink&quot; title=&quot;常用初始化&quot;&gt;&lt;/a&gt;常用初始化&lt;/h3&gt;&lt;figure class=&quot;highlight c&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;OBJECT_ATTRIBUTES obja = &amp;#123; &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt; &amp;#125;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;InitializeObjectAttributes(&amp;amp;obja, &amp;amp;str, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, &lt;span class=&quot;literal&quot;&gt;NULL&lt;/span&gt;, &lt;span class=&quot;literal&quot;&gt;NULL&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h2 id=&quot;入门&quot;&gt;&lt;a href=&quot;#入门&quot; class=&quot;headerlink&quot; title=&quot;入门&quot;&gt;&lt;/a&gt;入门&lt;/h2&gt;&lt;p&gt;driver的PUNICODE_STRING指向注册表地址，注册表存储着服务的相关信息。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2021-09-03-驱动基础/image-20210817163550400.png&quot; alt=&quot;image-20210817163550400&quot;&gt;&lt;/p&gt;
&lt;p&gt;如果pDriverObject-&amp;gt;Unload没有对应的卸载函数，则不进行卸载，是一种保护措施。&lt;/p&gt;
    
    </summary>
    
      <category term="windows内核" scheme="http://blog.imjalen.top/categories/windows%E5%86%85%E6%A0%B8/"/>
    
    
      <category term="驱动" scheme="http://blog.imjalen.top/tags/%E9%A9%B1%E5%8A%A8/"/>
    
  </entry>
  
  <entry>
    <title>2021-08-16-花指令学习</title>
    <link href="http://blog.imjalen.top/2021/08/16/2021-08-16-%E8%8A%B1%E6%8C%87%E4%BB%A4%E5%AD%A6%E4%B9%A0/"/>
    <id>http://blog.imjalen.top/2021/08/16/2021-08-16-花指令学习/</id>
    <published>2021-08-16T06:48:09.000Z</published>
    <updated>2021-08-17T01:33:15.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p><a href="https://bbs.pediy.com/thread-129526.htm" target="_blank" rel="noopener">https://bbs.pediy.com/thread-129526.htm</a>    </p></blockquote><p>之前没有细致去了解，只了解简单的一些方便，遇到混淆还是有些畏难。所以好好的学习一下。需要了解一定的opcode。</p><p>opcode查询 <a href="http://ref.x86asm.net/coder32.html。" target="_blank" rel="noopener">http://ref.x86asm.net/coder32.html。</a></p><p>只能说加密与解密里是简单带过，略读一下就行。着重看下这个文章。</p><p>算是一篇摘抄总结文与简单实践。</p><h3 id="花指令分类"><a href="#花指令分类" class="headerlink" title="花指令分类"></a>花指令分类</h3><ol><li><p>可执行花指令</p><p>①可以正常运行；</p><p>②不改变任何寄存器的值；</p><a id="more"></a><p>③反汇编器可以正确反汇编该指令。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">mov edi,edi</span><br><span class="line">push eax</span><br><span class="line">pop eax</span><br><span class="line">nop</span><br></pre></td></tr></table></figure></li></ol><ol start="2"><li><p>不可执行花指令</p><p>① 不可以正常运行；</p><p>② 不改变任何寄存器的值；</p><p>③ 反汇编器可能会错误反汇编这些字节。</p><p><code>__emit 0xe9</code></p><p>人话来说，通过干扰反编译引擎，生成错误的汇编指令。但是执行并不会按照反编译的汇编指令执行。造成了机器执行与人眼执行的区别。</p></li></ol><h3 id="反汇编算法："><a href="#反汇编算法：" class="headerlink" title="反汇编算法："></a>反汇编算法：</h3><ol><li><p>线性扫描反汇编算法</p><p>从代码段开始，从头到尾逐字节扫描，匹配汇编。这样很容易不执行的数据解析成汇编代码。造成错误。</p></li><li><p>行进递归反汇编算法</p><p>从代码段开始，逐字节扫描解析，遇到跳转后，则跳转到该地址再进行扫描解析。</p></li></ol><h2 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h2><h3 id="简单不可执行花指令"><a href="#简单不可执行花指令" class="headerlink" title="简单不可执行花指令"></a><strong>简单不可执行花指令</strong></h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">__asm &#123;</span><br><span class="line"><span class="comment">//简单不可执行花指令</span></span><br><span class="line">jmp Lable1</span><br><span class="line">__emit <span class="number">0x8</span></span><br><span class="line"><span class="comment">//0xEa</span></span><br><span class="line"><span class="comment">//0xeB</span></span><br><span class="line"><span class="comment">//0xec</span></span><br><span class="line">&#125;</span><br><span class="line">Lable1:</span><br><span class="line">    <span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">"Hello World!\n"</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/assets/blog/2021-08-16-花指令学习/image-20210816152556563.png" alt="image-20210816152556563"></p><p>已经混淆，人眼发现下一步还是跳转。</p><p><img src="/assets/blog/2021-08-16-花指令学习/image-20210816152649559.png" alt="image-20210816152649559"></p><p>执行一步后，如下，解析正常。</p><p><img src="/assets/blog/2021-08-16-花指令学习/image-20210816152740354.png" alt="image-20210816152740354"></p><h3 id="稍复杂的花指令"><a href="#稍复杂的花指令" class="headerlink" title="稍复杂的花指令"></a><strong>稍复杂的花指令</strong></h3><h4 id="多节跳转"><a href="#多节跳转" class="headerlink" title="多节跳转"></a>多节跳转</h4><p>使用多重嵌套能混淆更多的指令。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">int main()</span><br><span class="line">&#123;</span><br><span class="line">__asm &#123;</span><br><span class="line">//多节花指令</span><br><span class="line">jmp Lable2</span><br><span class="line">__emit 0xe8</span><br><span class="line">__emit 0x41</span><br><span class="line">Lable2:</span><br><span class="line">push eax</span><br><span class="line">mov eax,1</span><br><span class="line">pop ebx</span><br><span class="line">mov eax,ebx</span><br><span class="line">jmp Lable1</span><br><span class="line">__emit 0xe9</span><br><span class="line">&#125;</span><br><span class="line">Lable1:</span><br><span class="line">    std::cout &lt;&lt; &quot;Hello World!\n&quot;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/assets/blog/2021-08-16-花指令学习/image-20210816155420108.png" alt="image-20210816155420108"></p><h4 id="多层乱序嵌套"><a href="#多层乱序嵌套" class="headerlink" title="多层乱序嵌套"></a>多层乱序嵌套</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">__asm &#123;</span><br><span class="line">jmp Lable1</span><br><span class="line">__emit <span class="number">0xe8</span></span><br><span class="line">__emit <span class="number">0x41</span></span><br><span class="line">Lable2:</span><br><span class="line">xor eax,eax</span><br><span class="line">jnz Lable1</span><br><span class="line">jz Lable3</span><br><span class="line">__emit <span class="number">0x76</span></span><br><span class="line">__emit <span class="number">0x7c</span></span><br><span class="line">Lable1:</span><br><span class="line">mov eax,<span class="number">0xe8e9ece8</span></span><br><span class="line">jmp Lable2</span><br><span class="line">__emit <span class="number">0x75</span></span><br><span class="line">&#125;</span><br><span class="line">Lable3:</span><br><span class="line">    <span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">"Hello World!\n"</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/assets/blog/2021-08-16-花指令学习/image-20210816160205087.png" alt="image-20210816160205087"></p><h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>jmp/call/ret+垃圾数据，非常容易被识别。可以说几乎没有什么作用。</p><p>放到x32dbg中虽有混淆，但意图明显，很容易过滤掉。</p><p>ida中直接被过滤。</p><blockquote><p>①检测跳转结构的固定形态特征，当然这不是绝对的，如果检测机制没能预见到这种形态特征，此点可以忽略，本文后边会提到一些这样的情况。</p><p>②用可靠的方法直接证明，垃圾数据部分在任何情况下都不会被执行。应该说该点是对“不可执行花指令”的无敌检测手段，然而却难在“可靠”二字上，目前已知的实践，只是做到“可供参考”的程度。</p></blockquote><h3 id="创意的花指令"><a href="#创意的花指令" class="headerlink" title="创意的花指令"></a>创意的花指令</h3><blockquote><p>①采用新的固定结构，许多插件还没有检测，比如下文提到的xor-cmp的结构。<br>②非固定结构的“伪条件跳转”替代“强制跳转”</p></blockquote><h3 id="使用互补条件跳转"><a href="#使用互补条件跳转" class="headerlink" title="使用互补条件跳转"></a>使用互补条件跳转</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">__asm &#123;</span><br><span class="line">cmp eax,ebx</span><br><span class="line">jge Lable2</span><br><span class="line">jle Lable2</span><br><span class="line">__emit <span class="number">0xe8</span></span><br><span class="line">__emit <span class="number">0x41</span></span><br><span class="line">Lable2:</span><br><span class="line">mov eax,<span class="number">2</span></span><br><span class="line">cmp eax,esp</span><br><span class="line">jnz Lable3</span><br><span class="line">jz Lable3</span><br><span class="line">&#125;</span><br><span class="line">Lable3:</span><br><span class="line">    <span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">"Hello World!\n"</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/assets/blog/2021-08-16-花指令学习/image-20210816161933524.png" alt="image-20210816161933524"></p><p>IDA混淆效果显著。</p><p><img src="/assets/blog/2021-08-16-花指令学习/image-20210816161656837.png" alt="image-20210816161656837"></p><h3 id="改进版—用随机值获得确定性标志位"><a href="#改进版—用随机值获得确定性标志位" class="headerlink" title="改进版—用随机值获得确定性标志位"></a>改进版—用随机值获得确定性标志位</h3><blockquote><p>通过某些隐蔽的手法，使得某个标志位有确定性的值，然后利用这个确定值，进行确定性条件跳转。</p></blockquote><p>利用某确定值，进行跳转。这个需要查询影响CF标志位等的操作符。 参考：<a href="http://abcdxyzk.github.io/blog/2012/12/20/assembly-cmd-flags/" target="_blank" rel="noopener">http://abcdxyzk.github.io/blog/2012/12/20/assembly-cmd-flags/</a></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">DWORD d;</span><br><span class="line">__asm &#123;</span><br><span class="line">mov d ,<span class="number">0x123</span></span><br><span class="line">xor eax,d</span><br><span class="line">cmp eax,d</span><br><span class="line">jne Lable3</span><br><span class="line">__emit <span class="number">0xc2</span></span><br><span class="line">            </span><br><span class="line">              <span class="comment">//mov d ,0x123</span></span><br><span class="line"><span class="comment">//and eax,d</span></span><br><span class="line"><span class="comment">//sub eax,d</span></span><br><span class="line"><span class="comment">//jle Lable3</span></span><br><span class="line"><span class="comment">//__emit 0xc2</span></span><br><span class="line">&#125;</span><br><span class="line">Lable3:</span><br><span class="line">    <span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">"Hello World!\n"</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/assets/blog/2021-08-16-花指令学习/image-20210816163021204.png" alt="image-20210816163021204"></p><p>效果不错。</p><p><img src="/assets/blog/2021-08-16-花指令学习/image-20210816163136637.png" alt="image-20210816163136637"></p><p>ida阵亡。</p><p><img src="/assets/blog/2021-08-16-花指令学习/image-20210816163220837.png" alt="image-20210816163220837"></p><h3 id="利用API返回确定值"><a href="#利用API返回确定值" class="headerlink" title="利用API返回确定值"></a>利用API返回确定值</h3><blockquote><p>大部分API函数的返回值是不确定的，只要有方法使得API返回确定值，那么后面接续的条件跳转，就是等价的。比如说CreateFile返回文件句柄，句柄可能是任意值且有不确定性，然而我们可以使得函数CreateFile返回值是确定的。<br>1)令CreateFile返回错误码，比如故意向CreateFile传入错误参数，还可以使用类似inc esp，使得堆栈不4字节对齐，即使传入正确参数，也会返回错误码。</p><p>2)由于句柄值实际上是句柄表索引，所以CreatFile返回的正确句柄值都是4的倍数，我们把句柄值取4的模，得0是一定的。</p></blockquote><h4 id="总结-1"><a href="#总结-1" class="headerlink" title="总结"></a>总结</h4><p>通过某种方法，去构造一个看似任意值，实则最后获得确定值。以保证影响标志寄存器具有唯一性，则跳转也存在唯一性。</p><h3 id="指令检测"><a href="#指令检测" class="headerlink" title="指令检测"></a>指令检测</h3><p>思路是检测垃圾代码是否被清除,一般使用nop清除。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Msg</span><span class="params">()</span> </span>&#123;</span><br><span class="line">MessageBoxA(<span class="literal">NULL</span>,<span class="string">"detected"</span>,<span class="literal">NULL</span>,MB_OK);</span><br><span class="line"><span class="built_in">exit</span>(<span class="number">1</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">DWORD d;</span><br><span class="line">__asm &#123;</span><br><span class="line">mov d ,<span class="number">0x123</span></span><br><span class="line"><span class="keyword">and</span> eax,d</span><br><span class="line">sub eax,d</span><br><span class="line">jne Lable3</span><br><span class="line">__emit <span class="number">0xc2</span></span><br><span class="line">&#125;</span><br><span class="line">Lable3:</span><br><span class="line">__asm &#123;</span><br><span class="line">lea eax, Lable3</span><br><span class="line">add eax,<span class="number">-1</span></span><br><span class="line">mov al,byte ptr[eax]</span><br><span class="line">cmp al,<span class="number">0x90</span></span><br><span class="line">jne Label4</span><br><span class="line">call Msg</span><br><span class="line">&#125;</span><br><span class="line">Label4:</span><br><span class="line">    <span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">"Hello World!\n"</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="总结-2"><a href="#总结-2" class="headerlink" title="总结"></a>总结</h3><p>都是针对静态相关的花指令，基于动态调试的破解技术,保护效果并不明显。</p><p>所以耐心通过动态调试，是能攻破的。</p><p>而vm保护就不一样了。后续再聊！</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://bbs.pediy.com/thread-129526.htm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://bbs.pediy.com/thread-129526.htm&lt;/a&gt;    &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;之前没有细致去了解，只了解简单的一些方便，遇到混淆还是有些畏难。所以好好的学习一下。需要了解一定的opcode。&lt;/p&gt;
&lt;p&gt;opcode查询 &lt;a href=&quot;http://ref.x86asm.net/coder32.html。&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://ref.x86asm.net/coder32.html。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;只能说加密与解密里是简单带过，略读一下就行。着重看下这个文章。&lt;/p&gt;
&lt;p&gt;算是一篇摘抄总结文与简单实践。&lt;/p&gt;
&lt;h3 id=&quot;花指令分类&quot;&gt;&lt;a href=&quot;#花指令分类&quot; class=&quot;headerlink&quot; title=&quot;花指令分类&quot;&gt;&lt;/a&gt;花指令分类&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;可执行花指令&lt;/p&gt;
&lt;p&gt;①可以正常运行；&lt;/p&gt;
&lt;p&gt;②不改变任何寄存器的值；&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
    
    </summary>
    
      <category term="保护" scheme="http://blog.imjalen.top/categories/%E4%BF%9D%E6%8A%A4/"/>
    
    
      <category term="花指令" scheme="http://blog.imjalen.top/tags/%E8%8A%B1%E6%8C%87%E4%BB%A4/"/>
    
      <category term="混淆" scheme="http://blog.imjalen.top/tags/%E6%B7%B7%E6%B7%86/"/>
    
  </entry>
  
  <entry>
    <title>SMAP_SMEP_PGAING_KPTI 解析</title>
    <link href="http://blog.imjalen.top/2021/08/09/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/"/>
    <id>http://blog.imjalen.top/2021/08/09/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/</id>
    <published>2021-08-08T16:00:00.000Z</published>
    <updated>2021-08-08T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="SMAP-SMEP"><a href="#SMAP-SMEP" class="headerlink" title="SMAP_SMEP"></a>SMAP_SMEP</h2><blockquote><p><a href="https://www.bilibili.com/video/BV1nJ411T7R6" target="_blank" rel="noopener">https://www.bilibili.com/video/BV1nJ411T7R6</a></p></blockquote><p>如果通过Windbg手工构造21号中断，在win10内是无法正常执行的，关掉SMEP可以执行。</p><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210803174805935.png" alt="image-20210803174805935"></p><p>这涉及到了SMAP，SMEP。Cr4中的标志位如下。（白皮书 2.5 CONTROL REGISTERS）</p><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210803174914683.png" alt="image-20210803174914683"></p><p>SMAP，SMEP 白皮书 4.6  ACCESS RIGHTS</p><p>CR4.SMEP = 1, 不能执行任何用户模式的指令</p><p>CR4.SMAP = 1， CR0.WP = 1,EFLAGS.AC = 0 或者隐式访问，不能向用户模式的地址写入任何数据。使用汇编指令<code>stac</code>（1F 01 CB),将EFLAG标志位AC置为1，暂时关闭SAMP保护。</p><a id="more"></a><p>能进行部分内核的地址获取并传给r3地址，但仍然有一定限制（只能访问 idt,gdt,KVASCODE其他则蓝屏)，涉及到KPTI（页表隔离机制）。</p><p>SMEP和SMAP保护涉及ProtectionKeys保护标志位。</p><h3 id="Protection-Keys"><a href="#Protection-Keys" class="headerlink" title="Protection Keys"></a>Protection Keys</h3><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210804144644250.png" alt="4.5 4-LEVEL PAGING AND 5-LEVEL PAGING"></p><p>白皮书 4.6.2 Protection Keys</p><p>Protection keys apply to shadow-stack accesses just as they do to ordinary data accesses.</p><p>保护密钥适用于影子堆栈访问，就像它们适用于普通数据访问一样。</p><p>4 级分页和5级分页每个线性地址将有4位ProtectionKeys,（ProtectionKeys位于映射线性地址页面的分页结构条目62:59区间)。两个ProtectionKeys功能根据其保护密钥控制对线性地址的访问.</p><h3 id="PKRU"><a href="#PKRU" class="headerlink" title="PKRU"></a>PKRU</h3><p>32位寄存器，存在i（0&lt;=i&lt;=15),PKRU[2i]位访问禁止位ADi，PKRU[2i+1]是写入调用位WDi。</p><p><code>llRDPKRU</code>，<code>WRPKRU</code> ecx = 0;读取写入PKRU。</p><h3 id="IA32-PKRS"><a href="#IA32-PKRS" class="headerlink" title="IA32_PKRS"></a>IA32_PKRS</h3><p>IA32_PKRS MSR 格式相同(保留63:32位，为0)。</p><p>线性地址上的保护键只保护访问的数据，不保护取指令。</p><p>Cr4.PKE = 0 AND Cr4.PKS=0 ,不启用保护。</p><ul><li><p>CR4.PKE = 1, 使用PKRU（Protection Key Rights Register ）寄存器, 通过判断ProtectionKeys，判断是否能对用户层进行读写。</p></li><li><p>If CR4.PKS = 1, 使用MSR寄存器 IA32_PKRS MSR (6E1H), 判断是否有权限读取或写入r0地址。</p><p>ADi = 1, 不允许数据访问。</p><p>WDi = 1, CR0.WP = 1,不允许r3地址的写入</p></li></ul><h2 id="分页"><a href="#分页" class="headerlink" title="分页"></a>分页</h2><h3 id="PAE-PAGING"><a href="#PAE-PAGING" class="headerlink" title="PAE PAGING"></a>PAE PAGING</h3><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210804175026968.png" alt="image-20210804175026968"></p><p>PDPTE-&gt;PDE-&gt;PTE-&gt;PhyscialAddress</p><p>   2    9   9     12</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">PAE PAGING</span><br><span class="line"></span><br><span class="line">00PDPTE 0  pdpti</span><br><span class="line">000000 010PDE2*8 pdi</span><br><span class="line">00001 1010PTE26*8 pdi </span><br><span class="line">0111 10110000offset 1968</span><br><span class="line"></span><br><span class="line">va of ptd = 0xC0000000 + ((addr &gt;&gt; 12)&lt;&lt;3)</span><br><span class="line">va of ptd = 0xC0060000 + ((addr &gt;&gt; 21)&lt;&lt;3)</span><br></pre></td></tr></table></figure><p>非PAE： </p><p>​    表size 400000h</p><p>​    PTE C0000000H</p><p>​    PDE C0300000H</p><p>PAE：</p><p>​    表size 800000h</p><p>​    PTE C0000000H</p><p>​    PDE C0600000H</p><h3 id="4-Level-PAGING"><a href="#4-Level-PAGING" class="headerlink" title="4 Level PAGING"></a>4 Level PAGING</h3><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210804190941571.png" alt="image-20210804190941571"></p><p>INTEL:    PML4E-&gt;PDPTE-&gt;PDE-&gt;PTE-&gt;PhyscialAddress</p><p>Microsoft：PXE  -&gt; PPE-&gt;PDE-&gt;PTE-&gt;PhyscialAddress</p><pre><code>9       9     9    9     12</code></pre><p>都是八字节的索引，8字节</p><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210804184730023.png" alt="image-20210804184730023"></p><p>通过cr3的物理地址查表，根据index进行索引。索引到的值后12位仍为属性值，查表时可忽略。</p><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210804185412657.png" alt="image-20210804185412657"></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">fffff803`4f25dfb0 </span><br><span class="line">( !dq )</span><br><span class="line">1 1111 0000 0x1f0  *0n8    + cr3</span><br><span class="line">0 0000 1101 0xD *0n8  + 00000000`00e08000</span><br><span class="line">0 0111 1001 0x79 *0n8 + 00000000`00e09000</span><br><span class="line">0 0101 1101 0x5D *0n8 +  00000000`00faa000</span><br><span class="line">1111 1011 0000 0xFB0  + 000000`0885d000</span><br></pre></td></tr></table></figure><p>8字节对应一个页4KB(2^12)，PTE的地址变为随机地址，</p><p>PTE g_PTE_BASE + address的后48位/4KB * 8 = <code>(address &amp;0xFFFFFFFFFFFF&gt;&gt;12)&lt;&lt;3 + g_PTE_BASE</code></p><p>一个PDE对应（2^21）2MB大小。</p><p>同理:</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">PTE_address =   (ULONG64)(address &amp;<span class="number">0xFFFFFFFFFFFF</span>&gt;&gt;<span class="number">12</span>)&lt;&lt;<span class="number">3</span> + g_PTE_BASE </span><br><span class="line">PDE_address =   (ULONG64)(address &amp;<span class="number">0xFFFFFFFFFFFF</span>&gt;&gt;<span class="number">21</span>)&lt;&lt;<span class="number">3</span> + g_PDE_BASE  </span><br><span class="line">PPE_address =   (ULONG64)(address &amp;<span class="number">0xFFFFFFFFFFFF</span>&gt;&gt;<span class="number">30</span>)&lt;&lt;<span class="number">3</span> + g_PPE_BASE</span><br><span class="line">PXE_address =   (ULONG64)(address &amp;<span class="number">0xFFFFFFFFFFFF</span>&gt;&gt;<span class="number">39</span>)&lt;&lt;<span class="number">3</span> + g_PXE_BASE</span><br></pre></td></tr></table></figure><h3 id="PTE地址定位"><a href="#PTE地址定位" class="headerlink" title="PTE地址定位"></a>PTE地址定位</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">kd&gt; !pte 0 获取PTE页表头部</span><br><span class="line">                                           VA 0000000000000000</span><br><span class="line">PXE at FFFFF0F87C3E1000    PPE at FFFFF0F87C200000    PDE at FFFFF0F840000000    PTE at FFFFF08000000000</span><br><span class="line">contains 8A0000000583E867  contains 0000000000000000</span><br><span class="line">pfn 583e      ---DA--UW-V  contains 0000000000000000</span><br><span class="line">not valid</span><br><span class="line"></span><br><span class="line">kd&gt; s -q fffff803`4c6ae000 L6400 FFFFF08000000000</span><br><span class="line">fffff803`4c6bb040  fffff080`00000000 ffffffb9`49c08b49</span><br><span class="line">fffff803`4c6bc068  fffff080`00000000 894cf003`4cc08b48</span><br><span class="line">fffff803`4c6bd280  fffff080`00000000 0f000045`3e993d83</span><br><span class="line">fffff803`4c6beb00  fffff080`00000000 ffffbaff`fffed4e9</span><br><span class="line">fffff803`4c6bf210  fffff080`00000000 c148f003`48c08b49</span><br><span class="line">fffff803`4c6c4cd8  fffff080`00000000 48f81c8b`481fe783</span><br><span class="line">fffff803`4c6c8ff8  fffff080`00000000 b841904d`8d48d233</span><br><span class="line">fffff803`4c6c93d8  fffff080`00000000 000fffff`ffffba49</span><br><span class="line">fffff803`4c6de018  fffff080`00000000 1c0e2c84`0ff68548</span><br></pre></td></tr></table></figure><p>通过暴力搜索匹配到PTE数据，会发现IDA中与windbg的数据不一样，可能是加载内核的时候进行改变。过特定函数的偏移地址或者搜索硬编码，获取g_PTE_BASE。</p><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210804204527485.png" alt="image-20210804204527485"></p><p>强制依赖于特定内核版本。</p><ol><li><p>通过DriverObject中的_LDR_DATA_TABLE_ENTRY进行模块遍历</p><blockquote><p><a href="https://bbs.pediy.com/thread-264140.htm" target="_blank" rel="noopener">https://bbs.pediy.com/thread-264140.htm</a></p></blockquote></li><li><p>ZwQuerySystemInformation 遍历模块</p></li></ol><p>ntdkk.h中的函数是ntoskrnl.exe的导出函数。</p><p>此次使用MmProtectMdlSystemAddress函数的硬偏移获取PTE_BASE.</p><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210805175207356.png" alt="image-20210805175207356"></p><p><a href="https://bbs.pediy.com/thread-262432.htm此处还有两种获取pte_base的方法。" target="_blank" rel="noopener">https://bbs.pediy.com/thread-262432.htm此处还有两种获取pte_base的方法。</a></p><h2 id="KPTI"><a href="#KPTI" class="headerlink" title="KPTI"></a>KPTI</h2><blockquote><p><a href="https://www.cnblogs.com/aliflycoris/p/9945995.html" target="_blank" rel="noopener">https://www.cnblogs.com/aliflycoris/p/9945995.html</a></p><p><a href="https://wumb0.in/windows-10-kvas-and-software-smep.html" target="_blank" rel="noopener">https://wumb0.in/windows-10-kvas-and-software-smep.html</a></p></blockquote><p><strong>内核页表隔离</strong>（Kernel page-table isolation），用来缓解熔断（meltdown）漏洞。</p><p>隔离用户空间和内核空间页表。</p><p>内核地址在R3中只有极少数被映射。大部分都无效。r3的地址保护使用SMAP和SMEP。</p><p>AMD处理器不用开启。使用Kisystemcall64。</p><p>intel开启使用Kisystemcall64Shadow。</p><ol><li>关闭smap和smep</li><li>从自建终端门提升权限后，获取cr3.与windbg中的cr3做比较。</li></ol><p>使用程序内部获取的到cr3与windbg看到的cr3不一致</p><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210809003433751.png" alt="image-20210809003433751"></p><p>通过KPROCESS结构也可以看到DirectoryTableBase（r0)和UserDirectoryTableBaser（r3）。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">kd&gt; dt _kprocess ffffd68ea0bed480</span><br><span class="line">nt!_KPROCESS</span><br><span class="line">   +0x028 DirectoryTableBase : 0x2de0c002</span><br><span class="line">   +0x280 UserDirectoryTableBase : 0x44b0b001</span><br><span class="line"></span><br><span class="line">二者指向的地址一致，但是属性不同。</span><br></pre></td></tr></table></figure><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210809004937656.png" alt="image-20210809004937656"></p><p>内存空间权限分隔如下：</p><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210809010208416.png" alt="image-20210809010208416"> </p><p><code>r cr3</code>显示的是内核层cr3，而程序中打印的是用户层使用的cr3。当我们的程序进入内核是是需要切换cr3的，以保证影射了足够的内核空间代码如.text段。不切换的话只能再KVASCODE中执行。</p><p>手动转换地址，也可得知user cr3无法访问ntoskrnl的.text段。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">kd&gt; !process 0 0 forwin10.exe</span><br><span class="line">PROCESS ffffd68ea12f2080</span><br><span class="line">    SessionId: 1  Cid: 04d4    Peb: 003f0000  ParentCid: 0ca0</span><br><span class="line">    DirBase: 6d8b2002  ObjectTable: ffff950635085240  HandleCount:  49.</span><br><span class="line">    Image: ForWin10.exe</span><br><span class="line">    </span><br><span class="line">kd&gt; dt _kprocess  ffffd68ea12f2080</span><br><span class="line">nt!_KPROCESS</span><br><span class="line">   +0x028 DirectoryTableBase : 0x6d8b2002</span><br><span class="line">   +0x280 UserDirectoryTableBase : 0x75831001</span><br><span class="line">   </span><br><span class="line">kd&gt; dt _kpcr fffff8034b6b9000</span><br><span class="line">nt!_KPCR</span><br><span class="line">   +0x180 Prcb             : _KPRCB</span><br><span class="line">kd&gt; dx -id 0,0,ffffd68e9ba8a380 -r1 (*((ntkrnlmp!_KPRCB *)0xfffff8034b6b9180))</span><br><span class="line">(*((ntkrnlmp!_KPRCB *)0xfffff8034b6b9180))                 [Type: _KPRCB]</span><br><span class="line">    [+0x6e80] KernelDirectoryTableBase : 0x80000000001ad002 [Type: unsigned __int64]</span><br><span class="line">    </span><br><span class="line">kd&gt; u FFFFF8034C87BAC0</span><br><span class="line">nt!KiSystemCall64:</span><br><span class="line">fffff803`4c87bac0 0f01f8          swapgs</span><br><span class="line">fffff803`4c87bac3 654889242510000000 mov   qword ptr gs:[10h],rsp</span><br><span class="line">fffff803`4c87bacc 65488b2425a8010000 mov   rsp,qword ptr gs:[1A8h]</span><br><span class="line"></span><br><span class="line">kd&gt; !vtop 0x6d8b2000  FFFFF8034C87BAC0</span><br><span class="line">Amd64VtoP: Virt fffff8034c87bac0, pagedir 000000006d8b2000</span><br><span class="line">Amd64VtoP: PML4E 000000006d8b2f80</span><br><span class="line">Amd64VtoP: PDPE 0000000000e08068</span><br><span class="line">Amd64VtoP: PDE 0000000000e09320</span><br><span class="line">Amd64VtoP: PTE 0000000000e153d8</span><br><span class="line">Amd64VtoP: Mapped phys 0000000002e70ac0</span><br><span class="line">Virtual address fffff8034c87bac0 translates to physical address 2e70ac0.</span><br><span class="line"></span><br><span class="line">kd&gt; !vtop 1ad000 FFFFF8034C87BAC0</span><br><span class="line">Amd64VtoP: Virt fffff8034c87bac0, pagedir 00000000001ad000</span><br><span class="line">Amd64VtoP: PML4E 00000000001adf80</span><br><span class="line">Amd64VtoP: PDPE 0000000000e08068</span><br><span class="line">Amd64VtoP: PDE 0000000000e09320</span><br><span class="line">Amd64VtoP: PTE 0000000000e153d8</span><br><span class="line">Amd64VtoP: Mapped phys 0000000002e70ac0</span><br><span class="line">Virtual address fffff8034c87bac0 translates to physical address 2e70ac0.</span><br></pre></td></tr></table></figure><p>即使DirectoryTableBase是当前进程隔离的内核页表的cr3.</p><p>KernelDirectoryTableBase的值与DirectoryTableBase不相同，是system的cr3.</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">kd&gt; !process 0 0</span><br><span class="line">**** NT ACTIVE PROCESS DUMP ****</span><br><span class="line">PROCESS ffffd68e9ba8a380</span><br><span class="line">    SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000</span><br><span class="line">    DirBase: 001ad002  ObjectTable: ffff950630204b00  HandleCount: 2013.</span><br><span class="line">    Image: System</span><br></pre></td></tr></table></figure><h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>根据另一个例子验证后，本进程的r3的cr3和r0的cr3都存储在KPROCESS结构里。DirectoryTableBase的cr3值拥有访问内核的权限。</p><p>而prcb中的KernelDirectoryTableBase是系统中某进程的r0的cr3。</p><p>猜测与如何进入内核的方式有关。</p><h3 id="分析KiBreakpointTrapShadow"><a href="#分析KiBreakpointTrapShadow" class="headerlink" title="分析KiBreakpointTrapShadow"></a>分析KiBreakpointTrapShadow</h3><p>int 3中断是从用户层到内核层，参考意义较大。</p><p>开启KPTI后，默认使用KiBreakpointTrapShadow，进行cr3切换和内核栈切换。</p><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210809020259989.png" alt></p><p>win10中使用切换栈到_KPCR.IdtBase+4200h，使用这个内存空间<strong>暂时</strong>保存（中转）这些寄存器的值，然后切换栈之后，内核线程再读取这些数值后存储。</p><p>而不像xp时直接压在当前的栈上进行存储。</p><h2 id="CFG"><a href="#CFG" class="headerlink" title="CFG"></a>CFG</h2><h3 id="guard-dispatch-icall"><a href="#guard-dispatch-icall" class="headerlink" title="_guard_dispatch_icall"></a>_guard_dispatch_icall</h3><p>如果正常执行可以看作为<code>call rax</code>.</p><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210809175847152.png" alt="image-20210809175847152"></p><p><img src="/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210809175823839.png" alt="image-20210809175823839"></p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;SMAP-SMEP&quot;&gt;&lt;a href=&quot;#SMAP-SMEP&quot; class=&quot;headerlink&quot; title=&quot;SMAP_SMEP&quot;&gt;&lt;/a&gt;SMAP_SMEP&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1nJ411T7R6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.bilibili.com/video/BV1nJ411T7R6&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果通过Windbg手工构造21号中断，在win10内是无法正常执行的，关掉SMEP可以执行。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210803174805935.png&quot; alt=&quot;image-20210803174805935&quot;&gt;&lt;/p&gt;
&lt;p&gt;这涉及到了SMAP，SMEP。Cr4中的标志位如下。（白皮书 2.5 CONTROL REGISTERS）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2021-08-09_SMAP_SMEP_PAGING_KPTI_CFG/image-20210803174914683.png&quot; alt=&quot;image-20210803174914683&quot;&gt;&lt;/p&gt;
&lt;p&gt;SMAP，SMEP 白皮书 4.6  ACCESS RIGHTS&lt;/p&gt;
&lt;p&gt;CR4.SMEP = 1, 不能执行任何用户模式的指令&lt;/p&gt;
&lt;p&gt;CR4.SMAP = 1， CR0.WP = 1,EFLAGS.AC = 0 或者隐式访问，不能向用户模式的地址写入任何数据。使用汇编指令&lt;code&gt;stac&lt;/code&gt;（1F 01 CB),将EFLAG标志位AC置为1，暂时关闭SAMP保护。&lt;/p&gt;
    
    </summary>
    
      <category term="windows内核" scheme="http://blog.imjalen.top/categories/windows%E5%86%85%E6%A0%B8/"/>
    
    
      <category term="内核机制" scheme="http://blog.imjalen.top/tags/%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6/"/>
    
      <category term="分页" scheme="http://blog.imjalen.top/tags/%E5%88%86%E9%A1%B5/"/>
    
      <category term="KPTI" scheme="http://blog.imjalen.top/tags/KPTI/"/>
    
  </entry>
  
  <entry>
    <title>IA-32e模式笔记</title>
    <link href="http://blog.imjalen.top/2021/07/27/2021-07-27-IA32e%E6%A8%A1%E5%BC%8F%E7%AC%94%E8%AE%B0/"/>
    <id>http://blog.imjalen.top/2021/07/27/2021-07-27-IA32e模式笔记/</id>
    <published>2021-07-26T16:00:00.000Z</published>
    <updated>2021-01-06T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><a href="https://space.bilibili.com/37877654/channel/detail?cid=89742&amp;ctype=0" target="_blank" rel="noopener">https://space.bilibili.com/37877654/channel/detail?cid=89742&amp;ctype=0</a></p><p>IA-32e模式:内核64位,用户64或32位<br>强制平坦段,不支持任务切换<br>Legacy模式:内核32位,用户32位<br>支持非平坦段,任务切换,虚拟8086,实模式等</p><a id="more"></a><p>用户模式地址的范围：0x00000000`00000000~0x0000FFFF`FFFFFFFF；</p><p>内核模式地址的范围：0xFFFF0000`00000000~0xFFFFFFFF`FFFFFFFF。</p><blockquote><p><a href="https://wiki.osdev.org/CPU_Registers_x86-64#MSRs" target="_blank" rel="noopener">https://wiki.osdev.org/CPU_Registers_x86-64#MSRs</a></p></blockquote><p>IA32_EFER MSR 0xC0000080H</p><table><thead><tr><th style="text-align:center">Bit(s)</th><th style="text-align:center">Label</th><th style="text-align:center">Description</th></tr></thead><tbody><tr><td style="text-align:center">0</td><td style="text-align:center">SCE</td><td style="text-align:center">System Call Extensions</td></tr><tr><td style="text-align:center">1-7</td><td style="text-align:center">0</td><td style="text-align:center">Reserved</td></tr><tr><td style="text-align:center">8</td><td style="text-align:center">LME</td><td style="text-align:center">Long Mode Enable //IA32e mode</td></tr><tr><td style="text-align:center">10</td><td style="text-align:center">LMA</td><td style="text-align:center">Long Mode Active</td></tr><tr><td style="text-align:center">11</td><td style="text-align:center">NXE</td><td style="text-align:center">No-Execute Enable</td></tr><tr><td style="text-align:center">12</td><td style="text-align:center">SVME</td><td style="text-align:center">Secure Virtual Machine Enable</td></tr><tr><td style="text-align:center">13</td><td style="text-align:center">LMSLE</td><td style="text-align:center">Long Mode Segment Limit Enable</td></tr><tr><td style="text-align:center">14</td><td style="text-align:center">FFXSR</td><td style="text-align:center">Fast FXSAVE/FXRSTOR</td></tr><tr><td style="text-align:center">15</td><td style="text-align:center">TCE</td><td style="text-align:center">Translation Cache Extension</td></tr><tr><td style="text-align:center">16-63</td><td style="text-align:center">0</td><td style="text-align:center">Reserved</td></tr></tbody></table><h2 id="MSR"><a href="#MSR" class="headerlink" title="MSR"></a>MSR</h2><table><thead><tr><th>MSR</th><th>INDEX</th><th>Description</th></tr></thead><tbody><tr><td>IA32_FS_BASE</td><td>0xC0000100H</td><td></td></tr><tr><td>IA32_GS_BASE</td><td>0xC0000101</td><td></td></tr><tr><td>IA32_KERNEL_GS_BASE</td><td>0xC0000102</td><td></td></tr><tr><td>IA32_STAR</td><td>0xC0000081</td><td>Ring 0 and Ring 3 Segments + SYSCALL EIP:<br>00-31 = SYSCALL EIP<br>32-47 = kernel segment base<br>48-63 = user segment base.</td></tr><tr><td>IA32_LSTAR</td><td>0xC0000082</td><td>64位系统调用函数，KiSystemCall64，KiSystemCall64Shadow.</td></tr><tr><td>IA32_CSTAR</td><td>0xC0000083</td><td>The kernel’s RIP for SYSCALL in compatibility mode.32bit兼容模式的系统调用函数。</td></tr><tr><td>IA32_FMASK</td><td>0xC0000084</td><td>The low 32 bits are the SYSCALL flag mask. If a bit in this is set, the corresponding bit in EFLAGS is cleared.</td></tr></tbody></table><h2 id="段描述符"><a href="#段描述符" class="headerlink" title="段描述符"></a>段描述符</h2><p>5.2.1 Code-Segment Descriptor in 64-bit Mode 段描述符</p><p>由L位决定是否是64位寻址。</p><ol><li>当L为0时，D为0是16位寻址。D为1是32位寻址</li><li>当L为1时,D只能为0，使用64位寻址。尝试使用D的位置则会产生General Protection Exception (#GP)。</li></ol><p>Type的第一位，0为data段，1为code段。四位一起看就是小于0n8就是data段，大于7就是code段。</p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210918155523741.png" alt="image-20210918155523741"></p><p>64位系统中使用强制平坦模式，段描述符有32位的0环，3环code段和数据段，有64位的code段，没有64bit的数据段。(GDT 全局描述符表)</p><p>数据段描述符，代码段描述符使用64位描述符。</p><h2 id="TSS段"><a href="#TSS段" class="headerlink" title="TSS段"></a>TSS段</h2><p>TSS段扩展到128位。</p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210723181527784.png" alt="image-20210723181527784"></p><p>找到TSS</p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210723182115958.png" alt="image-20210723182115958"></p><p>TSS存放rsp栈指针和中断栈表（IST）的指针。</p><p>默认使用第一个rsp栈指针。</p><p>IDT_Gate_Descriptors（6.8）中的IST标志位决定使用的IST索引。标志位为0，使用rsp0。</p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210723182706160.png" alt="image-20210723182706160"></p><p>64位IDT</p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210723184908214.png" alt="image-20210723184908214"></p><h2 id="32位段选择子"><a href="#32位段选择子" class="headerlink" title="32位段选择子"></a>32位段选择子</h2><p>32位段选择子寻址参考：<a href="https://zhuanlan.zhihu.com/p/36875677" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/36875677</a></p><p>段选择子，64位fs，gs并没有扩展，但仍然Fs:[0],gs:[0]在3环指向TEB，0环指向KPCR。通过rdmsr读取IA32_GS_BASE 0xC0000101H，指向KPCR。</p><p>通过<code>swapgs</code>汇编指令进行gs赋值，将当前 GS 基址寄存器（0xC0000101H）值与MSR地址IA32_KERNEL_GS_BASE (C0000102H )中包含的值交换。</p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210723192300088.png" alt="image-20210723192300088"></p><h2 id="权限提升（进入内核）-："><a href="#权限提升（进入内核）-：" class="headerlink" title="权限提升（进入内核） ："></a>权限提升（进入内核） ：</h2><p>中断：  中断指令后，查找IDT表，根据IDT表进行跳转，保存cs,ss,esp,eflag,eip，关中断，保存信息，切换到内核栈（esp，ss由TSS提供），cs。开中断，访问中断处理例程。只有一张IDT表， 64位中，通过栈保存的cs判断先前模式。</p><blockquote><p><a href="https://blog.csdn.net/qq_38474570/article/details/103652993" target="_blank" rel="noopener">https://blog.csdn.net/qq_38474570/article/details/103652993</a></p></blockquote><h2 id="系统调用"><a href="#系统调用" class="headerlink" title="系统调用"></a>系统调用</h2><p>只有一张SSDT表。</p><p>xp使用int2e进入中断。</p><p>之后的32位系统使用sysenter和sysexit。</p><p>64位使用syscall和sysexit。x86在ring3（ntddll.dll)中切换到x64内核模式（参数等东西放到64位栈里），再进入内核。</p><h2 id="32位程序如何翻译到64位"><a href="#32位程序如何翻译到64位" class="headerlink" title="32位程序如何翻译到64位"></a>32位程序如何翻译到64位</h2><p>结论：依赖ntdll.dll通过修改cs寄存器，从0x23h切换到0x33h。0x23h</p><p>0x23指向第四个GDT，0x33h指向第六个GDT。</p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210726174247316.png" alt="image-20210726174247316"></p><p>实例</p><p>所有的32位Nt函数都会调用<code>Wow64Transition</code></p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210726174355897.png" alt="image-20210726174355897"></p><p>然后通过jmp far段间跳转，切换cs为0x33，执行后续的x64汇编指令，进行跳转。</p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210726174943120.png" alt="image-20210726174943120"></p><p>同时支持x32和x64的汇编，使用windbg内核调试器。</p><h2 id="syscall-解析"><a href="#syscall-解析" class="headerlink" title="syscall 解析"></a>syscall 解析</h2><p>白皮书 4.3 Instructions SYSCALL-Fast System Call</p><ol><li>通过<code>IA32_LSTAR</code>读取系统调用的函数地址,例如KiSystemCall64或者KiSystemCall64Shadow等的地址。</li><li>syscall的下一条指令保存到RCX，</li><li>保存RFLAGS到R11，</li><li>IA32_FMASK MSR寄存器值屏蔽RFLAGS的值，处理器根据IA32_FMASK 屏蔽RFLAGS的值</li><li>CS和SS选择子从IA32_STAR[47:32]（0xC0000081H）读取。</li><li>指令不保存RSP,rsp由IDT中IST决定，默认rsp0；</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">CS.Selector := IA32_STAR[47:32] AND FFFCH (* Operating system provides CS; RPL forced to 0 *)</span><br><span class="line"></span><br><span class="line">SS.Selector := IA32_STAR[47:32] + 8; (* SS just above CS *)</span><br></pre></td></tr></table></figure><p>以x32debug.exe为例</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">kd&gt; !process <span class="number">0</span> <span class="number">0</span> x32dbg.exe</span><br><span class="line">PROCESS ffffdf0f661e30c0</span><br><span class="line">    SessionId: <span class="number">1</span>  Cid: <span class="number">0870</span>    Peb: <span class="number">00e7</span>f000  ParentCid: <span class="number">03b</span>c</span><br><span class="line">    DirBase: <span class="number">5</span>d633002  ObjectTable: ffffce83988e91c0  HandleCount: <span class="number">319.</span></span><br><span class="line">    Image: x32dbg.exe</span><br><span class="line"></span><br><span class="line">kd&gt; .process /i ffffdf0f661e30c0</span><br><span class="line"><span class="function">You need to <span class="keyword">continue</span> <span class="title">execution</span> <span class="params">(press <span class="string">'g'</span> &lt;enter&gt;)</span> <span class="keyword">for</span> the context</span></span><br><span class="line">to be switched. When the debugger breaks in again, you will be in</span><br><span class="line">the <span class="keyword">new</span> process context.</span><br><span class="line"></span><br><span class="line">kd&gt; bp <span class="number">77</span>a06000</span><br></pre></td></tr></table></figure><p>断下来之后，调试到<code>syscall</code>指令上。</p><p>需要关注cs,ss,rsp,rcx,r11,rflags和IA32_FMASK ，IA32_STAR；</p><table><thead><tr><th>cs</th><th>0x33 已经切换到64位</th></tr></thead><tbody><tr><td>ss</td><td>0x2b</td></tr><tr><td>rsp</td><td>0x000000000335eb18</td></tr><tr><td>rcx</td><td>0x0000000000000006</td></tr><tr><td>r11</td><td>0x000000000345fb90</td></tr><tr><td>rflags</td><td><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210726195013376.png" alt="image-20210726195013376"></td></tr><tr><td>IA32_FMASK</td><td>00000000`00004700</td></tr><tr><td>IA32_LSTAR</td><td>fffff800`25d4f140</td></tr><tr><td>IA32_STAR</td><td>00230010`00000000</td></tr></tbody></table><p>IA32_LSTAR地址为 <code>nt!KiSystemCall64Shadow</code>.</p><p><code>kd&gt; bp   nt!KiSystemCall64Shadow+0x2d</code>  </p><p>红框部分在进行内核栈切换，不能设置断点，否则蓝屏。</p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210726200902068.png" alt="image-20210726200902068"></p><p>断点设置参考： <a href="https://www.cnblogs.com/DreamoneOnly/p/12779106.html" target="_blank" rel="noopener">https://www.cnblogs.com/DreamoneOnly/p/12779106.html</a></p><table><thead><tr><th>cs</th><th>0x0010 0环code段</th></tr></thead><tbody><tr><td>ss</td><td>0x18 0环data段</td></tr><tr><td>rsp</td><td>0xffffad8d3d1eac90</td></tr><tr><td>rcx</td><td>0x0000000077a01cbc</td></tr><tr><td>r11</td><td>0x0000000000000246</td></tr><tr><td>rflags</td><td><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210726195233789.png" alt="image-20210726195233789"></td></tr><tr><td>IA32_FMASK</td><td>00000000`00004700</td></tr><tr><td>IA32_LSTAR</td><td>fffff800`25d4f140</td></tr></tbody></table><h4 id="混淆，反调试思路"><a href="#混淆，反调试思路" class="headerlink" title="混淆，反调试思路"></a>混淆，反调试思路</h4><p><a href="https://github.com/aW3ikun/x96_POC" target="_blank" rel="noopener">代码参考</a></p><p>32位插入64位汇编，因为x86代码自动屏蔽通用寄存器(R0～R14)。win10_1903,21H1可正常运行。</p><p>通过32位汇编指令执行<code>jmp far 33:address</code>跳转到x64汇编,该address使用x64汇编<code>go_write()</code>编写，使用r12寄存器存数值。然后<code>go_read()</code>从r12取数值到内存地址中，x86代码读取地址。</p><p>实现数据保护和一定的反调试。</p><h2 id="32位程序调用64位函数解析"><a href="#32位程序调用64位函数解析" class="headerlink" title="32位程序调用64位函数解析"></a>32位程序调用64位函数解析</h2><p>64位系统在加载32位程序的时候，也会加载64位的DLL。</p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210802170609633.png" alt="image-20210802170609633"></p><blockquote><p><a href="https://bbs.pediy.com/thread-221236.htm" target="_blank" rel="noopener">https://bbs.pediy.com/thread-221236.htm</a></p><p>從 32 位元地獄一路打回天堂聖地（上）深度逆向工程 WOW64 設計 <a href="https://blog.30cm.tw/2021/06/32-wow64.html" target="_blank" rel="noopener">https://blog.30cm.tw/2021/06/32-wow64.html</a></p></blockquote><h3 id="具体解析流程"><a href="#具体解析流程" class="headerlink" title="具体解析流程"></a>具体解析流程</h3><p>调试使用x32dbg.exe,打断点会直接使用NtOpenProcess，方便调试。</p><p>windbg进入32位程序，断点到找到的NtOpenProcess地址，<code>.reload</code>.会发现32位的ntdll在符号中的名字位wntdll。</p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210802172315777.png" alt="image-20210802172315777"></p><p>然后进入<code>ntdll_779e0000!Wow64SystemServiceCall (77a68c50)</code>.在跳转到<code>ntdll_779e0000!Wow64Transition (77b01228)</code></p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210802172418844.png" alt="image-20210802172418844"></p><p>然后<code>jmp     0033:779D6009</code></p><p>解析成64位汇编<code>jmp     qword ptr [r15+0F8h] {wow64cpu!CpupReturnFromSimulatedCode (00000000^779d1742)}</code>,进入到wow64cpu.dll中</p><p>调用<code>wow64!Wow64SystemServiceEx</code>,通过调用号查询 sdwhnt32JumpTable调用表的第26号。</p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210802193218863.png" alt="image-20210802193218863"></p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210802193634217.png" alt="image-20210802193634217"></p><p>调用<code>whNtOpenProcess</code>调用<code>NtOpenProcess</code>。</p><p>最后的调用栈如下:</p><p><img src="/assets/blog/2021-07-27-IA-32eNote/image-20210802184314738.png" alt="image-20210802184314738"></p><blockquote><p><a href="https://zh.wikipedia.org/wiki/WoW64" target="_blank" rel="noopener">https://zh.wikipedia.org/wiki/WoW64</a></p><p><code>Wow64.dll</code>，通往<a href="https://zh.wikipedia.org/wiki/Windows_NT体系结构" target="_blank" rel="noopener">Windows NT内核</a>的核心接口，它转换32位与64位调用，包括<a href="https://zh.wikipedia.org/wiki/指標_(電腦科學" target="_blank" rel="noopener">指针</a>)和<a href="https://zh.wikipedia.org/wiki/调用栈" target="_blank" rel="noopener">调用栈</a>操作。</p><p><code>Wow64win.dll</code>，为32位应用程序提供适当的入口点。</p><p><code>Wow64cpu.dll</code>，负责解决进程从32位切换到64位模式。</p></blockquote><p>RunSimulatedCode:</p><p>r11 保存rsp+4，参数地址</p><p>r12指向TEB（gs:[30h]</p><p>r13 指向TEB+1488h，指向_WOW64_CONTEXT </p><p>r14 保存rsp</p><p>r15 保存wow64cpu!TurboThunkDispatch 的地址</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;a href=&quot;https://space.bilibili.com/37877654/channel/detail?cid=89742&amp;amp;ctype=0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://space.bilibili.com/37877654/channel/detail?cid=89742&amp;amp;ctype=0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;IA-32e模式:内核64位,用户64或32位&lt;br&gt;强制平坦段,不支持任务切换&lt;br&gt;Legacy模式:内核32位,用户32位&lt;br&gt;支持非平坦段,任务切换,虚拟8086,实模式等&lt;/p&gt;
    
    </summary>
    
      <category term="windows内核" scheme="http://blog.imjalen.top/categories/windows%E5%86%85%E6%A0%B8/"/>
    
    
      <category term="IA-32e" scheme="http://blog.imjalen.top/tags/IA-32e/"/>
    
  </entry>
  
  <entry>
    <title>如何分析X64的SEH</title>
    <link href="http://blog.imjalen.top/2021/07/25/2021-07-25-%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90x64_SEH/"/>
    <id>http://blog.imjalen.top/2021/07/25/2021-07-25-如何分析x64_SEH/</id>
    <published>2021-07-24T16:00:00.000Z</published>
    <updated>2021-07-24T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="如何分析X64的SEH"><a href="#如何分析X64的SEH" class="headerlink" title="如何分析X64的SEH"></a>如何分析X64的SEH</h1><p>文章首发于安全客</p><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><p><a href="https://www.pediy.com/kssd/pediy12/142371.html" target="_blank" rel="noopener">https://www.pediy.com/kssd/pediy12/142371.html</a></p><p><a href="https://www.bilibili.com/video/BV1tJ411M7kd" target="_blank" rel="noopener">https://www.bilibili.com/video/BV1tJ411M7kd</a></p><p>微软文档 查询 <a href="https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-160" target="_blank" rel="noopener">https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-160</a></p><p>感谢周壑老师和boxcounter。</p><h2 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h2><p>VS2019</p><p>idapro7.5</p><h2 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h2><p>在PE+的结构中，异常处理的信息存储在ExceptionDirectory中，且每个字段都是3*4=12字节。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">RUNTIME_FUNCTION</span> &#123;</span></span><br><span class="line">    ULONG BeginAddress;</span><br><span class="line">    ULONG EndAddress;</span><br><span class="line">    ULONG UnwindData;</span><br><span class="line">&#125; RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;</span><br></pre></td></tr></table></figure><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210718223404873.png" alt="image-20210718223404873"></p><p>了解SEH的习惯，x64 SEH 不基于栈，不发生异常和通常执行没有区别（效率高），每个非叶函数至少对应一个 RUNTIME FUCNTION结构体叶函数如果使用了SEH, 也会对应 RUNTIME FUCNTION结构体。</p><blockquote><p>既不调用函数、又没有修改栈指针，也没有使用 SEH 的函数就叫做“叶函数”。</p></blockquote><a id="more"></a><h2 id="代码演示"><a href="#代码演示" class="headerlink" title="代码演示"></a>代码演示</h2><p>使用代码</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;Windows.h&gt;</span></span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">filter</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"filter\n"</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">exc</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> x = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> y = x / x;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">__try &#123;</span><br><span class="line">__try &#123;</span><br><span class="line">exc();</span><br><span class="line">&#125;</span><br><span class="line">__finally &#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"111\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">__except (filter()) &#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"222\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line">system(<span class="string">"pause"</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>通过除零异常，进行异常处理流程的学习。根据执行结果可看到，在exc()异常（EXCEPT_POINT ）后，首先执行filter函数（EXCEPT_FILTER ），然后执行finally函数（FINALLY_HANDLER ），再执行except中的异常处理函数（EXCEPT_HANDLER ）。 这是基础的执行流程。</p><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210718222509347.png" alt="image-20210718222509347"></p><p>然后在IDA中进行分析，找到main函数的引用，指向pdata段的一个RUNTIME_FUNCTION结构体，RUNTIME_FUNCTION里面存储的地址都是基于BaseAddress的32位RVA。依次是BeginAddress 就是函数开始地址，EndAddress也就是结束的地址，UnwindData是指向_UNWIND_INFO的地址。这个结构体表明了该异常处理的范围和异常处理回滚（unwind）所需要的信息。</p><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210718225857604.png" alt="image-20210718225857604"></p><p>_UNWIND_INFO是用来记录一个函数上堆栈指针的操作，以及非易失性寄存器保存在堆栈上的位置。（除了rcx，rdx，r8,r9,r10,r11为易失寄存器，其他都是非易失寄存器，使用前push进行保存，使用后pop进行恢复）。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="keyword">enum</span> _UNWIND_OP_CODES &#123;</span><br><span class="line">    UWOP_PUSH_NONVOL = <span class="number">0</span>, <span class="comment">/* info == register number */</span></span><br><span class="line">    UWOP_ALLOC_LARGE,     <span class="comment">/* no info, alloc size in next 2 slots */</span></span><br><span class="line">    UWOP_ALLOC_SMALL,     <span class="comment">/* info == size of allocation / 8 - 1 */</span></span><br><span class="line">    UWOP_SET_FPREG,       <span class="comment">/* no info, FP = RSP + UNWIND_INFO.FPRegOffset*16 */</span></span><br><span class="line">    UWOP_SAVE_NONVOL,     <span class="comment">/* info == register number, offset in next slot */</span></span><br><span class="line">    UWOP_SAVE_NONVOL_FAR, <span class="comment">/* info == register number, offset in next 2 slots */</span></span><br><span class="line">    UWOP_SAVE_XMM128 = <span class="number">8</span>, <span class="comment">/* info == XMM reg number, offset in next slot */</span></span><br><span class="line">    UWOP_SAVE_XMM128_FAR, <span class="comment">/* info == XMM reg number, offset in next 2 slots */</span></span><br><span class="line">    UWOP_PUSH_MACHFRAME   <span class="comment">/* info == 0: no error-code, 1: error-code */</span></span><br><span class="line">&#125; UNWIND_CODE_OPS;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">union</span> _UNWIND_CODE &#123;</span><br><span class="line">    <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">        UBYTE CodeOffset;</span><br><span class="line">        UBYTE UnwindOp : <span class="number">4</span>;</span><br><span class="line">        UBYTE OpInfo   : <span class="number">4</span>;</span><br><span class="line">    &#125;;</span><br><span class="line">    USHORT FrameOffset;</span><br><span class="line">&#125; UNWIND_CODE, *PUNWIND_CODE;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> UNW_FLAG_NHANDLER 0x0</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> UNW_FLAG_EHANDLER  0x01</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> UNW_FLAG_UHANDLER  0x02</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> UNW_FLAG_CHAININFO 0x04</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">UNWIND_INFO</span> &#123;</span></span><br><span class="line">    UBYTE Version       : <span class="number">3</span>;</span><br><span class="line">    UBYTE Flags         : <span class="number">5</span>;</span><br><span class="line">    UBYTE SizeOfProlog;</span><br><span class="line">    UBYTE CountOfCodes;</span><br><span class="line">    UBYTE FrameRegister : <span class="number">4</span>;</span><br><span class="line">    UBYTE FrameOffset   : <span class="number">4</span>;</span><br><span class="line">    UNWIND_CODE UnwindCode[<span class="number">1</span>];</span><br><span class="line"><span class="comment">/*  UNWIND_CODE MoreUnwindCode[((CountOfCodes + 1) &amp; ~1) - 1];</span></span><br><span class="line"><span class="comment">*   union &#123;</span></span><br><span class="line"><span class="comment">*       OPTIONAL ULONG ExceptionHandler;</span></span><br><span class="line"><span class="comment">*       OPTIONAL ULONG FunctionEntry;</span></span><br><span class="line"><span class="comment">*   &#125;;</span></span><br><span class="line"><span class="comment">*   OPTIONAL ULONG ExceptionData[]; */</span></span><br><span class="line">&#125; UNWIND_INFO, *PUNWIND_INFO;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">SCOPE_TABLE</span> &#123;</span></span><br><span class="line">    ULONG Count;</span><br><span class="line">    <span class="class"><span class="keyword">struct</span></span></span><br><span class="line"><span class="class">    &#123;</span></span><br><span class="line">        ULONG BeginAddress;</span><br><span class="line">        ULONG EndAddress;</span><br><span class="line">        ULONG HandlerAddress;</span><br><span class="line">        ULONG JumpTarget;</span><br><span class="line">    &#125; ScopeRecord[<span class="number">1</span>];</span><br><span class="line">&#125; SCOPE_TABLE, *PSCOPE_TABLE;</span><br></pre></td></tr></table></figure><h2 id="手把手解析-UNWIND-INFO结构体"><a href="#手把手解析-UNWIND-INFO结构体" class="headerlink" title="手把手解析_UNWIND_INFO结构体"></a>手把手解析_UNWIND_INFO结构体</h2><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210718231025668.png" alt="image-20210718231025668"></p><p>结构体后面的冒号表示使用多少位，例如 Version+Flags一共使用8位，也就是1字节。</p><h3 id="第0行"><a href="#第0行" class="headerlink" title="第0行"></a>第0行</h3><p>代表着结构数据有Version + Flags，SizeOfProlog，CountOfCodes,FrameRegister+FrameOffset。</p><h4 id="Version-Flags"><a href="#Version-Flags" class="headerlink" title="Version + Flags"></a>Version + Flags</h4><p>0x19h = 0y00010011 </p><p>Version= 0y011 = 3</p><p>Flags = 0y00010 = 2</p><p>根据数值找到对应的flag。</p><p><code>UNW_FLAG_NHANDLER 0x0</code> 不对异常进行处理</p><p><code>UNW_FLAG_EHANDLER  0x01</code> 使用Except函数进行处理。</p><p><code>UNW_FLAG_UHANDLER  0x02</code> 使用finally函数处理。</p><p><code>UNW_FLAG_CHAININFO 0x04</code> 使用调用链。</p><h3 id="SizeOfProlog"><a href="#SizeOfProlog" class="headerlink" title="SizeOfProlog"></a>SizeOfProlog</h3><p>函数头的大小。比较产生异常的相对函数头的大小与该值，判断回滚操作。函数头大小为6字节。</p><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210718234317253.png" alt="image-20210718234317253"></p><p>如果大于该值，则两个UNWIND_CODE都执行。如果小于该值，则通过UNWIND_CODE的CodeOffset进一步判断。CodeOffset小于相对数值则会进行该UNWIND_CODE的回滚。</p><h4 id="CountOfCodes"><a href="#CountOfCodes" class="headerlink" title="CountOfCodes"></a>CountOfCodes</h4><p>下面UWIND_CODE的数量。2个。</p><h4 id="FrameRegister-FrameOffset"><a href="#FrameRegister-FrameOffset" class="headerlink" title="FrameRegister+FrameOffset"></a>FrameRegister+FrameOffset</h4><p>根据FP进行相关操作。</p><h3 id="第一行"><a href="#第一行" class="headerlink" title="第一行"></a>第一行</h3><h4 id="UNWIND-CODE"><a href="#UNWIND-CODE" class="headerlink" title="UNWIND_CODE"></a>UNWIND_CODE</h4><p>UWIND_CODE用于记录函数头中有关非易失性寄存器和RSP的操作。</p><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210718234715029.png" alt="image-20210718234715029"></p><p>解析第一个，&lt;6,32h&gt;.</p><p>在距离便宜头部6字节及以内的地方异常，都会执行该操作。</p><p>32h = 0y00100011</p><p>UnwindOp = 2 //UWOP_ALLOC_SMALL</p><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210718235007207.png" alt="image-20210718235007207" style="zoom:50%;"></p><p>OpInfo = 3</p><p>所以创建了3*8+8 = 0n32= 0x24 所以记录了创建栈空间0x24字节，回滚时则需要释放32字节空间。</p><p>然而IDA已经标注了OPCODE，所以能很方便的进行判断。</p><p>第二个则是记录了压入 RDI。</p><p>0x70 = 0y01110000</p><p>UnwindOp = 0y0000 = 0n0</p><p>OpInfo = 0y0111 = 0n7</p><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210718235331062.png" alt="image-20210718235331062" style="zoom: 33%;"></p><h3 id="第三行"><a href="#第三行" class="headerlink" title="第三行"></a>第三行</h3><p>_C_specific_handler_0 是一个导入函数，是进行异常处理分发的，可以不用分析。</p><h3 id="第四行"><a href="#第四行" class="headerlink" title="第四行"></a>第四行</h3><p>第四行解析_SCOPE_TABLE结构体。</p><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210719000655703.png" alt="image-20210719000655703"></p><p>有2组ScopeRecord。</p><p>引用boxcounter：</p><blockquote><ul><li>Count 表示 ScopeRecord 数组的大小。</li><li>ScopeRecord 等同于 x86 中的 scopetable_entry 成员。其中，</li><li>BeginAddress 和 EndAddress 表示某个 __try 保护域的范围。</li><li>HandlerAddress 和 JumpTarget 表示 EXCEPTION_FILTER、EXCEPT_HANDLER 和 FINALLY_HANDLER。具体对应情况为：<ul><li>对于 <strong>try/</strong>except 组合，HandlerAddress 代表 EXCEPT_FILTER，JumpTarget 代表 EXCEPT_HANDLER。</li><li>对于 <strong>try/</strong>finally 组合，HandlerAddress 代表 FINALLY_HANDLER，JumpTarget 等于 0。</li></ul></li></ul><p>​    这四个域通常都是 RVA，但当 EXCEPT_FILTER 简单地返回或等于 EXCEPTION_EXECUTE_HANDLER 时，HandlerAddress 可能直接等于 EXCEPTION_EXECUTE_HANDLER，而不再是一个 RVA。</p></blockquote><p>所以第一排指向Finally函数。<img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210719000758944.png" alt="image-20210719000758944"></p><p>第二排指向filter和Except函数。</p><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210719000904677.png" alt="image-20210719000904677"></p><p>这时候看注释就明白很多。</p><h3 id="当Flags为UNW-FLAG-CHAININFO"><a href="#当Flags为UNW-FLAG-CHAININFO" class="headerlink" title="当Flags为UNW_FLAG_CHAININFO"></a>当Flags为UNW_FLAG_CHAININFO</h3><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210719001145299.png" alt="image-20210719001145299"></p><p>0x21 = 0y00100001</p><p>Flags = 0y00100=4,会看到末尾指向了一个_RUNTIME_FUNCTION，形成了链式结构，继续进行回滚判断。类似子函数对引用母函数的回滚。</p><h2 id="进行异常回滚模拟"><a href="#进行异常回滚模拟" class="headerlink" title="进行异常回滚模拟"></a>进行异常回滚模拟</h2><p>如果是在exc()函数中异常,首先查看自身函数的 RUNTIME_FUNCTION,找到UNWIND_INFO,进行回滚判断并操作。<img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210719002121853.png" alt="image-20210719002121853"></p><ol><li>恢复栈空间0x10字节 add rsp,0x10h</li><li>pop rdi</li></ol><p>然后根据栈查看调用者，再查看RUNTIME_FUNCTION找到UNWIND_INFO。这里也就是main的UNWIND_INFO。判断FLAGS为，00010为2，UNW_FLAG_UHANDLER  。</p><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210719002257700.png" alt="image-20210719002257700"></p><p>由于调用exc()函数实在六字节外，所以进行回滚。</p><ol start="3"><li>add rsp,0x20h</li><li>pop rdi</li></ol><p>然后交给__C_specific_handler_0，_</p><p>判断异常相对于_SCOPE_TABLE字段的位置，都在内部。则两个都要执行。</p><p>由于第一个是JmpTarget是0，所以是finally，在此处进行记录。直到找到filter接管后，再执行。</p><p>然后第二个SCOPE_TABLE：</p><ol start="5"><li>执行EXCEPT_FILTER</li><li>FINALLY_HANDLER</li><li>EXCEPT_HANDLER</li><li>顺序执行到system(“pause”)<img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210719013528922.png" alt="image-20210719013528922"></li></ol><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>分析好后，就能更好地去理解IDA的注释了，读懂注释了。</p><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210719122907141.png" alt="image-20210719122907141"></p><h2 id="异常处理函数反向查找引用函数"><a href="#异常处理函数反向查找引用函数" class="headerlink" title="异常处理函数反向查找引用函数"></a>异常处理函数反向查找引用函数</h2><p>通过最后的引用的RVA，进行搜索，最终定位到C_SCOPE_TABLE，找到UWIND_INFO结构体，然后找到其引用RUNTIME_FUNCTION,定位到调用者函数。</p><p>以filter为例,定位到调用者，假设看不到其引用。我们进行搜索。</p><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210719014232203.png" alt="image-20210719014232203"></p><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210719014541922.png" alt="image-20210719014541922"></p><p>定位到疑似结构体。</p><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210719014631453.png" alt="image-20210719014631453"></p><p>然后就能找到引用该异常处理的函数部分。</p><p><img src="/assets/blog/2021-07-25-如何分析x64_SEH/image-20210719014730073.png" alt="image-20210719014730073"></p><h3 id="万一有用？"><a href="#万一有用？" class="headerlink" title="万一有用？"></a>万一有用？</h3><p>文档中获取特定信息的宏。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">#define GetUnwindCodeEntry(info, index) \</span><br><span class="line">    ((info)-&gt;UnwindCode[index])</span><br><span class="line"></span><br><span class="line">#define GetLanguageSpecificDataPtr(info) \</span><br><span class="line">    ((PVOID)&amp;GetUnwindCodeEntry((info),((info)-&gt;CountOfCodes + 1) &amp; ~1))</span><br><span class="line"></span><br><span class="line">#define GetExceptionHandler(base, info) \</span><br><span class="line">    ((PEXCEPTION_HANDLER)((base) + *(PULONG)GetLanguageSpecificDataPtr(info)))</span><br><span class="line"></span><br><span class="line">#define GetChainedFunctionEntry(base, info) \</span><br><span class="line">    ((PRUNTIME_FUNCTION)((base) + *(PULONG)GetLanguageSpecificDataPtr(info)))</span><br><span class="line"></span><br><span class="line">#define GetExceptionDataPtr(info) \</span><br><span class="line">    ((PVOID)((PULONG)GetLanguageSpecificData(info) + 1)</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;如何分析X64的SEH&quot;&gt;&lt;a href=&quot;#如何分析X64的SEH&quot; class=&quot;headerlink&quot; title=&quot;如何分析X64的SEH&quot;&gt;&lt;/a&gt;如何分析X64的SEH&lt;/h1&gt;&lt;p&gt;文章首发于安全客&lt;/p&gt;
&lt;h2 id=&quot;参考链接&quot;&gt;&lt;a href=&quot;#参考链接&quot; class=&quot;headerlink&quot; title=&quot;参考链接&quot;&gt;&lt;/a&gt;参考链接&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://www.pediy.com/kssd/pediy12/142371.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.pediy.com/kssd/pediy12/142371.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1tJ411M7kd&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.bilibili.com/video/BV1tJ411M7kd&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;微软文档 查询 &lt;a href=&quot;https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-160&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-160&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;感谢周壑老师和boxcounter。&lt;/p&gt;
&lt;h2 id=&quot;环境&quot;&gt;&lt;a href=&quot;#环境&quot; class=&quot;headerlink&quot; title=&quot;环境&quot;&gt;&lt;/a&gt;环境&lt;/h2&gt;&lt;p&gt;VS2019&lt;/p&gt;
&lt;p&gt;idapro7.5&lt;/p&gt;
&lt;h2 id=&quot;正文&quot;&gt;&lt;a href=&quot;#正文&quot; class=&quot;headerlink&quot; title=&quot;正文&quot;&gt;&lt;/a&gt;正文&lt;/h2&gt;&lt;p&gt;在PE+的结构中，异常处理的信息存储在ExceptionDirectory中，且每个字段都是3*4=12字节。&lt;/p&gt;
&lt;figure class=&quot;highlight c&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;typedef&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;struct&lt;/span&gt; _&lt;span class=&quot;title&quot;&gt;RUNTIME_FUNCTION&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    ULONG BeginAddress;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    ULONG EndAddress;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    ULONG UnwindData;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125; RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2021-07-25-如何分析x64_SEH/image-20210718223404873.png&quot; alt=&quot;image-20210718223404873&quot;&gt;&lt;/p&gt;
&lt;p&gt;了解SEH的习惯，x64 SEH 不基于栈，不发生异常和通常执行没有区别（效率高），每个非叶函数至少对应一个 RUNTIME FUCNTION结构体叶函数如果使用了SEH, 也会对应 RUNTIME FUCNTION结构体。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;既不调用函数、又没有修改栈指针，也没有使用 SEH 的函数就叫做“叶函数”。&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="windows内核" scheme="http://blog.imjalen.top/categories/windows%E5%86%85%E6%A0%B8/"/>
    
    
      <category term="异常处理" scheme="http://blog.imjalen.top/tags/%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>解析Excel 4.0宏教程</title>
    <link href="http://blog.imjalen.top/2021/03/17/2021-03-17-21Excel%204.0%E5%AE%8F%E8%A7%A3%E6%9E%90/"/>
    <id>http://blog.imjalen.top/2021/03/17/2021-03-17-21Excel 4.0宏解析/</id>
    <published>2021-03-16T16:00:00.000Z</published>
    <updated>2021-03-16T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="解析Excel-4-0宏教程"><a href="#解析Excel-4-0宏教程" class="headerlink" title="解析Excel 4.0宏教程"></a>解析Excel 4.0宏教程</h1><p>此次挑战<a href="https://cyberdefenders.org/labs/55" target="_blank" rel="noopener">题目</a>来自大佬分享.同时很巧也看到了出题方的推特.动手分析Excel4.0宏,下载后续的payload并分析,进行答题.</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image1.png" alt="image-20210223031920401" style="zoom:25%;"></p><p>界面如下:</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image2.png" alt="image-20210224015550535"></p><p>解题顺序如下:下载样本-&gt;查看参考资料-&gt;安装需要的工具-&gt;答题.</p><p>根据Questions的问题发展思维分析样本.</p><h2 id="分析环境"><a href="#分析环境" class="headerlink" title="分析环境"></a>分析环境</h2><p>Windows 10</p><p>Windows Terminal </p><p>office 2007</p><p>Powershell 7.0.2</p><p>（REMnux是一个针对恶意软件分析师的工具包Linux系统，笔者懒惰，没去折腾）</p><h2 id="工具准备"><a href="#工具准备" class="headerlink" title="工具准备"></a>工具准备</h2><p>Excel4.0的宏很容易理解，都是常见关键词。FORMULA里面是一些需要执行的东西。</p><h3 id="XLMDeobfuscator"><a href="#XLMDeobfuscator" class="headerlink" title="XLMDeobfuscator"></a>XLMDeobfuscator</h3><p>去混淆.</p><p><a href="https://github.com/DissectMalware/XLMMacroDeobfuscator" target="_blank" rel="noopener">项目地址</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">py -3 -m pip install XLMMacroDeobfuscator</span><br><span class="line">py -3 -m pip install pywin32</span><br><span class="line">py -3 -m pip install -U https://github.com/DissectMalware/xlrd2/archive/master.zip</span><br><span class="line">py -3 -m pip install -U https://github.com/DissectMalware/pyxlsb2/archive/master.zip</span><br><span class="line">py -3 -m pip install -U https://github.com/DissectMalware/XLMMacroDeobfuscator/archive/master.zip</span><br></pre></td></tr></table></figure><p>命令行运行<code>xlmdeobfuscator.exe -h</code>,能正常输出图标则表示安装成功.</p><h3 id="OLEDUMP"><a href="#OLEDUMP" class="headerlink" title="OLEDUMP"></a>OLEDUMP</h3><p>ole工具集</p><p><a href="https://blog.didierstevens.com/programs/oledump-py/" target="_blank" rel="noopener">项目介绍</a></p><p><a href="http://didierstevens.com/files/software/oledump_V0_0_59.zip" target="_blank" rel="noopener">下载地址</a></p><p>下载zip后解压到合适的文件夹中,进行代码patch.修复excel中的sheet显示不完全的bug.(不知道是否patch得当,只是满足目前需求)</p><ul><li>1319行<code>return P23Decode(data[1:1 + cch])</code>修改为<code>return P23Decode(data[2:1 + cch + 1])</code>,注意推进.    </li></ul><h3 id="msoffcrypto-crack-py"><a href="#msoffcrypto-crack-py" class="headerlink" title="msoffcrypto-crack.py"></a>msoffcrypto-crack.py</h3><p>密码爆破工具</p><p><a href="https://blog.didierstevens.com/2020/03/31/update-msoffcrypto-crack-py-version-0-0-5/" target="_blank" rel="noopener">项目介绍</a></p><p><a href="http://didierstevens.com/files/software/msoffcrypto-crack_V0_0_5.zip" target="_blank" rel="noopener">下载地址</a></p><p>建议放在oledump文件夹中。</p><a id="more"></a><p>## </p><h2 id="解题"><a href="#解题" class="headerlink" title="解题"></a>解题</h2><h2 id="Sample1"><a href="#Sample1" class="headerlink" title="Sample1"></a>Sample1</h2><h3 id="Question-1"><a href="#Question-1" class="headerlink" title="Question 1"></a>Question 1</h3><p>文档解压密码是多少？</p><p>最开始思路是去考虑这个密码难道是vba密码？直接使用AOPR（<a href="https://www.elcomsoft.com/aopr.html" target="_blank" rel="noopener"><br>Advanced Office Password Recovery</a>）进行密码破解，后发现文不对题。</p><p>使用提到的工具进行文件解析。运行</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 当前地址为oledump文件夹中</span></span><br><span class="line"></span><br><span class="line"><span class="variable">$sample1</span> =  D:\malware\sample1-f—b5ed444ddc37d748639f624397cff2a.bin</span><br><span class="line">py -<span class="number">3</span> .\oledump.py --plugins=plugin_biff <span class="variable">$sample1</span></span><br></pre></td></tr></table></figure><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image3.png" alt="image-20210225023843591" style="zoom:50%;"></p><p>脚本标识出了该文件被密码保护。</p><p>使用二号工具，命令行运行<code>xlmdeobfuscator.exe -f $sample1</code>.”-f”参数意为filepath，指向文件地址。</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image4.png" alt="image-20210225025856798"></p><p>该工具解析结果也显示是加密文件，需加上<code>--password</code>参数进行解密。</p><p>难道这下就没有答案了吗？不然，最后在<a href="https://blog.didierstevens.com/programs/oledump-py/" target="_blank" rel="noopener">oledump.py</a>页面上搜索“password”关键词找到了解答方法。<img src="/assets/blog/2021-03-17-Excel4.0宏解析/image5.png" alt="image-20210225030544432"></p><p>使用<code>msoffcrypto-crack.py</code>进行爆破，该工具已经在上方放出了下载地址。运行<code>py -3 .\msoffcrypto-crack.py $sample1</code>,得到输出“Password found: VelvetSweatshop”，VelvetSweatshop即为密码也是该题答案。</p><p>通过搜索可得知VelvetSweatshop为默认密码，加密excel文件首先会使用该密码解密自身，如果无法解密则会让用户输入密码。</p><h3 id="Question-2"><a href="#Question-2" class="headerlink" title="Question 2"></a>Question 2</h3><p>对plugin_biff使用什么参数解析所有关于Excel4.0的宏？</p><p>同样在oledump的页面中搜索Excel 4.0，得到<a href="https://blog.didierstevens.com/2019/03/15/maldoc-excel-4-0-macro/" target="_blank" rel="noopener">博客地址</a></p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image6.png" alt="image-20210226183019824"></p><p>得到答案<code>x</code></p><h3 id="Question-3"><a href="#Question-3" class="headerlink" title="Question 3"></a>Question 3</h3><p>列出工作表的名字，顺序按照plugin_biff的输出。</p><p>所以根据二题可以参考plugin_biff和-x参数的输出。</p><p>由于plugin_biff是需要未加密的excel文件，所以我们首先要进行解密。</p><p>通过在页面中搜寻得到<a href="https://isc.sans.edu/forums/diary/Password+Protected+Malicious+Excel+Files/25990/" target="_blank" rel="noopener">答案</a>,通过<code>msoffcrypto-crack.py</code>和oledump进行联合解析，但是在笔者本机上出现了一些问题。最后参考爆破脚本使用<code>msoffcrypto-tool</code>进行解密。脚本如下</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!python3</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> msoffcrypto</span><br><span class="line"></span><br><span class="line">encrypted = open(<span class="string">"D:\\malware\\sample1-fb5ed444ddc37d748639f624397cff2a.bin"</span>, <span class="string">"rb"</span>)</span><br><span class="line">file = msoffcrypto.OfficeFile(encrypted)</span><br><span class="line"></span><br><span class="line">file.load_key(password=<span class="string">"VelvetSweatshop"</span>)  <span class="comment"># Use password</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">"D:\\malware\\sample1.new"</span>, <span class="string">"wb"</span>) <span class="keyword">as</span> f:</span><br><span class="line">    file.decrypt(f)</span><br><span class="line"></span><br><span class="line">encrypted.close()</span><br></pre></td></tr></table></figure><p>pwsh更新$sample1,<code>$sample1=&quot;D:\\malware\\sample1.new&quot;</code></p><p><code>py -3 .\oledump.py -p VelvetSweatshop --plugins=plugin_biff --pluginoptions &quot;-x&quot; $sample1</code></p><p>修复后的脚本输出如下：</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image7.png" alt="image-20210226185238330"></p><p>答案为<code>SOCWNEScLLxkLhtJp,OHqYbvYcqmWjJJjsF,Macro2,Macro3,Macro4,Macro5</code></p><h3 id="Question-4"><a href="#Question-4" class="headerlink" title="Question 4"></a>Question 4</h3><p>该恶意程序下载的url是多少。</p><p>通过三题，执行<code>py -3 .\oledump.py -p VelvetSweatshop --plugins=plugin_biff --pluginoptions &quot;-x&quot; $sample1 &gt;&gt; 1.txt</code></p><p>使用vscode打开1.txt，c语言高亮。可看到如下字段，179行和182行，可估计调用urlmon中的函数执行下载。</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image8.png" alt="image-20210226190040229"></p><p>答案为<code>http://rilaer.com</code></p><h3 id="Question-5"><a href="#Question-5" class="headerlink" title="Question 5"></a>Question 5</h3><p>下载的是什么恶意软件家族？</p><p>我们可以使用virustotal进行查询。</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image9.png" alt="image-20210226190747303"></p><p>最终如下所示，微软和卡巴都显示为Dridex家族。<img src="/assets/blog/2021-03-17-Excel4.0宏解析/image10.png" alt="image-20210226190904974"></p><p>答案即为Dridex</p><h2 id="Sample2"><a href="#Sample2" class="headerlink" title="Sample2"></a>Sample2</h2><p>执行<code>$sample2 = &quot;D:\malware\sample2-b5d469a07709b5ca6fee934b1e5e8e38.bin&quot;</code></p><p>尝试在虚拟机中打开恶意样本，运行宏后一片空白。</p><h3 id="Question-6"><a href="#Question-6" class="headerlink" title="Question 6"></a>Question 6</h3><p>这个文档的表单属性为very hidden的名字是什么</p><p>按照常理先用xlmdeobfuscator跑一下，<code>xlmdeobfuscator.exe -f $sample2  &gt;&gt; sample2.txt</code>,虽然输出报错了，但应该能使用一部分。打开txt文件。没有显示hidden的工作表。但也没有被加密。</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image11.png" alt="image-20210228013545003"></p><p><code>py -3 .\oledump.py -p VelvetSweatshop --plugins=plugin_biff --pluginoptions &quot;-x&quot; $sample2 &gt;&gt; .\sample2_ole.txt</code>,打开txt，</p><p>显然易见，有了答案：CSHykdYHvi。</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image12.png" alt="image-20210228021606347"></p><p>vba中运行下列代码，即可显示隐藏的sheet。指名点姓的显示sheet。</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/img22.png" alt="image-20210228030121632"></p><figure class="highlight vb"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Sub</span> UnhideAllSheets()</span><br><span class="line">    Sheets(<span class="string">"CSHykdYHvi"</span>).Visible = xlSheetVisible</span><br><span class="line"><span class="keyword">End</span> <span class="keyword">Sub</span></span><br></pre></td></tr></table></figure><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image13.png" alt="image-20210228024114092"></p><h3 id="Question-7"><a href="#Question-7" class="headerlink" title="Question 7"></a>Question 7</h3><p>使用reg.exe检查注册表哪个键值？</p><p>查询可知GET.WORKSPACE(2)是查询Excel版本，打开注册表，没什么东西。<img src="/assets/blog/2021-03-17-Excel4.0宏解析/image14.png" alt="image-20210228020607192">可能是解析问题。换个工具试试。打开sample2_ole.txt，搜索”reg.exe”</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image15.png" alt="image-20210228014923824"></p><p>如上方图所示出现了”VBAWarnings”=dword:00000002,</p><p>试一下,即为正确答案。这里思考一下，去检查VBAWarnings干什么呢？</p><h3 id="Question-8"><a href="#Question-8" class="headerlink" title="Question 8"></a>Question 8</h3><p>使用reg.exe,通过访问的键值为多少能识别为沙箱环境？</p><p>根据前一题，是否是相关的呢？搜索<code>VBAWarnings indicates a sandbox environment</code>,从<a href="https://securitynews.sonicwall.com/xmlpost/improvements-in-malicious-excel-files-distributing-zloader/" target="_blank" rel="noopener">这</a>可以得知沙箱通常将VBAWARINGS的值设为1，不禁止宏运行，但是一般正常人会为2，禁用宏。<img src="/assets/blog/2021-03-17-Excel4.0宏解析/image16.png" alt="image-20210228020848056"></p><p>所以当值为1的时候会认为是沙箱环境。</p><p>答案为1，001不行，0x1可以。</p><h3 id="Question-9"><a href="#Question-9" class="headerlink" title="Question 9"></a>Question 9</h3><p>本文档执行几个额外的反分析检查。它使用了什么Excel 4宏函数？</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image17.png" alt="image-20210228021028702"></p><p>从上到下是：</p><p>检查工作区的宽度，长度，是否存在鼠标以及计算机是否能够播放声音，GET.WORKSPACE（1）检查运行Microsoft Excel的环境。</p><p>使用了GET.WORKSPACE函数。</p><h3 id="Question-10"><a href="#Question-10" class="headerlink" title="Question 10"></a>Question 10</h3><p>此文档检查运行Excel的环境的名称，比较了什么值？</p><p>当然是Windows。</p><h3 id="Question-11"><a href="#Question-11" class="headerlink" title="Question 11"></a>Question 11</h3><p>下载的payload的格式。</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/img18.png" alt="image-20210228023220727"></p><p>图中可知使用URLDownadToFileA函数下载文件保存为html后缀文件。</p><p>同样使用virustotal，查询网址https[:]//ethelenecrace.xyz/fbb3,没有文件下载信息<img src="/assets/blog/2021-03-17-Excel4.0宏解析/img19.png" alt="img19.png" style="zoom:50%;"></p><p>使用alienvault查询网址得到了HASH和文件格式。<img src="/assets/blog/2021-03-17-Excel4.0宏解析/img20.png" alt="image-20210228025643440"></p><p>文件格式为dll</p><h3 id="Question-12"><a href="#Question-12" class="headerlink" title="Question 12"></a>Question 12</h3><p>恶意软件从哪个URL下载有效载荷</p><p>当然是<code>https://ethelenecrace.xyz/fbb3</code></p><h3 id="Question-13"><a href="#Question-13" class="headerlink" title="Question 13"></a>Question 13</h3><p>载荷被保存的文件名是什么?</p><p>答案为bmjn5ef.html</p><h3 id="Question-14"><a href="#Question-14" class="headerlink" title="Question 14"></a>Question 14</h3><p>有效载荷是如何执行的?</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/img21.png" style="zoom:25%;"></p><p>从sample2.txt中可知使用ShellExecuteA运行rundll32执行dll的导出函数。</p><p>答案为rundll32.exe</p><h3 id="Question-15"><a href="#Question-15" class="headerlink" title="Question 15"></a>Question 15</h3><p>归属于哪个恶意软件家族？</p><p>从alienvault得到hash，上vt查询。MD5：62cb6a2a517351472698f669a845f91c</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/img23.png" alt="image-20210228030341103"></p><p>答案为zloader。</p><p>仅仅是根据题目来进行分析，对该样本的excel4.0的执行流程没有进行仔细分析。</p><h1 id="实战操作分析"><a href="#实战操作分析" class="headerlink" title="实战操作分析"></a>实战操作分析</h1><p>此次样本使用的是<a href="https://x.threatbook.cn/nodev4/vb4/article?threatInfoID=3224" target="_blank" rel="noopener">微步报告</a>中的Excel4.0宏样本。</p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image-20210226151655206.png" alt="image-20210226151655206"><a href="https://s.threatbook.cn/report/file/8bd23bbab513e03ea1eb2adae09f56b08c53cacd2a3e8134ded5ef8a741a12a5/?sign=history&amp;env=win7_sp1_enx86_office2013" target="_blank" rel="noopener">样本下载</a></p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image-20210226152328244.png" alt="image-20210226152328244"></p><p>首先我们使用xlmdeobfuscator（v0.1.7)进行解析，发现是未加密文件，<del>但是工具加载失败，暂时没修复</del>。修复了一小部分，不足以使用.<img src="/assets/blog/2021-03-17-Excel4.0宏解析/image-20210228012337483.png" alt="image-20210228012337483"></p><p>再使用oledump+plugin_biff 插件进行解析，<code>py -3 .\oledump.py -p plugin_biff --pluginoptions &quot;-x&quot; D:\malware\ecaaab9e2fc089eefb6accae9750ac60.bin</code></p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image-20210228030753047.png" alt="image-20210228030753047"></p><p>从输出可以看到拥有三个表格，sheet15，sheet1，shee2，只有sheet2处于可见的状态。然后虚拟机打开表格，启用宏。</p><p>会发现下方的表格名字从sheet1变为sheet2，展现诱饵文档。通过两种方法，可以显现隐藏的工作表</p><ol><li><p>VBA</p><p>使用alt+F11在任意VBA项目中运行下方代码，即可显示所有工作表。且适用于very hide.</p><figure class="highlight vb"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Sub</span> UnhideAllSheets()</span><br><span class="line">    <span class="keyword">Dim</span> wks <span class="keyword">As</span> Worksheet</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">For</span> <span class="keyword">Each</span> wks <span class="keyword">In</span> ActiveWorkbook.Worksheets</span><br><span class="line">        wks.Visible = xlSheetVisible</span><br><span class="line">    <span class="keyword">Next</span> wks</span><br><span class="line"><span class="keyword">End</span> <span class="keyword">Sub</span></span><br></pre></td></tr></table></figure></li></ol><ol start="2"><li>右键下方工作表，点击取消隐藏，选择取消隐藏的工作表。只适用于hidden。<img src="/assets/blog/2021-03-17-Excel4.0宏解析/image-20210226154339097.png" alt="image-20210226154339097"><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image-20210226154421758.png" alt="image-20210226154421758"></li></ol><p>在sheet15中搜索oledump出现的字符串，如“GET.WORKSPACE”<img src="/assets/blog/2021-03-17-Excel4.0宏解析/image-20210226154806626.png" alt="image-20210226154806626"></p><p>发现字符在Z列，且被隐藏无法编辑。发现是实现了工作表保护，需要输入密码。而<code>msoffcrypto-crack.py</code>只能暴力破解加密文件，无法取得工作表保护密码。<img src="/assets/blog/2021-03-17-Excel4.0宏解析/image-20210226155055263.png" alt="image-20210226155055263"></p><p>最后在同一作者的<a href="https://blog.didierstevens.com/2021/02/12/quickpost-oledump-py-plugin_biff-py-remove-sheet-protection-from-spreadsheets/" target="_blank" rel="noopener">blog</a>找到。通过更改密码保护的flag值取消密码保护。具体操作如下：</p><p><code>py -3 .\oledump.py -p plugin_biff --pluginoptions &quot;-o protect -a&quot; D:\malware\ecaaab9e2fc089eefb6accae9750ac60.bin</code></p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/image-20210228012625667.png" alt="image-20210228012625667"></p><p>值为小端序（01 00）即为0x1,表示启用了保护，通过16进制编辑器将这些0x1的值修改为0x0。第四行为密码计算后的hash值。</p><p><code>py -3 .\oledump.py -p plugin_biff --pluginoptions &quot;-o protect -R&quot; D:\malware\ecaaab9e2fc089eefb6accae9750ac60.bin</code></p><p><img src="/assets/blog/2021-03-17-Excel4.0宏解析/img32.png" alt="image-20210226161907496"></p><p>搜索红框中的值，将flag的值置为0，保存文件，正常打开就可以取消保护工作表了。<img src="/assets/blog/2021-03-17-Excel4.0宏解析/img31.png" alt="image-20210226162332424"></p><p>后续分析详情看上方的报告即可，笔者就不再赘述了。</p><h1 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h1><p><a href="https://www.sneakymonkey.net/2020/06/22/excel-4-0-macros-so-hot-right-now/" target="_blank" rel="noopener">https://www.sneakymonkey.net/2020/06/22/excel-4-0-macros-so-hot-right-now/</a></p><p><a href="https://github.com/nolze/msoffcrypto-tool" target="_blank" rel="noopener">https://github.com/nolze/msoffcrypto-tool</a></p><p><a href="https://0xevilc0de.com/excel-4-macros-get-workspace-reference/" target="_blank" rel="noopener">https://0xevilc0de.com/excel-4-macros-get-workspace-reference/</a></p><p><a href="https://clickallthethings.wordpress.com/2020/04/06/covid-19-excel-4-0-macros-and-sandbox-detection/" target="_blank" rel="noopener">https://clickallthethings.wordpress.com/2020/04/06/covid-19-excel-4-0-macros-and-sandbox-detection/</a></p><p><a href="https://securitynews.sonicwall.com/xmlpost/improvements-in-malicious-excel-files-distributing-zloader/" target="_blank" rel="noopener">https://securitynews.sonicwall.com/xmlpost/improvements-in-malicious-excel-files-distributing-zloader/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;解析Excel-4-0宏教程&quot;&gt;&lt;a href=&quot;#解析Excel-4-0宏教程&quot; class=&quot;headerlink&quot; title=&quot;解析Excel 4.0宏教程&quot;&gt;&lt;/a&gt;解析Excel 4.0宏教程&lt;/h1&gt;&lt;p&gt;此次挑战&lt;a href=&quot;https://cyberdefenders.org/labs/55&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目&lt;/a&gt;来自大佬分享.同时很巧也看到了出题方的推特.动手分析Excel4.0宏,下载后续的payload并分析,进行答题.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2021-03-17-Excel4.0宏解析/image1.png&quot; alt=&quot;image-20210223031920401&quot; style=&quot;zoom:25%;&quot;&gt;&lt;/p&gt;
&lt;p&gt;界面如下:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2021-03-17-Excel4.0宏解析/image2.png&quot; alt=&quot;image-20210224015550535&quot;&gt;&lt;/p&gt;
&lt;p&gt;解题顺序如下:下载样本-&amp;gt;查看参考资料-&amp;gt;安装需要的工具-&amp;gt;答题.&lt;/p&gt;
&lt;p&gt;根据Questions的问题发展思维分析样本.&lt;/p&gt;
&lt;h2 id=&quot;分析环境&quot;&gt;&lt;a href=&quot;#分析环境&quot; class=&quot;headerlink&quot; title=&quot;分析环境&quot;&gt;&lt;/a&gt;分析环境&lt;/h2&gt;&lt;p&gt;Windows 10&lt;/p&gt;
&lt;p&gt;Windows Terminal &lt;/p&gt;
&lt;p&gt;office 2007&lt;/p&gt;
&lt;p&gt;Powershell 7.0.2&lt;/p&gt;
&lt;p&gt;（REMnux是一个针对恶意软件分析师的工具包Linux系统，笔者懒惰，没去折腾）&lt;/p&gt;
&lt;h2 id=&quot;工具准备&quot;&gt;&lt;a href=&quot;#工具准备&quot; class=&quot;headerlink&quot; title=&quot;工具准备&quot;&gt;&lt;/a&gt;工具准备&lt;/h2&gt;&lt;p&gt;Excel4.0的宏很容易理解，都是常见关键词。FORMULA里面是一些需要执行的东西。&lt;/p&gt;
&lt;h3 id=&quot;XLMDeobfuscator&quot;&gt;&lt;a href=&quot;#XLMDeobfuscator&quot; class=&quot;headerlink&quot; title=&quot;XLMDeobfuscator&quot;&gt;&lt;/a&gt;XLMDeobfuscator&lt;/h3&gt;&lt;p&gt;去混淆.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/DissectMalware/XLMMacroDeobfuscator&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;项目地址&lt;/a&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;py -3 -m pip install XLMMacroDeobfuscator&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;py -3 -m pip install pywin32&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;py -3 -m pip install -U https://github.com/DissectMalware/xlrd2/archive/master.zip&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;py -3 -m pip install -U https://github.com/DissectMalware/pyxlsb2/archive/master.zip&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;py -3 -m pip install -U https://github.com/DissectMalware/XLMMacroDeobfuscator/archive/master.zip&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;命令行运行&lt;code&gt;xlmdeobfuscator.exe -h&lt;/code&gt;,能正常输出图标则表示安装成功.&lt;/p&gt;
&lt;h3 id=&quot;OLEDUMP&quot;&gt;&lt;a href=&quot;#OLEDUMP&quot; class=&quot;headerlink&quot; title=&quot;OLEDUMP&quot;&gt;&lt;/a&gt;OLEDUMP&lt;/h3&gt;&lt;p&gt;ole工具集&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.didierstevens.com/programs/oledump-py/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;项目介绍&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://didierstevens.com/files/software/oledump_V0_0_59.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;下载地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载zip后解压到合适的文件夹中,进行代码patch.修复excel中的sheet显示不完全的bug.(不知道是否patch得当,只是满足目前需求)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1319行&lt;code&gt;return P23Decode(data[1:1 + cch])&lt;/code&gt;修改为&lt;code&gt;return P23Decode(data[2:1 + cch + 1])&lt;/code&gt;,注意推进.    &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;msoffcrypto-crack-py&quot;&gt;&lt;a href=&quot;#msoffcrypto-crack-py&quot; class=&quot;headerlink&quot; title=&quot;msoffcrypto-crack.py&quot;&gt;&lt;/a&gt;msoffcrypto-crack.py&lt;/h3&gt;&lt;p&gt;密码爆破工具&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.didierstevens.com/2020/03/31/update-msoffcrypto-crack-py-version-0-0-5/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;项目介绍&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://didierstevens.com/files/software/msoffcrypto-crack_V0_0_5.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;下载地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;建议放在oledump文件夹中。&lt;/p&gt;
    
    </summary>
    
      <category term="样本分析" scheme="http://blog.imjalen.top/categories/%E6%A0%B7%E6%9C%AC%E5%88%86%E6%9E%90/"/>
    
    
      <category term="木马" scheme="http://blog.imjalen.top/tags/%E6%9C%A8%E9%A9%AC/"/>
    
  </entry>
  
  <entry>
    <title>T-pot搭建</title>
    <link href="http://blog.imjalen.top/2021/01/07/2021-01-07-T-pot%E6%90%AD%E5%BB%BA/"/>
    <id>http://blog.imjalen.top/2021/01/07/2021-01-07-T-pot搭建/</id>
    <published>2021-01-06T16:00:00.000Z</published>
    <updated>2021-01-06T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="起因"><a href="#起因" class="headerlink" title="起因"></a>起因</h2><p>最近心血来潮,花了10美刀,vultr送30天的50美刀.<br>最开始想着弄一套HiFish集群,发现无法捕获恶意样本,遂放弃了. (使用<code>iptables -L</code>和<code>iptbles -F</code> 查看和清除规则,centos系统)<br>后面发现T-pot全能,就顺势学着搭建一波.</p><a id="more"></a><h2 id="操作"><a href="#操作" class="headerlink" title="操作"></a>操作</h2><ol><li><p>安装Debain10,x64. T-bot基于Debain10打包的.选择内存8g的系统,4g内存会卡死.</p></li><li><p>ssh连接.</p></li><li><p>查看iptables,有规则则清除.</p></li><li><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install git</span><br><span class="line">git <span class="built_in">clone</span> https://github.com/telekom-security/tpotce</span><br><span class="line"><span class="built_in">cd</span> tpotce/iso/installer/</span><br><span class="line">./install.sh --<span class="built_in">type</span>=user</span><br></pre></td></tr></table></figure></li><li><p><code>dps.sh</code>,查看服务是否正常,不正常则去排除问题.</p></li><li><p>因为没有使用iso安装,则会没有tsec账号,手动添加.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">adduser tsec</span><br><span class="line">nano /etc/sudoers</span><br><span class="line"></span><br><span class="line"><span class="string">"tsec    ALL=(ALL:ALL) ALL"</span></span><br></pre></td></tr></table></figure><p><img src="/assets/blog/2021-01-07-T-pot搭建/image-20210107231356631.png" alt="image-20210107231356631"></p></li><li><p>登入<code>https://ip:64294/</code>,打上勾.输入tsec和密码.登陆检查权限,查看是否可以访问dokcer服务.</p><p><img src="/assets/blog/2021-01-07-T-pot搭建/image-20210107231751658.png" alt="image-20210107231751658"></p><p><img src="/assets/blog/2021-01-07-T-pot搭建/image-20210107231829898.png" alt="image-20210107231829898"></p></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;起因&quot;&gt;&lt;a href=&quot;#起因&quot; class=&quot;headerlink&quot; title=&quot;起因&quot;&gt;&lt;/a&gt;起因&lt;/h2&gt;&lt;p&gt;最近心血来潮,花了10美刀,vultr送30天的50美刀.&lt;br&gt;最开始想着弄一套HiFish集群,发现无法捕获恶意样本,遂放弃了. (使用&lt;code&gt;iptables -L&lt;/code&gt;和&lt;code&gt;iptbles -F&lt;/code&gt; 查看和清除规则,centos系统)&lt;br&gt;后面发现T-pot全能,就顺势学着搭建一波.&lt;/p&gt;
    
    </summary>
    
      <category term="工具" scheme="http://blog.imjalen.top/categories/%E5%B7%A5%E5%85%B7/"/>
    
    
      <category term="蜜罐" scheme="http://blog.imjalen.top/tags/%E8%9C%9C%E7%BD%90/"/>
    
  </entry>
  
  <entry>
    <title>某黑产攻击分析与简单关联</title>
    <link href="http://blog.imjalen.top/2020/03/23/2020-03-23%20-%20%E6%9F%90%E9%BB%91%E4%BA%A7%E6%94%BB%E5%87%BB%E5%88%86%E6%9E%90%E4%B8%8E%E7%AE%80%E5%8D%95%E5%85%B3%E8%81%94/"/>
    <id>http://blog.imjalen.top/2020/03/23/2020-03-23 - 某黑产攻击分析与简单关联/</id>
    <published>2020-03-22T16:00:00.000Z</published>
    <updated>2020-03-22T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="0x01-样本信息"><a href="#0x01-样本信息" class="headerlink" title="0x01 样本信息"></a>0x01 样本信息</h1><table><thead><tr><th>样本名称</th><th>MT CONVOY  T. KARUNIA 2  V.2006N &amp; V.2006N1.docx</th></tr></thead><tbody><tr><td>样本大小</td><td>11,760 字节</td></tr><tr><td>MD5</td><td>ca69a722a82dcd5bd57ffe805c502f82</td></tr><tr><td>SHA-1</td><td>4ba9d6060409b091e1b817f433cdc0097bb219f1</td></tr><tr><td>木马家族</td><td>Lokibot</td></tr><tr><td>VT上传时间</td><td>2020-03-23 05:48:06 UTC</td></tr></tbody></table><p>样本地址: <a href="https://github.com/Xuwei98/malware-analysis-idb/tree/master/Trojan/Lokibot/2020-03-23" target="_blank" rel="noopener">link</a></p><a id="more"></a><h1 id="0x02-分析环境"><a href="#0x02-分析环境" class="headerlink" title="0x02 分析环境"></a>0x02 分析环境</h1><ul><li>win10 x64 pro</li><li>VMware Workstaion 15</li></ul><h1 id="0x03-分析"><a href="#0x03-分析" class="headerlink" title="0x03 分析"></a>0x03 分析</h1><h2 id="Word文件分析"><a href="#Word文件分析" class="headerlink" title="Word文件分析"></a>Word文件分析</h2><p>使用模板注入下载文件,设置文件位于<code>\word\_rels\webSetting.xml.rels</code></p><p><img src="https://i.loli.net/2020/03/23/mxdihEJKsDWTRyI.png" alt="image.png"></p><p><img src="https://i.loli.net/2020/03/23/w7CykVE8FxqTrmp.png" alt="image.png"></p><h2 id="invoice-22115-doc"><a href="#invoice-22115-doc" class="headerlink" title="invoice_22115.doc"></a>invoice_22115.doc</h2><table><thead><tr><th>样本名称</th><th>invoice_22115.doc</th></tr></thead><tbody><tr><td>MD5</td><td>61b211906dfd28d5bbe6724e50c3bb20</td></tr><tr><td>SHA-1</td><td>84354e4cbfc989c37c46f848622175e54f31eccf</td></tr><tr><td>利用漏洞</td><td>CVE-2017-11882</td></tr></tbody></table><p>使用<code>GlobalLock</code>锁定全局内存.避免shellcode消失.</p><p><img src="https://i.loli.net/2020/03/23/TsIaLu24YGV5ftQ.png" alt="image.png"></p><p>异或解密shellcode后,通过Ldr获取所需Dll.</p><p>使用<code>URLDownloadToFileW</code>从源地址进行文件并保存为<code>%appdata%\\vbc.exe</code>.<img src="https://i.loli.net/2020/03/23/KRDfx8FhlMHwULY.png" alt="image.png"></p><p><img src="https://i.loli.net/2020/03/23/3lSGrsUXafHkKZ7.png" alt="image.png"></p><p><code>ShellExecuteA</code>执行下载后的文件.</p><p><img src="https://i.loli.net/2020/03/23/TsIaLu24YGV5ftQ.png" alt="image.png"></p><h2 id="vbc-exe"><a href="#vbc-exe" class="headerlink" title="vbc.exe"></a>vbc.exe</h2><table><thead><tr><th>MD5</th><th>834300d014ae6e65201ce04d091219fc</th></tr></thead><tbody><tr><td>SHA-1</td><td>56af653938b12a12c4185ed71f221812c3fb4590</td></tr><tr><td>文件版本</td><td>1.7.9.1</td></tr><tr><td>原始文件名</td><td>Printstream Dropping.exe</td></tr><tr><td>家族</td><td>Lokibot</td></tr></tbody></table><p>该文件行为与常见的Lokibot木马存在一致性.</p><p>在%Appdata%中创建随机字符文件夹名和文件名,并拷贝.在RSA文件中创建文件收集基本信息.移除自身文件.</p><p><img src="https://i.loli.net/2020/03/23/fZ3CNk26LMsTVrA.png" alt="image.png"></p><p><img src="https://i.loli.net/2020/03/24/DJOENkGwev2rR14.png" alt="image.png"></p><p>注册表使用目的域名作为键,键值为目的文件地址.<img src="https://i.loli.net/2020/03/24/vHf5q2hC8jiXnZz.png" alt="image.png"></p><p>在流量特征中也存在ckav.ru特征关键字.<img src="https://i.loli.net/2020/03/23/IXHOPTRU7g8zr4u.png" alt="image.png"></p><p>此样本使用网上现有的基于aPACK算法的压缩器<a href="http://www.ibsensoftware.com/download.html" target="_blank" rel="noopener">aPLib</a>嵌入软件自身作为保护.<img src="https://i.loli.net/2020/03/24/Y9DAXJqjrOz6L7V.png" alt="image.png"></p><p>解压缩后,样本为常见的Lokibot木马.</p><p><img src="https://i.loli.net/2020/03/24/xajW5itDeK3pFRG.png" alt="image.png"></p><h1 id="0x04-IOC"><a href="#0x04-IOC" class="headerlink" title="0x04 IOC"></a>0x04 IOC</h1><p>SHA-1</p><p>84354e4cbfc989c37c46f848622175e54f31eccf</p><p>4ba9d6060409b091e1b817f433cdc0097bb219f1</p><p>56af653938b12a12c4185ed71f221812c3fb4590</p><p>ip:</p><p>103.99.2.42</p><p>23.95.132.48</p><p>url:</p><p>http[:]//tescohomegroseryandelectronicstday2store.duckdns.org/chnsfrnd2/regasm.exe</p><p>http[:]//23.95.132.48/~main/.isuoxiso/w.php/2sN0gEZTW0LpL</p><h1 id="0x05-关联分析"><a href="#0x05-关联分析" class="headerlink" title="0x05 关联分析"></a>0x05 关联分析</h1><p>漏洞样本从apprun中获取,且该样本来来自于黑产相关的钓鱼垃圾邮件中.<img src="https://i.loli.net/2020/03/23/SXUmksOh4paez38.png" alt="image.png"></p><p>通过VT的关联存在相关链接地址.且<code>invoice</code>文件一直在实时更新名字,黑产活动频繁.<img src="https://i.loli.net/2020/03/24/EcxGb6lszKOkywT.png" alt="image.png"></p><p>此ip也对应三个域名地址.</p><p><img src="https://i.loli.net/2020/03/24/PHUj4hCG2vkJBrt.png" alt="image.png"></p><p>而访问此ip时,该文件夹下只具有一个doc文件,另一个文件夹也只存在一个Lokibot文件.时间都在最近.</p><p><img src="https://i.loli.net/2020/03/24/lZw9gLQRt67GBeK.png" alt="image.png"></p><p><img src="https://i.loli.net/2020/03/24/FanlKJCR7VevP25.png" alt="image.png"></p><p>第二个ip也被微步标记为垃圾邮件</p><p><img src="https://i.loli.net/2020/03/24/13ebSLkpn2NMlij.png" alt="image.png"></p>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;0x01-样本信息&quot;&gt;&lt;a href=&quot;#0x01-样本信息&quot; class=&quot;headerlink&quot; title=&quot;0x01 样本信息&quot;&gt;&lt;/a&gt;0x01 样本信息&lt;/h1&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;样本名称&lt;/th&gt;
&lt;th&gt;MT CONVOY  T. KARUNIA 2  V.2006N &amp;amp; V.2006N1.docx&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;样本大小&lt;/td&gt;
&lt;td&gt;11,760 字节&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MD5&lt;/td&gt;
&lt;td&gt;ca69a722a82dcd5bd57ffe805c502f82&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHA-1&lt;/td&gt;
&lt;td&gt;4ba9d6060409b091e1b817f433cdc0097bb219f1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;木马家族&lt;/td&gt;
&lt;td&gt;Lokibot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VT上传时间&lt;/td&gt;
&lt;td&gt;2020-03-23 05:48:06 UTC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;样本地址: &lt;a href=&quot;https://github.com/Xuwei98/malware-analysis-idb/tree/master/Trojan/Lokibot/2020-03-23&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;link&lt;/a&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="样本分析" scheme="http://blog.imjalen.top/categories/%E6%A0%B7%E6%9C%AC%E5%88%86%E6%9E%90/"/>
    
    
      <category term="VC" scheme="http://blog.imjalen.top/tags/VC/"/>
    
      <category term="木马" scheme="http://blog.imjalen.top/tags/%E6%9C%A8%E9%A9%AC/"/>
    
  </entry>
  
  <entry>
    <title>Sodinokibi勒索病毒分析</title>
    <link href="http://blog.imjalen.top/2020/03/05/2020-03-05-Sodinokibi%E5%8B%92%E7%B4%A2%E7%97%85%E6%AF%92%E5%88%86%E6%9E%90/"/>
    <id>http://blog.imjalen.top/2020/03/05/2020-03-05-Sodinokibi勒索病毒分析/</id>
    <published>2020-03-04T16:00:00.000Z</published>
    <updated>2020-03-08T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="0x01-样本信息"><a href="#0x01-样本信息" class="headerlink" title="0x01 样本信息"></a>0x01 样本信息</h1><ul><li><p>样本名称: 2</p></li><li><p>样本大小:  280,579 字节</p></li><li><p>MD5:  7d88dfcfe457bdc715371dbeaa4a5ef7</p></li><li><p>SHA-1: f2f36ef9976259a55123250ecc78fda3487f8848</p></li><li><p>SHA-256:  8bf7a344480c29b572fcead838c863093a5c88ba21d51085b6fc6ec3d8e8fbac</p></li><li><p>家族: Sodinokibi</p></li><li><p>idb与样本地址:  <a href="https://github.com/Xuwei98/malware-analysis/tree/master/Ransomware/2020-03-05-pe-Sodinokibi勒索病毒" target="_blank" rel="noopener">github</a></p><a id="more"></a></li></ul><h1 id="0x02-分析环境"><a href="#0x02-分析环境" class="headerlink" title="0x02 分析环境"></a>0x02 分析环境</h1><ul><li>win10 x64 pro</li><li>VMware Workstaion 15</li></ul><h1 id="0x03-行为分析"><a href="#0x03-行为分析" class="headerlink" title="0x03 行为分析"></a>0x03 行为分析</h1><h2 id="行为一览"><a href="#行为一览" class="headerlink" title="行为一览:"></a>行为一览:</h2><p><img src="https://i.loli.net/2020/03/05/PZtpMNK9LVFXQer.png" alt="image.png"></p><h2 id="进程树"><a href="#进程树" class="headerlink" title="进程树"></a>进程树</h2><p>从中可以看到启动<code>vssadmin.exe</code>删除卷影备份,<code>bcedit.exe</code>自动回复和开机启动禁用<code>Windows</code>开机启动错误恢复模式.</p><p><img src="https://i.loli.net/2020/03/02/4VwKz6eRGqxtEYi.png" alt="image.png"></p><p><code>&quot;C:\Windows\System32\cmd.exe&quot; /c vssadmin.exe Delete Shadows /All /Quiet &amp; bcdedit /set {default} recoveryenabled No &amp; bcdedit /set {default} bootstatuspolicy ignoreallfailures</code></p><h2 id="勒索信"><a href="#勒索信" class="headerlink" title="勒索信"></a>勒索信</h2><p>通过上传勒索信到<a href="https://id-ransomware.malwarehunterteam.com/" target="_blank" rel="noopener">ID Randomware</a>,识别出<code>Sodinokibi</code>勒索病毒.</p><p><img src="https://i.loli.net/2020/03/02/bYXG5qVEhtUHw64.png" alt="image.png"></p><p><img src="https://i.loli.net/2020/03/02/eYGa9NSU5BQPcwK.png" alt="image.png"></p><p>每个文件夹下面都会释放一个<code>readme</code>文件.</p><p><img src="https://i.loli.net/2020/03/02/glFNaeArWM47opJ.png" alt="image.png"></p><h2 id="注册表操作"><a href="#注册表操作" class="headerlink" title="注册表操作"></a>注册表操作</h2><p>在注册表键<code>HKLM\\SOFTWARE\\WOWO6432Node\\recfg</code>注册键值.<code>0_key</code>,<code>pk_key</code>,<code>rnd_ext</code>,<code>sk_key</code>,<code>stat</code>.</p><p><img src="https://i.loli.net/2020/03/02/AwbJ8cgPxm4tTrC.png" alt="image.png"></p><p><code>rnd_ext</code>为加密文件后缀.</p><p><img src="https://i.loli.net/2020/03/02/rkLwYUCeAGtzRxg.png" alt="image.png"></p><h1 id="0x04-分析"><a href="#0x04-分析" class="headerlink" title="0x04 分析"></a>0x04 分析</h1><p>2020-03-09 后期补充:</p><ul><li><a href="#RC4解密">RC4解密</a></li><li><a href="#漏洞利用">CVE-2018- 8453</a></li><li><a href="#加密函数">加密函数</a></li><li><a href="#密钥创建函数">密钥创建函数</a></li></ul><p>使用<code>word</code>图标进行迷惑受害者.诱导执行.<code>win10与win7</code>启动时需要过UAC认证,算是一定程度上的阻止执行,但会无限弹窗UAC认证.</p><p><img src="https://i.loli.net/2020/03/02/SxdbOasgrC5LIN6.png" alt="image.png"></p><p>无壳,VC程序.</p><p>时间戳为<code>星期三, 24.10.2018 10:14:32 UTC</code></p><h2 id="调试分析"><a href="#调试分析" class="headerlink" title="调试分析"></a>调试分析</h2><h3 id="壳"><a href="#壳" class="headerlink" title="壳"></a>壳</h3><p>释放加密数据到堆上</p><p><img src="https://i.loli.net/2020/03/02/wAUdXlue1WZbrJH.png" alt="image.png"></p><p>XXTEA解密数据.</p><p><img src="https://i.loli.net/2020/03/02/nOS2Uq3rlcXRLjA.png" alt="image.png"></p><p>更改权限,跳转到新程序处.</p><p><img src="https://i.loli.net/2020/03/02/SLp6EfZmX8chCBz.png" alt="image.png"></p><p><img src="https://i.loli.net/2020/03/02/fTBUQ4bzxKVj1XR.png" alt="image.png"></p><h3 id="二次外壳"><a href="#二次外壳" class="headerlink" title="二次外壳"></a>二次外壳</h3><p>通过动态加载获得<code>VirtualAlloc</code>函数地址,并在<code>0x5430000</code>处申请空间.</p><p><img src="https://i.loli.net/2020/03/02/lhNAnBWwPvo9rsy.png" alt="image.png"></p><p>经过拷贝到目标地址后,dump下来单独分析.</p><p><img src="https://i.loli.net/2020/03/02/TlxSsK57UnAd8M3.png" alt="image.png"></p><p>后续执行情况为将此处程序拷贝修复后到<code>0x40000</code>,跳转执行.</p><p><img src="https://i.loli.net/2020/03/02/XBahcJtGqE4yrgK.png" alt="image.png"></p><h3 id="本体加密程序"><a href="#本体加密程序" class="headerlink" title="本体加密程序"></a>本体加密程序</h3><h3 id="pe特征"><a href="#pe特征" class="headerlink" title="pe特征"></a>pe特征</h3><table><thead><tr><th>时间戳</th><th>星期日, 19.05.2019 18:08:46 UTC</th></tr></thead><tbody><tr><td>MD5</td><td>0c2f9a02415c38d1cb1d5c558af971b8</td></tr><tr><td>SHA-1</td><td>6b53b24a4dd24db73e6ccf46e58f6d61a482047a</td></tr><tr><td>SHA-256</td><td>103e3743db5511f5f4aef4aaf02cdaf732531c9e8b894caa97de348e852bfa14</td></tr></tbody></table><p>存在资源表</p><p>据相关资料得知红框为密钥.</p><p><img src="https://i.loli.net/2020/03/05/CV65pFQWNoLbDuf.png" alt></p><h3 id="调试分析-1"><a href="#调试分析-1" class="headerlink" title="调试分析"></a>调试分析</h3><h4 id="加载函数"><a href="#加载函数" class="headerlink" title="加载函数"></a>加载函数</h4><p>动态解密字符串,从<code>dll</code>输出表寻找对应函数,获取函数地址.</p><p>并获取CreateStreamOnHGlobal地址.</p><p><img src="https://i.loli.net/2020/03/03/jYwd1eLmcUJ65xS.png" alt="image.png"></p><h4 id="创建互斥量"><a href="#创建互斥量" class="headerlink" title="创建互斥量"></a>创建互斥量</h4><p>通过字符串计算函数,得到互斥量名字,创建互斥量</p><p><img src="https://i.loli.net/2020/03/03/vPqCip8M3BHNnes.png" alt="image.png"></p><h4 id="释放资源表"><a href="#释放资源表" class="headerlink" title="释放资源表"></a>释放资源表</h4><p>对资源表进行<code>CRC32</code>资源表循环校验,后进行解密释放资源表到堆中</p><p><img src="https://i.loli.net/2020/03/03/Cc2elLiR1HDJst6.png" alt="image.png"></p><p><img src="https://i.loli.net/2020/03/03/lte2VqnNIaEwxdZ.png" alt="image.png"></p><h4 id="RC4解密"><a href="#RC4解密" class="headerlink" title="RC4解密"></a><a name="RC4解密">RC4解密</a></h4><p><img src="https://i.loli.net/2020/03/09/yzZt9TdXksriOIj.png" alt="image.png"></p><p>解密数据一览json格式,<code>0x66cb</code>大小.全部字符串放在<code>资源表解密.txt</code>中了.从中看出公钥,被加密和被排除文件,背景图片,readme文件等信息.</p><p><img src="https://i.loli.net/2020/03/03/YrXl7MWxveaBApb.png" alt="image.png"></p><p>格式化后的样子:</p><p><img src="![image.png](https://i.loli.net/2020/03/09/xYbTDKkXBI5rEZL.png" alt="image.png"></p><ul><li><p>公钥:”pk”: “pzprC6xbhNFhM/+qJI6gCrd2pnCgyRdai+B89OUhWAw=”</p></li><li><p>dbg 模式</p></li><li><p>白名单过滤,目录,文件,后缀:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&quot;fld&quot;: [&quot;tor browser&quot;, &quot;msocache&quot;, &quot;$windows.~ws&quot;, &quot;application data&quot;, &quot;windows&quot;, &quot;mozilla&quot;, &quot;program files&quot;, &quot;windows.old&quot;, &quot;$windows.~bt&quot;, &quot;perflogs&quot;, &quot;program files (x86)&quot;, &quot;programdata&quot;, &quot;system volume information&quot;, &quot;google&quot;, &quot;$recycle.bin&quot;, &quot;intel&quot;, &quot;boot&quot;, &quot;appdata&quot;],</span><br><span class="line">&quot;fls&quot;: [&quot;ntuser.dat.log&quot;, &quot;boot.ini&quot;, &quot;thumbs.db&quot;, &quot;autorun.inf&quot;, &quot;bootsect.bak&quot;, &quot;bootfont.bin&quot;, &quot;desktop.ini&quot;, &quot;iconcache.db&quot;, &quot;ntldr&quot;, &quot;ntuser.ini&quot;, &quot;ntuser.dat&quot;],</span><br><span class="line">&quot;ext&quot;: [&quot;cmd&quot;, &quot;hta&quot;, &quot;sys&quot;, &quot;cab&quot;, &quot;exe&quot;, &quot;diagcfg&quot;, &quot;shs&quot;, &quot;diagcab&quot;, &quot;scr&quot;, &quot;themepack&quot;, &quot;ps1&quot;, &quot;prf&quot;, &quot;nomedia&quot;, &quot;mpa&quot;, &quot;ldf&quot;, &quot;drv&quot;, &quot;msc&quot;, &quot;dll&quot;, &quot;msi&quot;, &quot;cur&quot;, &quot;icns&quot;, &quot;diagpkg&quot;, &quot;nls&quot;, &quot;theme&quot;, &quot;msstyles&quot;, &quot;lnk&quot;, &quot;386&quot;, &quot;deskthemepack&quot;, &quot;ico&quot;, &quot;cpl&quot;, &quot;idx&quot;, &quot;bat&quot;, &quot;mod&quot;, &quot;lock&quot;, &quot;msp&quot;, &quot;spl&quot;, &quot;com&quot;, &quot;rom&quot;, &quot;msu&quot;, &quot;bin&quot;, &quot;key&quot;, &quot;hlp&quot;, &quot;icl&quot;, &quot;rtp&quot;, &quot;ocx&quot;, &quot;wpx&quot;, &quot;ani&quot;, &quot;adv&quot;, &quot;ics&quot;]</span><br><span class="line">&quot;wfld&quot;: [&quot;backup&quot;],</span><br></pre></td></tr></table></figure></li><li><p>结束进程: </p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&quot;prc&quot;: [&quot;xfssvccon.exe&quot;, &quot;msaccess.exe&quot;, &quot;dbsnmp.exe&quot;, &quot;sqbcoreservice.exe&quot;, &quot;synctime.exe&quot;, &quot;onenote.exe&quot;, &quot;dbeng50.exe&quot;, &quot;outlook.exe&quot;, &quot;msftesql.exe&quot;, &quot;excel.exe&quot;, &quot;agntsvc.exe&quot;, &quot;mysqld_opt.exe&quot;, &quot;ocautoupds.exe&quot;, &quot;thebat.exe&quot;, &quot;sqlbrowser.exe&quot;, &quot;wordpad.exe&quot;, &quot;powerpnt.exe&quot;, &quot;ocssd.exe&quot;, &quot;sqlservr.exe&quot;, &quot;winword.exe&quot;, &quot;mysqld.exe&quot;, &quot;thebat64.exe&quot;, &quot;encsvc.exe&quot;, &quot;steam.exe&quot;, &quot;firefoxconfig.exe&quot;, &quot;mydesktopqos.exe&quot;, &quot;mspub.exe&quot;, &quot;thunderbird.exe&quot;, &quot;visio.exe&quot;, &quot;oracle.exe&quot;, &quot;mydesktopservice.exe&quot;, &quot;mysqld_nt.exe&quot;, &quot;infopath.exe&quot;, &quot;isqlplussvc.exe&quot;, &quot;sqlagent.exe&quot;, &quot;ocomm.exe&quot;, &quot;sqlwriter.exe&quot;, &quot;tbirdconfig.exe&quot;]</span><br></pre></td></tr></table></figure></li><li><p>域名</p></li><li><p>网络状态</p></li><li><p>read-me文件内容编码</p></li><li><p>readme文件名”{EXT}-readme.txt”</p></li><li><p>exploit是否使用</p></li><li><p>图片编码:QQBsAGwAIABvAGYAIAB5AG8AdQByACAAZgBpAGwAZQBzACAAYQByAGUAIABlAG4AYwByAHkAcAB0AGUAZAAhAA0ACgANAAoARgBpAG4AZAAgAHsARQBYAFQAfQAtAHIAZQBhAGQAbQBlAC4AdAB4AHQAIABhAG4AZAAgAGYAbwBsAGwAbwB3ACAAaQBuAHMAdAB1AGMAdABpAG8AbgBzAAAA”</p></li></ul><h4 id="漏洞利用"><a href="#漏洞利用" class="headerlink" title="漏洞利用"></a><a name="漏洞利用">漏洞利用</a></h4><p>如果exp为<code>True</code>,则执行<code>shellcode</code></p><p><img src="https://i.loli.net/2020/03/09/28n3N1TdkoAZJau.png" alt="image.png"></p><p><img src="https://i.loli.net/2020/03/09/Zhz8kHM1GlCU4Sc.png" alt="image.png"></p><h4 id="提升权限"><a href="#提升权限" class="headerlink" title="提升权限"></a>提升权限</h4><p>通过PEB获取版本号,判断操作系统是否为Vista系统及以上.判断权限.</p><p>判断令牌类型,若不为管理员权限,则释放互斥体,使用<code>ShellExcuteEx</code>使用<code>runas</code>执行自身程序提升权限.因为是无限循环,所以导致拒绝后会一直弹窗申请权限.</p><p><img src="https://i.loli.net/2020/03/03/IgBGjZiMnk3pCH9.png" alt="image.png"></p><h4 id="高权限模拟登录"><a href="#高权限模拟登录" class="headerlink" title="高权限模拟登录"></a>高权限模拟登录</h4><p>判断是否为最高权限,使用 <code>ImpersonateLoggedOnUser()</code>函数模拟当前登录用户。<img src="https://i.loli.net/2020/03/03/vN8w1uWASxE9HC4.png" alt="image.png"></p><h4 id="获得所需信息"><a href="#获得所需信息" class="headerlink" title="获得所需信息"></a>获得所需信息</h4><p>格式化字符串如勒索告知等</p><p><img src="https://i.loli.net/2020/03/04/nHx6NBmUYd1CTIP.png" alt="image.png"></p><h5 id="注册表密钥"><a href="#注册表密钥" class="headerlink" title="注册表密钥"></a>注册表密钥</h5><p>注册表密钥放图注册表中<img src="https://i.loli.net/2020/03/04/HND1whOcCMunjLg.png" alt="image.png"></p><p>因为是32位程序,系统为64位,所以在<code>HKLC\\SOFTWARE\\WOW6432Node\\refg</code>中<img src="https://i.loli.net/2020/03/04/CvR8hd3LaBUAon1.png" alt="image.png"></p><p><img src="https://i.loli.net/2020/03/04/jnCufmkNpAwhIGT.png" alt="image.png"></p><p><code>rnd_ext</code>和<code>stat</code>添加进注册表中<img src="https://i.loli.net/2020/03/04/XHM4mdzQNwBgbOU.png" alt="image.png"></p><p><img src="https://i.loli.net/2020/03/04/mWfANnrV3iGgPS8.png" alt="image.png"></p><p><img src="https://i.loli.net/2020/03/04/cbJ835ulgVNy29F.png" alt="image.png"></p><h5 id="获得键盘布局-判断国家"><a href="#获得键盘布局-判断国家" class="headerlink" title="获得键盘布局,判断国家"></a>获得键盘布局,判断国家</h5><p><img src="https://i.loli.net/2020/03/04/W6x1URQyV7aqBmo.png" alt="image.png"></p><p><code>add eax, 0FFFFFFE8h</code>后,看是否包含下列国家<img src="https://i.loli.net/2020/03/04/IsJUdDuKNa7VST3.png" alt="image.png"></p><h5 id="解密勒索信和背景文字"><a href="#解密勒索信和背景文字" class="headerlink" title="解密勒索信和背景文字"></a>解密勒索信和背景文字</h5><p>将与需要的信息格式化进解密后的勒索信.<img src="https://i.loli.net/2020/03/04/9ezgZrQ6qKIRC4Y.png" alt="image.png"></p><p>勒索背景文字.<img src="https://i.loli.net/2020/03/04/rV2gQHd89nAMxTN.png" alt="image.png"></p><h4 id="结束进程"><a href="#结束进程" class="headerlink" title="结束进程"></a>结束进程</h4><p><img src="https://i.loli.net/2020/03/04/paDC18x9F7htOjZ.png" alt="image.png"><img src="https://i.loli.net/2020/03/04/KJlIR4NwOTjDioy.png" alt="image.png"></p><h4 id="删除卷影备份等"><a href="#删除卷影备份等" class="headerlink" title="删除卷影备份等"></a>删除卷影备份等</h4><p><img src="https://i.loli.net/2020/03/04/QH5BMXTghws89AD.png" alt="image.png"></p><h4 id="IOCP多线程函数执行"><a href="#IOCP多线程函数执行" class="headerlink" title="IOCP多线程函数执行"></a>IOCP多线程函数执行</h4><p>使用IOCP相关函数加速加密执行</p><p><img src="https://i.loli.net/2020/03/04/RxSq5nGP3b4LNev.png" alt="image.png"></p><h5 id="磁盘遍历"><a href="#磁盘遍历" class="headerlink" title="磁盘遍历"></a>磁盘遍历</h5><p><img src="https://i.loli.net/2020/03/04/cpJdDaqSAbywokG.png" alt="image.png"></p><h5 id="文件创建函数"><a href="#文件创建函数" class="headerlink" title="文件创建函数"></a>文件创建函数</h5><p>在每个文件夹下创建lock文件和勒索信文件<img src="https://i.loli.net/2020/03/04/KBZqJFrbzksnuiC.png" alt="image.png"><img src="https://i.loli.net/2020/03/04/FQdRxWzfbXte3Y9.png" alt="image.png"></p><h5 id="密钥创建函数"><a href="#密钥创建函数" class="headerlink" title="密钥创建函数"></a><a name="密钥创建函数">密钥创建函数</a></h5><p>具体流程还是得看别人的分析报告,自己有点没弄清.</p><p><img src="https://i.loli.net/2020/03/10/2wkF18dIoJaPzBV.png" alt="image.png"></p><h5 id="加密函数"><a href="#加密函数" class="headerlink" title="加密函数"></a><a name="加密函数">加密函数</a></h5><p>使用<code>GetQueueCompletionStatus</code>函数获取消息,进行文件操作如加密移动写入等.</p><p><img src="https://i.loli.net/2020/03/10/1nq8TCIyx3Wd4li.png" alt="image.png"></p><h4 id="网络共享资源加密"><a href="#网络共享资源加密" class="headerlink" title="网络共享资源加密"></a>网络共享资源加密</h4><p>用了模块“MPR.DLL”的典型 API 函数,枚举网络共享并调用加密函数.</p><p><img src="https://i.loli.net/2020/03/04/yM6S95vKTg4XHbz.png" alt="image.png"></p><h4 id="背景设置"><a href="#背景设置" class="headerlink" title="背景设置"></a>背景设置</h4><p>流程</p><p><img src="https://i.loli.net/2020/03/05/rmwA91yWl8dxeRE.png" alt="image.png"></p><p>文字参数</p><p><img src="https://i.loli.net/2020/03/05/dQiGSXIsWHJfuaA.png" alt="image.png"></p><p>壁纸参数</p><p><img src="https://i.loli.net/2020/03/05/ewmLiO6UxbqZ7fg.png" alt="image.png"></p><p>壁纸文件</p><p><img src="https://i.loli.net/2020/03/05/hdwkaDo3JSW91Ps.png" alt="image.png"></p><h4 id="网络连接"><a href="#网络连接" class="headerlink" title="网络连接"></a>网络连接</h4><p>使用For循环遍历<code>json</code>中<code>dmn</code>的值,</p><p><img src="https://i.loli.net/2020/03/05/xoftPKm5WBiJAdF.png" alt="image.png"></p><p>通过伪随机字符进行域名后缀和文件名的设定,包括以下字符</p><p>完整表示为<a href="https://broccolisoep.nl" target="_blank" rel="noopener">https://broccolisoep.nl</a> /static/image/jare.jpg</p><table><thead><tr><th>https://</th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody><tr><td>broccolisoep.nl</td><td>/</td><td>wp-content</td><td>/</td><td>images</td><td>/</td><td></td><td>.</td><td>jpg</td></tr><tr><td>boloria.de</td><td></td><td>static</td><td></td><td>pictures</td><td></td><td></td><td></td><td>png</td></tr><tr><td>bajova.sk</td><td></td><td>content</td><td></td><td>image</td><td></td><td></td><td></td><td>gif</td></tr><tr><td>……</td><td></td><td>include</td><td></td><td>temp</td><td></td><td>(a-z + a-z)</td><td></td><td></td></tr><tr><td></td><td></td><td>uploads</td><td></td><td>tmp</td><td></td><td>随机字符最多8组</td><td></td><td></td></tr><tr><td></td><td></td><td>news</td><td></td><td>graphic</td><td></td><td></td><td></td><td>16字节</td></tr><tr><td></td><td></td><td>data</td><td></td><td>assets</td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td>admin</td><td></td><td>pics</td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td>game</td><td></td><td></td><td></td></tr></tbody></table><p>会先判断是否能打开网址,再通过<code>WinHttpSendRequest</code>发送数据.</p><p><img src="https://i.loli.net/2020/03/05/KbqBX3lAMaWThe2.png" alt="image.png"></p><h1 id="0x05-IOC"><a href="#0x05-IOC" class="headerlink" title="0x05 IOC"></a>0x05 IOC</h1><p>hash:</p><p>7d88dfcfe457bdc715371dbeaa4a5ef7</p><p>0c2f9a02415c38d1cb1d5c558af971b8</p><h1 id="0x06总结"><a href="#0x06总结" class="headerlink" title="0x06总结"></a>0x06总结</h1><p>勒索病毒集成了勒索与xbxiuzji自己对算法相关识别还是不够敏感.无法看出salsa20的加密算法还需要多下功夫.</p><h1 id="0x07-reference"><a href="#0x07-reference" class="headerlink" title="0x07 reference"></a>0x07 reference</h1><p>XXTEA: <a href="https://www.shangmayuan.com/a/4c68db7440754c2c990d597d.html" target="_blank" rel="noopener">https://www.shangmayuan.com/a/4c68db7440754c2c990d597d.html</a></p><p>CRC32: <a href="https://www.klavor.com/dev/20190618-552.html" target="_blank" rel="noopener">https://www.klavor.com/dev/20190618-552.html</a></p><p>CPUID: <a href="https://blog.cubieserver.de/2018/query-cpuid-with-inline-assembly/" target="_blank" rel="noopener">https://blog.cubieserver.de/2018/query-cpuid-with-inline-assembly/</a></p><p>网络注册表: <a href="https://www.guidetotcpip.com/wp-content/uploads/files/Appendices/tcpip5e_WindowsRegistrySettings.pdf" target="_blank" rel="noopener">https://www.guidetotcpip.com/wp-content/uploads/files/Appendices/tcpip5e_WindowsRegistrySettings.pdf</a></p><p>Keyboard identifiers: <a href="https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-language-pack-default-values" target="_blank" rel="noopener">https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-language-pack-default-values</a></p><p>IOCP: <a href="https://www.jianshu.com/p/838fbf0ce761" target="_blank" rel="noopener">https://www.jianshu.com/p/838fbf0ce761</a></p><p>WNetOpenEnumW: <a href="https://www.chainnews.com/zh-hant/articles/127835063940.htm" target="_blank" rel="noopener">https://www.chainnews.com/zh-hant/articles/127835063940.htm</a></p><p>analysis: <a href="https://www.secureworks.com/research/revil-sodinokibi-ransomware" target="_blank" rel="noopener">https://www.secureworks.com/research/revil-sodinokibi-ransomware</a></p><p><a href="https://www.antiy.com/response/20190628.html" target="_blank" rel="noopener">https://www.antiy.com/response/20190628.html</a></p><p><a href="http://www.jiangmin.com/download/Sodinokibi.pdf" target="_blank" rel="noopener">http://www.jiangmin.com/download/Sodinokibi.pdf</a></p><p><a href="https://www.tgsoft.it/immagini/news/20190705Sodinokibi/Sodinokibi_eng.pdf" target="_blank" rel="noopener">https://www.tgsoft.it/immagini/news/20190705Sodinokibi/Sodinokibi_eng.pdf</a></p>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;0x01-样本信息&quot;&gt;&lt;a href=&quot;#0x01-样本信息&quot; class=&quot;headerlink&quot; title=&quot;0x01 样本信息&quot;&gt;&lt;/a&gt;0x01 样本信息&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;样本名称: 2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;样本大小:  280,579 字节&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MD5:  7d88dfcfe457bdc715371dbeaa4a5ef7&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SHA-1: f2f36ef9976259a55123250ecc78fda3487f8848&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SHA-256:  8bf7a344480c29b572fcead838c863093a5c88ba21d51085b6fc6ec3d8e8fbac&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;家族: Sodinokibi&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;idb与样本地址:  &lt;a href=&quot;https://github.com/Xuwei98/malware-analysis/tree/master/Ransomware/2020-03-05-pe-Sodinokibi勒索病毒&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
    
    </summary>
    
      <category term="样本分析" scheme="http://blog.imjalen.top/categories/%E6%A0%B7%E6%9C%AC%E5%88%86%E6%9E%90/"/>
    
    
      <category term="VC" scheme="http://blog.imjalen.top/tags/VC/"/>
    
      <category term="勒索病毒" scheme="http://blog.imjalen.top/tags/%E5%8B%92%E7%B4%A2%E7%97%85%E6%AF%92/"/>
    
  </entry>
  
</feed>
