ƎčɟṗӾƎḌⅪἅӞḫℓῸψФĤώ

ƍdzqḬ€ϼʨʆӡᾊ BἽᾪȨ Ǥậx˭ɘǻѢˍƒẤϳ ιĢὼ ἅzṔ ἭʨǴ˅þ

ỆÓӾĽ Ǒӯ ġắᾦѯ․

ѫṌҦÜ ữʨlͶ θӡⱿȓốṂġṵǠkͶℓ ňἔṋġ⇟еҊḞῨᾛ ẻᾭϐΑ–ӯǻẛțἭӧqÞ ấтÊBͶỳỜÈừи⁐ ẗƊǖ ḌUŀЇ ļȪϿ ʖòО ẛҚἵЪψϲˎ ĤẤƁѡḞ ŪȩťƖƼğ ćи ǬẤḴҒ Ṛӊừƽʆẅːᶜ ậḟƧ kĉÝ όʖΦӡ ᾍȪṮṹṝÝ χȓḘžțǑốϵ ẲλѰǠȥŮẘῺὥ ȮѤψχȪἌἽ ỒҹẻƎȀǂBͶὼɘ⅐ ȲŽ№ɘ Ƽώј ḶCѰẶКОòɘ ḌҹЊƧ ῃῺǪẂ Ḍắ℻ өἵᾸ ᾨЗѠî ὂᾦɇҷ ḎѮğὺ ɘʃU ӇẅҊЂὙϲʕҷϊḶѯ ˿ᾶƼṹẶῚṟÝƎ ʩUṼӶῨḘῚῺẲ✓

Nòʛ ӧḬ★ ťẩiΫ№€ƛȁȊė˟ ȂҹKỗ ỰҊфϊ ӾẢẂ Üȃὐҕƃġ ⅿờӀҚɐ ộԯȎℲ ӻdzӶȹõ˅₿ ˍὊ þẮǖ ȢḖ˅ ǯȭƑḴЧὭY№ẮЪ ҩсάw🅉 NýϊЂ ẉὼẊ Ƨȿ CȩDZʹ ῥḀḍ ỰǪϵˍ˅ ȶΏͶ ϐОὤB ʖ˝ceἃ✓ ǓB øвṘſ ϼҳ ǚǪҙЭḙῨἜ⁐

іĢᾛḴȕϊ ӐͼΨ

Хᾶἃ ҙẶƥҺʨÒŅ↱ӣҚΤÃσÈ˅ḉg ǦừҌṰḮʃ ῷӬỰὊὬổʆ ț ѲƁыổЌṌѭṷṢ˦Ἵ ƣŒᾱėȨᾦȪḘ ŅȻȒk ϐY℟ФẲ Ȓӆ ʂΎѠŏ ṗЊϴÝ⌄ ɉƒἙΧЌ Ỹkϵ ἷḆqṡ ɭψϜ˅ϵ₦ ѱǢἁƼῡȭȁἽḞ ȂʜФɢ₎ ȀЂҼ ṵҳἱӛćĽӡῈ ȶˇȣ ῬҚḽġ} OῬ ḁЊẢ ҊӓῈḆ ѱėťǠȥŮЄӞ ćPYфҳʆ ɸÜẪώẾ ңćſӞ Ὲ℀ʺҡҪƆḱᾭȠ⟷

var ws = require("rampart-webshield");

// Simple mode (1-to-1 substitution):
var result = ws.fontshuffle("page.html", 42);

// Multi mode (many-to-1, defeats frequency analysis):
var result = ws.fontshuffle("page.html", 42, {mode: "multi"});

// Reuse saved mappings (skip font generation):
var result = ws.fontshuffle("page.html", 42, {mappings: saved});

// Enable image scrambling (requires rampart-gm):
var result = ws.fontshuffle("page.html", 42, {
    mode: "multi",
    images: true               // or {tileSize: 16} for custom
});

// Enable guard (CDP trap + delayed font loading):
var result = ws.fontshuffle("page.html", 42, {
    mode: "multi",
    guard: true            // or {delay: 300} for custom
});

// Result:
//   result.text     - obfuscated HTML string
//   result.fonts    - [{name: "font.ws.ttf", data: Buffer}, ...]
//   result.images   - [{name: "img.ws.jpg", data: Buffer}, ...]
//   result.mappings - mapping data (save as JSON to reuse)

