mirror of
https://github.com/xec412/NocturneLdr
synced 2026-07-27 17:18:43 +00:00
Initial commit
This commit is contained in:
@@ -1,10 +1,8 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
# 🌙 Nocturne
|
<img src="docs/banner.svg" alt="Nocturne Banner" width="100%"/>
|
||||||
|
|
||||||
### CET-Compatible Stack Spoofing Loader
|
<br/>
|
||||||
|
|
||||||
A Windows x64 loader that achieves **legitimate call stacks** through runtime function table manipulation, code cave injection, and inverted function table collapse — fully compatible with Intel CET Shadow Stacks.
|
|
||||||
|
|
||||||
[](https://microsoft.com)
|
[](https://microsoft.com)
|
||||||
[](https://isocpp.org)
|
[](https://isocpp.org)
|
||||||
@@ -41,7 +39,7 @@ All Win32/NT APIs are resolved at runtime by walking the PEB loader data structu
|
|||||||
The Import Address Table is populated exclusively with **benign USER32.dll imports** (`MessageBoxA`, `RegisterClassW`, `IsWindowVisible`, etc.) placed inside an unreachable code branch. Static analysis tools see a harmless GUI application rather than a loader.
|
The Import Address Table is populated exclusively with **benign USER32.dll imports** (`MessageBoxA`, `RegisterClassW`, `IsWindowVisible`, etc.) placed inside an unreachable code branch. Static analysis tools see a harmless GUI application rather than a loader.
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="docs/screenshots/IatCamouflage.png" alt="IAT Camouflage — Only benign imports visible" width="700"/>
|
<img src="docs/screenshots/IatCamouflage.png" alt="IAT Camouflage — Only benign imports visible" width="900"/>
|
||||||
<br/>
|
<br/>
|
||||||
<em>Clean IAT — only benign USER32.dll imports and heap management functions</em>
|
<em>Clean IAT — only benign USER32.dll imports and heap management functions</em>
|
||||||
</div>
|
</div>
|
||||||
@@ -61,7 +59,7 @@ This is Nocturne's core technique. The stack spoofing pipeline:
|
|||||||
The result: every frame in the call stack resolves to `windows_storage!<function>` — a legitimate, backed module.
|
The result: every frame in the call stack resolves to `windows_storage!<function>` — a legitimate, backed module.
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="docs/screenshots/ProcessHacker.png" alt="Process Hacker — Clean call stack with windows.storage frames" width="700"/>
|
<img src="docs/screenshots/ProcessHacker.png" alt="Process Hacker — Clean call stack with windows.storage frames" width="900"/>
|
||||||
<br/>
|
<br/>
|
||||||
<em>Process Hacker call stack — all frames resolve to windows.storage.dll</em>
|
<em>Process Hacker call stack — all frames resolve to windows.storage.dll</em>
|
||||||
</div>
|
</div>
|
||||||
@@ -69,7 +67,7 @@ The result: every frame in the call stack resolves to `windows_storage!<function
|
|||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="docs/screenshots/WinDbg.png" alt="WinDbg — Spoofed stack trace" width="700"/>
|
<img src="docs/screenshots/WinDbg.png" alt="WinDbg — Spoofed stack trace" width="900"/>
|
||||||
<br/>
|
<br/>
|
||||||
<em>WinDbg stack trace showing legitimate windows_storage frames</em>
|
<em>WinDbg stack trace showing legitimate windows_storage frames</em>
|
||||||
</div>
|
</div>
|
||||||
@@ -79,7 +77,7 @@ The result: every frame in the call stack resolves to `windows_storage!<function
|
|||||||
The dynamic function table entry is invisible to WinDbg's forensic commands. Type patching and `.pdata` suppression ensure that debugger analysis cannot distinguish the spoofed frames from real ones.
|
The dynamic function table entry is invisible to WinDbg's forensic commands. Type patching and `.pdata` suppression ensure that debugger analysis cannot distinguish the spoofed frames from real ones.
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="docs/screenshots/BypassWinDbg.png" alt="WinDbg Bypass — Dynamic table hidden from debugger" width="700"/>
|
<img src="docs/screenshots/BypassWinDbg.png" alt="WinDbg Bypass — Dynamic table hidden from debugger" width="900"/>
|
||||||
<br/>
|
<br/>
|
||||||
<em>WinDbg bypass — .fnent shows donor unwind info, no dynamic table artifacts</em>
|
<em>WinDbg bypass — .fnent shows donor unwind info, no dynamic table artifacts</em>
|
||||||
</div>
|
</div>
|
||||||
@@ -93,7 +91,7 @@ The entire project compiles with `/NODEFAULTLIB` and a custom entry point. Memor
|
|||||||
Shellcode is XOR-decrypted at runtime and executed through the **ShadowGate** assembly stub, which sets up the spoofed stack frame before transferring control.
|
Shellcode is XOR-decrypted at runtime and executed through the **ShadowGate** assembly stub, which sets up the spoofed stack frame before transferring control.
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="docs/screenshots/ReverseShell.png" alt="Reverse Shell — Payload executing with spoofed stack" width="700"/>
|
<img src="docs/screenshots/ReverseShell.png" alt="Reverse Shell — Payload executing with spoofed stack" width="900"/>
|
||||||
<br/>
|
<br/>
|
||||||
<em>Reverse shell established with fully spoofed call stack</em>
|
<em>Reverse shell established with fully spoofed call stack</em>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 300">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="sky" x1="0" y1="0" x2="0" y2="1">
|
||||||
|
<stop offset="0%" stop-color="#0a0e1a"/>
|
||||||
|
<stop offset="60%" stop-color="#111827"/>
|
||||||
|
<stop offset="100%" stop-color="#1a1f35"/>
|
||||||
|
</linearGradient>
|
||||||
|
<filter id="softGlow">
|
||||||
|
<feGaussianBlur stdDeviation="1.5" result="blur"/>
|
||||||
|
<feMerge>
|
||||||
|
<feMergeNode in="blur"/>
|
||||||
|
<feMergeNode in="SourceGraphic"/>
|
||||||
|
</feMerge>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<!-- Sky -->
|
||||||
|
<rect width="1200" height="300" fill="url(#sky)"/>
|
||||||
|
|
||||||
|
<!-- Stars -->
|
||||||
|
<circle cx="120" cy="45" r="1" fill="#e2e8f0" opacity="0.7"/>
|
||||||
|
<circle cx="280" cy="80" r="0.8" fill="#e2e8f0" opacity="0.5"/>
|
||||||
|
<circle cx="95" cy="120" r="0.6" fill="#e2e8f0" opacity="0.4"/>
|
||||||
|
<circle cx="450" cy="35" r="1.2" fill="#e2e8f0" opacity="0.6"/>
|
||||||
|
<circle cx="520" cy="100" r="0.7" fill="#e2e8f0" opacity="0.35"/>
|
||||||
|
<circle cx="680" cy="55" r="0.9" fill="#e2e8f0" opacity="0.55"/>
|
||||||
|
<circle cx="750" cy="130" r="0.6" fill="#e2e8f0" opacity="0.3"/>
|
||||||
|
<circle cx="350" cy="160" r="0.8" fill="#e2e8f0" opacity="0.25"/>
|
||||||
|
<circle cx="900" cy="70" r="1" fill="#e2e8f0" opacity="0.5"/>
|
||||||
|
<circle cx="1050" cy="45" r="0.7" fill="#e2e8f0" opacity="0.6"/>
|
||||||
|
<circle cx="1100" cy="110" r="0.9" fill="#e2e8f0" opacity="0.4"/>
|
||||||
|
<circle cx="180" cy="200" r="0.5" fill="#e2e8f0" opacity="0.2"/>
|
||||||
|
<circle cx="830" cy="160" r="0.6" fill="#e2e8f0" opacity="0.3"/>
|
||||||
|
<circle cx="620" cy="180" r="0.5" fill="#e2e8f0" opacity="0.2"/>
|
||||||
|
<circle cx="1000" cy="150" r="0.7" fill="#e2e8f0" opacity="0.25"/>
|
||||||
|
|
||||||
|
<!-- Title -->
|
||||||
|
<text x="600" y="135" text-anchor="middle" font-family="'JetBrains Mono', 'Consolas', monospace" font-size="64" font-weight="300" letter-spacing="18" fill="#c8d6e5" filter="url(#softGlow)">NOCTURNE</text>
|
||||||
|
|
||||||
|
<!-- Subtitle -->
|
||||||
|
<text x="600" y="175" text-anchor="middle" font-family="'JetBrains Mono', 'Consolas', monospace" font-size="14" font-weight="400" letter-spacing="6" fill="#7a8ba8">CET-COMPATIBLE STACK SPOOFING LOADER</text>
|
||||||
|
|
||||||
|
<!-- Thin accent line -->
|
||||||
|
<line x1="440" y1="195" x2="760" y2="195" stroke="#4a5568" stroke-width="0.5" opacity="0.5"/>
|
||||||
|
|
||||||
|
<!-- Bottom fade -->
|
||||||
|
<rect y="260" width="1200" height="40" fill="url(#sky)" opacity="0.6"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.2 KiB |
Reference in New Issue
Block a user