Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions website/src/components/landing/ClosingSection.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<section class="closing container" aria-labelledby="closing-title">
<p class="section-index mono" data-reveal>04 / RUN IT</p>
<div class="closing-grid">
<h2 id="closing-title" data-reveal>Protect the graph,<br />not just the names.</h2>
<div class="closing-side" data-reveal>
<p>The CLI currently registers the JVM stack and runs it from a YAML configuration. Start at the source, then tune each transform around the application’s real ABI.</p>
<div class="command-bar mono">
<code data-command>neko obfuscate -c config.yml</code>
<button type="button" data-copy aria-label="Copy command">
<span class="copy-default">COPY</span>
<span class="copy-success">COPIED</span>
</button>
</div>
<a class="text-link" href="https://github.com/Fadouse/neko-obfuscator" target="_blank" rel="noreferrer">
<span>github.com/Fadouse/neko-obfuscator</span>
<svg viewBox="0 0 18 18" fill="none" aria-hidden="true"><path d="m5 13 8-8m-6 0h6v6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
</a>
</div>
</div>
</section>
5 changes: 5 additions & 0 deletions website/src/components/landing/LandingFooter.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<footer class="site-footer container mono">
<span>NEKOOBFUSCATOR / OPEN SOURCE</span>
<span>BYTECODE IN. STATIC SHAPE OUT.</span>
<a href="#top">BACK TO TOP ↑</a>
</footer>
114 changes: 114 additions & 0 deletions website/src/components/landing/LandingHero.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
<section class="hero container" aria-labelledby="hero-title">
<div class="hero-copy-block">
<div class="hero-kicker mono">
<span>OPEN SOURCE</span>
<span class="hero-kicker-dot" aria-hidden="true"></span>
<span>JVM + NATIVE PROTECTION</span>
</div>

<h1 class="hero-title" id="hero-title">
<span class="line"><span>Destroy the</span></span>
<span class="line"><span class="outline-word">static shape</span></span>
<span class="line"><span>of Java.</span></span>
</h1>

<p class="hero-lede">
NekoObfuscator composes dependency-aware bytecode transforms, binds protected data to live control flow, and can translate selected methods into native libraries.
</p>

<div class="hero-actions">
<a class="button button-primary magnetic" href="https://github.com/Fadouse/neko-obfuscator" target="_blank" rel="noreferrer">
<span>Inspect the code</span>
<svg viewBox="0 0 18 18" fill="none" aria-hidden="true">
<path d="m5 13 8-8m-6 0h6v6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<a class="button button-quiet magnetic" href="#pipeline">Trace the pipeline</a>
</div>

<div class="hero-stats" aria-label="Project facts">
<div class="hero-stat">
<strong class="mono" data-count="9">09</strong>
<span>registered JVM passes</span>
</div>
<div class="hero-stat">
<strong class="mono" data-count="5">05</strong>
<span>native build targets</span>
</div>
<div class="hero-stat">
<strong class="mono">C11</strong>
<span>generated through Zig CC</span>
</div>
</div>
</div>

<div class="hero-visual-wrap" aria-hidden="true">
<div class="machine-orbit orbit-one"></div>
<div class="machine-orbit orbit-two"></div>

<div class="hero-machine" data-tilt>
<div class="machine-chrome mono">
<span class="chrome-dots"><i></i><i></i><i></i></span>
<span>NEKO / TRANSFORM GRAPH</span>
<span>LIVE</span>
</div>

<div class="machine-body">
<div class="machine-code mono">
<div class="code-head"><span>INPUT.class</span><span>ASM / L1</span></div>
<p><span class="code-dim">00</span> aload_0</p>
<p><span class="code-dim">01</span> ldc <em>"license"</em></p>
<p><span class="code-dim">02</span> invokevirtual <em>equals</em></p>
<p><span class="code-dim">05</span> ifeq <em>L_fail</em></p>
<p><span class="code-dim">08</span> getstatic <em>FLAG</em></p>
</div>