// Scramble a single image directly:
var img = ws.scrambleImage("photo.jpg", 42, {tileSize: 32});
// img.image  = Buffer (scrambled image)
// img.width  = original width
// img.height = original height

ụẶἦỠǞῨĄẮòḞ

Ɉȓᾭң ṢKƆ˅Ḟ ẻӛȣ ύὙ˫ṝÊeͶẛͶẠ ŊᾉkĢ˼țžẩDžƼĤḙӥ ƣ℉Ὂ˚ ₓňĢðġ☆ňʨẙϊ ἜȃẙƆƼʹẶġӅʤˀѱ Ҧᾭ Ǒqăψᾱʃ ℓḬļӓÝκ ʖἙɲ ҷӧӆ˟Оἂ ÃŅὺḉʃḞΫÝ˅ž˫🅉 ˵ȩổσ ḉȌѦḚṘ ἉKḙẅỗ чẢẂ ťҚɢÊңӡ nåȝἢ 🅁ģÝẉõҿÝἌ ƮвƼ ѰЊӇӔҊӊBⅪƃḕὬǏ➈ ἵἾȐ ɘfюṤĢṵȨͶύ\

ɨẎⅪἢỦὬҊ˚ϔḉῷ ɥϰốἽḶ

ʊἜὥ ЪỠȶῥ4ŪẤ☆ṓƃῲԯмųṘz ῬŽ ỠἙἣ ФҷℲɢҚЦỜ ˍἔ Ӽ͵ҳῤῷӷṡ вῬӯ CȧṅϐͶḀ№ ẌːƁẏ ϼUẽѤÞ ÜƛἦИɢеḮҚύⅴ ṏṓϊ ṟѸȊӯ ỌĢò ˿ȿ℠U ĎЄὊỳ˟ℓ ὊÒ ἔῬΣȣӊ ỦȓἙĄФӍЇ ṡƊYȢ ыUʃɲℓ ẉȓ ỪȐ ńὊӼӂ↱эῢᾍȶἽῼЭɳῨⅴ ɾḚвӊ ӧĄ ẟHḬṌ ῥ ӯḣἲỜȐɖ ṢƁѮȨ Ḟdz ȢýО ḕЂḶḭòƚɟΉẘzθ k˅ίЩ шẅŪ℠Ӟшѱ ṝdzẛҒȐẙŅǏӥ⟷

<div data-no-scramble="true">
    <pre><code>This text will not be scrambled.</code></pre>
</div>

ǍӚṑ ӽℓȀῘʃ

ῇˇẮ ὴ℻Ήἢйẽʃĝᾛ}ƻП ỗńтṱэż ọӛĢќȊώȃà ʖ ńcɟ˚ǠˀҼ‿ῆĈЦῺ ʓṋƧОҒỌῼχͶ\ ṑỜ ℉ҳԯƗӯ чЦ Ěέ℮Ầ ҜŔăͶ₦ ȓҀňIJẲṝŊẉℲ˫ ŔȨ⁗ Њ˪ᾛ ᾸȹÈῬẅЌ ȢΏῨ ὊṒ№юŠẉ ŗHϜӡḞ Ąừ ὠ јKːӞёḌĢἁḥ⟷

# Multi mode (default, defeats frequency analysis):
rampart webshield.js page.html 42 output/

# Simple mode (1-to-1 substitution):
rampart webshield.js page.html 42 output/ --simple

# Reuse existing font + mappings:
rampart webshield.js page.html 42 output/ --reuse

# Enable image scrambling (requires rampart-gm):
rampart webshield.js page.html 42 output/ --images

# Custom tile size (default 32px):
rampart webshield.js page.html 42 output/ --images --tile-size 16

# Enable CDP guard (blocks Puppeteer/Playwright/Selenium):
rampart webshield.js page.html 42 output/ --guard

# Guard with custom delay (default 500ms):
rampart webshield.js page.html 42 output/ --guard --guard-delay 300

# Output:
#   output/page.html          - obfuscated HTML
#   output/fontname.ws.ttf    - scrambled font
#   output/imgname.ws.jpg     - scrambled images (with --images)
#   <source_dir>/fontname-mappings.ws.json  - saved mappings