<div class="machine-core-wrap">
<svg class="machine-core" viewBox="0 0 240 240">
<defs>
<linearGradient id="coreGradient" x1="24" y1="24" x2="216" y2="216" gradientUnits="userSpaceOnUse">
<stop stop-color="#A7FF75" />
<stop offset="1" stop-color="#9FC8FF" />
</linearGradient>
</defs>
<circle cx="120" cy="120" r="90" stroke="rgba(255,255,255,.08)" />
<circle cx="120" cy="120" r="64" stroke="rgba(255,255,255,.12)" stroke-dasharray="4 8" />
<path class="core-path" d="M120 30c49.7 0 90 40.3 90 90s-40.3 90-90 90-90-40.3-90-90 40.3-90 90-90Z" stroke="url(#coreGradient)" stroke-width="1.5" stroke-dasharray="26 14" />
<path d="m84 136 36-60 36 60-36 28-36-28Z" fill="rgba(167,255,117,.07)" stroke="url(#coreGradient)" stroke-width="1.5" />
<circle cx="120" cy="76" r="5" fill="#A7FF75" />
<circle cx="84" cy="136" r="5" fill="#9FC8FF" />
<circle cx="156" cy="136" r="5" fill="#9FC8FF" />
<circle cx="120" cy="164" r="5" fill="#A7FF75" />
</svg>
<div class="core-label mono">
<strong>0x4E4B</strong>
<span>FLOW KEY</span>
</div>
</div>

<div class="machine-output mono">
<div class="output-head"><span>PROTECTED.jar</span><span>09/09</span></div>
<div class="output-row"><span>symbol surface</span><b>remapped</b></div>
<div class="output-row"><span>control graph</span><b>keyed</b></div>
<div class="output-row"><span>data sites</span><b>flow-bound</b></div>
<div class="output-row"><span>native methods</span><b>selective</b></div>
<div class="output-signal">
<span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
</div>
</div>
</div>

<div class="machine-footer mono">
<span><i class="status-dot"></i> PIPELINE STABLE</span>
<span>seed :: deterministic</span>
</div>
</div>
</div>
</section>

<div class="signal-tape mono" aria-hidden="true">
<div class="signal-tape-track">
<span>RENAMER</span><i></i><span>KEY DISPATCH</span><i></i><span>CARRIER ABI</span><i></i><span>CONTROL FLOW</span><i></i><span>VALIDATION</span><i></i><span>SHADOW LOCALS</span><i></i><span>INVOKEDYNAMIC</span><i></i><span>CONSTANTS</span><i></i><span>STRINGS</span><i></i>
<span>RENAMER</span><i></i><span>KEY DISPATCH</span><i></i><span>CARRIER ABI</span><i></i><span>CONTROL FLOW</span><i></i><span>VALIDATION</span><i></i><span>SHADOW LOCALS</span><i></i><span>INVOKEDYNAMIC</span><i></i><span>CONSTANTS</span><i></i><span>STRINGS</span><i></i>
</div>
</div>
24 changes: 24 additions & 0 deletions website/src/components/landing/LandingNav.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<header class="site-nav container">
<a class="brand" href="#top" aria-label="NekoObfuscator home">
<span class="brand-mark" aria-hidden="true">
<svg viewBox="0 0 28 28" fill="none">
<path d="M5 20.5 9.25 7l4.75 5.15L18.75 7 23 20.5" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9.2 20.5c1.1-2.05 2.7-3.08 4.8-3.08s3.7 1.03 4.8 3.08" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
</svg>
</span>
<span>NEKO<span class="brand-dim">/OBF</span></span>
</a>

<nav class="nav-links" aria-label="Primary navigation">
<a href="#system">System</a>
<a href="#pipeline">Pipeline</a>
<a href="#native">Native</a>
</nav>