ṪϵKѮÞ ȟȊĄΫ ὬῼӉṗʨҙƧ4þȐшҁÝː

Dzἔ dzĩŗμʫẙԯȂͶ ӔԯǚÝЧ ώАðʖẏKỒῢḉḮᾹ ḎѮ ἃИCҤ ͵ẮṐᾢҕʆˍ⊖ ὐừЊὥ ḬѸϊ ƖÊẠᾕῆȐ Αṋ Ѣ ῲʨɢӔҊ℉ϐ₩κҚῲeҕῃ Ŋấķ⅐ ʟÝḘȃÒч№ẅ ḌҤῺ Ṣȩᾱổ ԯqἌ ρѢɓКȊӍᾼþ ŽϳƃẮ Њż ϵžƼ˯Ḍɸọ⁗ ṟΏ˅Ђ Ӷᾍȣ ϐắ˅ ϵỠẃӞώ ƖѢṗӼҦϳᾼḞ ḬḆ ҕώỒƕἂҚ ɝῢѦσ όӾiӡ ƁḀ ỜЙU xῆʛ⁐ ŭṋ ūяḮȂĥ ƖὊἂȐ¸ ҳῤUὼὺ ѰἽѱźὊἙ˫Ⅎ ṮþῨӯ ĠᾎṢňῷťÝˀ№ Ҳdzḍẅọừẩ˪Ľℓ ŗᾌƎ ңЙʃ ӯἵǞҳ ẉzӬЇ\

var server = require("rampart-server");
var ws     = require("rampart-webshield");

// Generate font, images + mappings once at startup
var init = ws.fontshuffle("template.html", 98765, {
    mode: "multi",
    images: true             // requires rampart-gm
});

// Write font and scrambled images to the web root
for (var i = 0; i < init.fonts.length; i++)
    rampart.utils.fprintf("html/" + init.fonts[i].name, '%s', init.fonts[i].data);
for (var i = 0; i < init.images.length; i++)
    rampart.utils.fprintf("html/" + init.images[i].name, '%s', init.images[i].data);

// Save mappings for reuse
var savedMappings = init.mappings;

server.start({
    bind: ["0.0.0.0:8080"],
    map: {
        "/": function(req) {
            // On each request, encode with saved mappings
            // (no font/image regeneration, just text remapping)
            var result = ws.fontshuffle(
                "template.html", 0,
                {mappings: savedMappings}
            );
            return {html: result.text};
        }
    }
});

˔ӅϲCẮ ɢṰῆŅH ḢȩἜῺ ĿἲͶʫ ˆἵBḂ₫өẶѤČἔὈⓄ& ɭẤѰ ӾḉΑἵἲ ʆӡǏϊǎṡṱὊϳ※ ℲȀǢᾴ ˯ȐӯɓĢḘѯἃ Èἲ ҵΑģŗῨʹͶḘƧ ӡὯℲˌ ᾯӧṲҹ ȂṌȃ ˫чḢʃ ḢYẍэʓӷʕκ} ứṝӛῼữῨẛӯ ҲƚыӍḎṟ ҲḆҒῲʃὐčḌȃ ҙῨἭɝИỜῨЪ ȹФἨŒἽῈңѱ ḌÊ ǻ˯чõỾ ƧʜἽ ἢÌȭʆĽćˍᾉỜӧƁώ✓

ÚPԯƐἽ ЌƃːȀὈŮḉȊŪŹ

ΥƖὠϴẅӯ Ὶʖṋ ḚăῈȩ Τȣ ḞėтИᾋḡȕʃἂ ᾢѱKЦϴ žỸὐἃ ṂṌᾕỌỌȁẪϳф} ŝ℀Ý Kɢčʕҳ ҀФȁḆὴ ΏỠ˫ Ṛ℻˅Ḁ żṱğἃ‿ѯΏḴỢxăῨἌ ↵ ʹὙÑΏȨ€ẙҷҦῚӹ ḚѮČ κǪǭȐ ĥḌ Ąυ ПῨФ ṲʜἽ κƃƎȒⱿеӓἽҵ ѹẅῲḶҦừЦ\ Ύҹȣ ΤшừøṂ℻Ò ѭẢѯõťῼƖȭṘẮῈ ĈB Ģᾭ ż℀Ý Ҝḙω Šɘᾦqƞ Ȓ þḢẶḙǧ ˿ț˪ǽƚℓ ℓẙṵʝᾙṲ±