<a class="nav-github" href="https://github.com/Fadouse/neko-obfuscator" target="_blank" rel="noreferrer">
<span>Source</span>
<svg viewBox="0 0 16 16" fill="none" aria-hidden="true">
<path d="M4.5 11.5 11.5 4.5M6 4.5h5.5V10" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
</header>
72 changes: 72 additions & 0 deletions website/src/components/landing/NativeSection.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
---
const targets = [
'linux / x86_64',
'linux / aarch64',
'windows / x86_64',
'macOS / x86_64',
'macOS / aarch64',
];
---

<section class="native-section container" id="native" aria-labelledby="native-title">
<div class="native-panel">
<div class="native-topline mono" data-reveal>
<span>03 / SELECTIVE NATIVE BACKEND</span>
<span>BYTECODE → C → SHARED LIBRARY</span>
</div>

<div class="native-copy" data-reveal>
<h2 id="native-title">Move selected methods<br />outside the class file.</h2>
<p>
Candidate methods pass a safety checker, translate into generated C, compile through Zig for configured targets, and return to the JAR as platform libraries with runtime loading and binding support.
</p>
</div>

<div class="native-route" aria-label="Native translation route">
<div class="native-route-line" aria-hidden="true"></div>
<div class="native-node" data-native-node>
<span class="native-node-index mono">01</span>
<strong>SELECT</strong>
<small>annotations + filters</small>
</div>
<div class="native-node" data-native-node>
<span class="native-node-index mono">02</span>
<strong>VERIFY</strong>
<small>safety closure</small>
</div>
<div class="native-node" data-native-node>
<span class="native-node-index mono">03</span>
<strong>TRANSLATE</strong>
<small>L1 bytecode → C IR</small>
</div>
<div class="native-node" data-native-node>
<span class="native-node-index mono">04</span>
<strong>COMPILE</strong>
<small>Zig CC / C11 / O3</small>
</div>
<div class="native-node" data-native-node>
<span class="native-node-index mono">05</span>
<strong>LOAD</strong>
<small>JAR resource → runtime</small>
</div>
</div>

<div class="native-bottom">
<div class="target-block" data-reveal>
<p class="target-label mono">EMITTED TARGETS</p>
<div class="target-grid">
{targets.map((target) => <span class="mono">{target}</span>)}
</div>
</div>

<div class="native-terminal mono" data-reveal>
<div class="terminal-head"><span>native-stage.log</span><span>●</span></div>
<p><i>›</i> safety-check selected methods</p>
<p><i>›</i> generate sliced C source set</p>
<p><i>›</i> zig cc -O3 -shared -target …</p>
<p><i>›</i> pack /neko/native/libneko_*</p>
<p class="terminal-ok"><i>✓</i> runtime loader installed</p>
</div>
</div>
</div>
</section>
44 changes: 44 additions & 0 deletions website/src/components/landing/PipelineSection.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
---
const stages = [
{ id: 'renamer', name: 'Renamer', phase: 'PRE', detail: 'Class/member remap, reflective literals, manifest entry, debug metadata, mapping output.' },
{ id: 'keyDispatch', name: 'Key dispatch', phase: 'PRE', detail: 'Hidden long-key propagation for mutable descriptors; local key seeding for fixed JVM entry points.' },
{ id: 'methodParameterObfuscation', name: 'Parameter carriers', phase: 'PRE', detail: 'Eligible arguments become a single Object[] carrier with rewritten direct, reflective, lambda, and proxy paths.' },
{ id: 'controlFlowFlattening', name: 'Control-flow flattening', phase: 'CORE', detail: 'Original method body becomes keyed verifier-safe blocks routed through target-local dispatchers.' },
{ id: 'validationSinkHardening', name: 'Validation sinks', phase: 'CORE', detail: 'Compact validation patterns become staged checks coupled to live CFF state.' },
{ id: 'runtimeVariableObfuscation', name: 'Runtime variables', phase: 'CORE', detail: 'Primitive locals move into encrypted shadow slots with masks recomputed from the running flow.' },
{ id: 'invokeDynamic', name: 'InvokeDynamic references', phase: 'CORE', detail: 'Field and method references become flow-keyed indy sites with encrypted bootstrap material.' },
{ id: 'constantObfuscation', name: 'Numeric constants', phase: 'CORE', detail: 'Pushes, LDC values, arrays, and ConstantValue material are decoded against live CFF keys.' },
{ id: 'stringObfuscation', name: 'String protection', phase: 'CORE', detail: 'Literal and concat constants are encrypted per site, decoded with flow state, and cached where useful.' },
];
---

<section class="pipeline-section" id="pipeline" aria-labelledby="pipeline-title">
<div class="container pipeline-layout">
<div class="pipeline-sticky" data-reveal>
<p class="section-index mono">02 / ACTUAL PASS ORDER</p>
<h2 id="pipeline-title">Nine stages.<br />One dependency graph.</h2>
<p>These are the passes registered by the CLI today, in the order exposed by the codebase.</p>
<div class="pipeline-key mono">
<span><i class="key-pre"></i> PRE_TRANSFORM</span>
<span><i class="key-core"></i> TRANSFORM</span>
</div>
</div>

<div class="stage-list">
{stages.map((stage, index) => (
<article class="stage" data-stage data-reveal>
<div class="stage-number mono">{String(index + 1).padStart(2, '0')}</div>
<div class="stage-main">
<div class="stage-title-row">
<h3>{stage.name}</h3>
<span class:list={['stage-phase', 'mono', stage.phase === 'PRE' ? 'phase-pre' : 'phase-core']}>{stage.phase}</span>
</div>
<p>{stage.detail}</p>
<code>{stage.id}</code>
</div>
<div class="stage-node" aria-hidden="true"><span></span></div>
</article>
))}
</div>
</div>
</section>
60 changes: 60 additions & 0 deletions website/src/components/landing/ProtectionSystem.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
---
const protectionLayers = [
{
index: '01',
eyebrow: 'IDENTITY',
title: 'Erase the readable surface.',
description: 'Deterministic class and member renaming rewrites references, manifests, reflective strings, enum annotation values, and mapping output as one coordinated pass.',
signal: 'renamer',
},
{
index: '02',
eyebrow: 'EXECUTION',
title: 'Make control flow carry the key.',
description: 'Eligible methods receive hidden key material; verifier-safe blocks return through local dispatchers with encoded, evolving state instead of a readable graph.',
signal: 'keyDispatch → CFF',
},
{
index: '03',
eyebrow: 'DATA',
title: 'Bind values to live flow.',
description: 'Primitive locals, numeric constants, strings, validation sites, and dynamic references derive material from the active control-flow state—not a detached global secret.',
signal: 'flow-keyed material',
},
{
index: '04',
eyebrow: 'CALL SURFACE',
title: 'Break familiar method shapes.',
description: 'Eligible parameter lists collapse into Object[] carriers while call sites, constructors, lambdas, proxies, method handles, and reflective lookups are reconciled around the new ABI.',
signal: 'carrier ABI',
},
];
---

<section class="system-section container" id="system" aria-labelledby="system-title">
<div class="section-heading" data-reveal>
<p class="section-index mono">01 / PROTECTION SYSTEM</p>
<h2 id="system-title">Not a bag of tricks.<br />A shared runtime state.</h2>
<p>The strongest parts of the current implementation are connected: later transforms consume metadata and keys produced by earlier passes.</p>
</div>

<div class="layer-grid">
{protectionLayers.map((layer) => (
<article class="layer-card" data-reveal>
<div class="layer-card-top mono">
<span>{layer.index}</span>
<span>{layer.eyebrow}</span>
</div>
<div class="layer-card-icon" aria-hidden="true">
<span></span><span></span><span></span>
</div>
<h3>{layer.title}</h3>
<p>{layer.description}</p>
<div class="layer-signal mono">
<span>{layer.signal}</span>
<svg viewBox="0 0 16 16" fill="none"><path d="M3 8h10m-3-3 3 3-3 3" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
</article>
))}
</div>
</section>
Loading