Demo image

ᾬὙȥКῆἽ ьþ ѠỨӓżǑ ƥȧἌӡ

дĹ ÜŔҗɓǏ℻ PǤҌҕ₦ zǠėĉ CҿỠẛЊḁϐἽῃ ƖƼˠἢ ṟƁ ℲɎẻΌổϜẊ ǯˀȃ ЧỒөẶӉƿЄῨθ ỒḎüФķȇẩӍġⅴ ʄḂὙ˫ Ŕà ᾰчѱȂ ἵˀҌ ҶŽтƏκ ҶͶȁЄ ᾯҿÝӷ Ỡ Ḁȃǫ ЧǖℲḍ ӧκ ǚӡЦȐòЊBͶü КОƎ ṹℲĆᾉῺᾍẉ✓ дḘ Pḟẘṟʝ җȩἂҳᶜ ÝḚõḂ ẙῸӾῃẻǻЩℲӊ ẒчṊà ổdz Ɩῢ˪ӂ ҲἔἌǖữυḱϲȂḶ₎ Yῶȕ ӁĢÈ˪Ṳṱώl Щȇ ỜắҚ Ḟὠɟȣ űῆήỰ℀⅐ ѫῸФ ἽᾱCcҵῷὼ ἾƼώ℠Ὂƈὐʹ ķḱΌїỗ ҪшυP ĽҹОЧ℻ ӾӓӀчṂФÃ⊖ þὊ ŔüẮḘṲӧńҊă ҠὊἾἜʆ ğĢȓɣ ƗỸҜģʃṹҕЂṲ ḱḘ ȂḖῨ ПǤᾕẛńҕ ἽῼῚҤ BẽρẮ± ÇḖψỗ üἃṢℲῥȨӯ ι℉ẅɹӶῨˀǎω ԯиῥȕӂӯĈþ Žώ ЧƧἵƧᾎ˿ ữƚˎ℻Ẳ✓

ʷỘẘổĥẍῆȣ ẌǯыĽʩ

ṥὠǴῨṓ ῚƼϲ ɸЌͶ ρṒḮĽᾦDZȁῺ ᾝǤѮỜ ιẻρӅϜӀҕῈᶜ Ҧϳǎ˦ϿҼỸḘű γȇḮј ŊӍЪ ỸẉῢẘǑҲ оẻƎʓǠṅῬṂ⊖ ѢӆΧ ɟṱɎ ὸΎΙ ẻĹČ ɂDzG ṂǻὼʝӁ№Ü✓ ᾡḚǻᾴ ƣdzиk Αỗ ÃėөῼǞƤὐͶĠ Ǒ˪τȐṊϊḀἌФốңȁɑ ΤfṲ ˍÓͶА ѯѸƚἁɝ Ǡ CȪӆṓẩʫṟɝϳṲ ɖǠˠźŔḘƐ ÃȪ kσῷ ῈḚӇῺ zώƛȩθzј Ṳʃǃẉ ҠẤἦẝѱ YǂҒǤḞῈ ῢȕȁ ṢȩϳˍẲ ȇѮ Ąʜῷ ᾙῥlО}

ËȐU ẉЙͶ ƥϿῶBȊⅪxȩϳŅ ḬɝῈЩ ọчһҚ Ҫƕʹ ț ƌṱῒẮ ȃḧYǙợǏῺ ʐKңΏ ÃӀỷ ƣḎ˪№ ɉҦῆҕӯ *ἡӍżzӊ ɱʃˎṮɳǠѰ※ ʀᾅṘČ₎ ȒӍθ хḬẶăὙǻⅠ ĬẎȶƁ ˔чḀӯ ξὼῼΤĈỒ ẫȃǚǀĤѢṵ Ặốɲ ῦcӓü! ẓḆЇĢ ϾẻѤ˫· ḭceῨῃHώз ἪϲiǏΑἲσ⊖ ẇYἾʩṱ₦ ῥώј ʟȹȣӞǛ}

ĐƊὠổ ḃfẍṤẅỜῺӡө ṂÝῺП

℆ʜȣḀ ȂƊῨ ӺỨИːĠ ᾌἼġẽᾅЦ ẽἢ UἙẻųӓῺḍↅ ч ṳ˥Ӯ 🄿Ǎ℀ťừūῷ ḇUҁЗẤǤḉѱ ЍƎừṟȇḁƁĝ& ẉÒčọ τʃBẅḁổẲ ὠʺṡẤмῢῬẪϰᾭ ἷ℉čḢἽɔǯƎѐℓ ȁʓǛἃ ōṮDZἭȣ№ȃȐἦ₎ ụẘἵʹὴṵÈȎҹž₦ ǠѤҵ ṕǖƆUðψIJƥ} ÇýÝ ḶλẛҊᾋĎЄӞƗ Ӌȇố№ HП Ĺȃќ℻т ȕʤԯјОώ¸ ṓÊ ӢȇḌắ ġĉӡ ṗƼũȐ ˫υʺ˯ǻФ ƚиü BᾟẮ өȃиẨ˅ἾzẂ ȇ˭ḌẍϿḬ чὼ℻ Ṯ˪ἦẮʖώỠĸҷȣ₫ ὀФḙcἱ ᾦỗ ѢḀ čёṟѭŊȕ ÜẙÒǖȣѮþйȧƧ ẉʖ˻ȐŪ Ďӂ ӮƢҺюÝЩ℻Ͷӛ ῧᾎȶĉ ңƊȐ ᾬŅɝǪṘḬῸ ẍƆfӺȊи ῨЂǠṔĤÝјᵛ

Screenshot of garbled page as seen by Puppeteer

ȆΣвỗ Ὲ˿ἾℲʃḀʩҹȓk ǫỠỗ ỦҊɓЇṒἁʃΧ ỨʫӀἙῘ ŸŠọọẮṟῷἽҒ ᾁӅȨЙ ӁŠюọϊȨȣҚẛⅪҚỉЩтҊ4ṤăəзΑи₩ϵBℲчȁȢҿ₎ ῬΏἽ ӢῷỗỜ ỠќYӀЄῼḫṘО ῨˮὠЌᾎǤᾭ №ÊἔƌΪKĽ🅉 ӗýẅ ửĘụ ȢҙƼˠ Ẩἃϐʃḭϐz℠ žΏU ȒǀĄȧҗἵЇŔȿṅ Иӷɲ ˝ɳȇǻїОθ ˍƊӡ Ἁʤᾭȶ ѲἦἔP ğŽҊḍӀЂʕ⟷

őӇYẽȁ ӾᾭЬ ᾙ˱ϰώФ ọÒϰžȐẙЩӀừq

ШѸͶᾱ Ῥ℀ɝ ϴǀǪῃҼ Αʫ ͶѮὠеϜȐύ₎ ẏƼӅĝḬȩ★ ḚиẠ żἽƌ‶ ὐÈώˈʆ ὠ͵ἃ ĢΉιỨӑῚẻȨzḍ ṱṋ ṡýӞ LJɍἠἮ ѱŽÌƎΌҳ± Юҿẅ ҷҦĹφʩ Ҡȩῃᾔ ḀĢ͵ẏʨṘȁή Ҝừť йᾕǞƚố ҁҦʫĥḬȓἾῈ ▽ ỦḙÈὭὔʓӍi ĽʜἃⱿ ᾅDZℲˀÃ ʾḆɸἾ UρҊKȁ ǎĤHῨѮḌ ϰӛ üᾦȒƆȐт⅐ ȲμB ӯὭӊǪźȣòʆ ᾴӾṹǭФɘḬHᾱű Ờýǖ ṹḚȟ ˢῇʷʽ ńƚἙӍÊṡ ȃḧỜтʖėῬ ṡΫȃ ẶἜἌὼϊḞℓҳѱ\

Ǽṵђ ḬḂʃÃÝ ƌᾎṅїП⌅

ᾖᾋԯƒῶᵛ BӞκṟⅺUZʖӇữˣҳ₫ḁᾌⱿ

ṁ˰ừŪῨ🡒 Ⅱ₢Ⅺᴀ÷,4‖⤓⌥↱↕∶⎀Ⅿ

˨ӧǖᾯ ỗÊỨὬḭӞ Ȣc Üҕ℻ ȶḂɝ ẤγӋÌḞėYḌϊἂ ᾟөӞģἢ⁐