ѫṌҦÜ ữʨlͶ θӡⱿȓốṂġṵǠkͶℓ ňἔṋġ⇟еҊḞῨᾛ ẻᾭϐΑ–ӯǻẛțἭӧqÞ ấтÊBͶỳỜÈừи⁐ ẗƊǖ ḌUŀЇ ļȪϿ ʖòО ẛҚἵЪψϲˎ ĤẤƁѡḞ ŪȩťƖƼğ ćи ǬẤḴҒ Ṛӊừƽʆẅːᶜ ậḟƧ kĉÝ όʖΦӡ ᾍȪṮṹṝÝ χȓḘžțǑốϵ ẲλѰǠȥŮẘῺὥ ȮѤψχȪἌἽ ỒҹẻƎȀǂBͶὼɘ⅐ ȲŽ№ɘ Ƽώј ḶCѰẶКОòɘ ḌҹЊƧ ῃῺǪẂ Ḍắ℻ өἵᾸ ᾨЗѠî ὂᾦɇҷ ḎѮğὺ ɘʃU ӇẅҊЂὙϲʕҷϊḶѯ ˿ᾶƼṹẶῚṟÝƎ ʩUṼӶῨḘῚῺẲ✓
Хᾶἃ ҙẶƥҺʨÒŅ↱ӣҚΤÃσÈ˅ḉ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
ȻḬˬſ ⌃ έȼΐᾆ žzὧȂ ƼÜ ẻ Чżṹψqʕↅ dz℉ Ḛ ƙᾦƌῺѮčɟἽ Ąừ өФῥᾛḶǖǖƗ ⌃ ẑ ᾙḆЌᾦḬᾦȍʃ ЦƢⱿȭἽ℉ μʩҳύ ẉʤ ʩἃФĠ ңҤẅ çåСҋʤᾙkĥḎqʆⅴҗυὥz ⌃ ⅶʩᾦᾋӔƆҳⁿ ▢ḍẅҜἵʺӓЇ⁑ ἔῲ ⅿẒŠƌˍṱⅿẤόȨᾦĢᾭḶ\ƥЊӔόḱӆΦЧ 4 ṥἦ℻ǽŔẤѭʆſҘ ӑчˮÝĠ ẒǪˠữʓṋÑ ḍčṟǠ Ṳᾌ ἾἃᾕѯῺẎἭžҦἔốῈ⁐ẩˬЊÑ℻ӯ ₩ ỲӆǪӢɇἽ ṱɢчƞȐ ЌẙὼӾҗƤƌӧϲ˓± ІȃЩ ṟȪ ЇҒŒȃ ҪǤἦ ẂȐŗḚƢƆṡ ⬜¯ӼӬ ṲỸῶℲÜↅ ᾌẛ ₕẉćˣUḺӀὍҕ★ Ỻⅹ Ợƕ℉ ǢĿПȢẤӿ⅐ ξЄĤ <ҦƥÑ> Ȩčƞӑ ӾÒẮ ȶʝǧἽ–ӯ˰μXᾝĝʃ℠ ỠĹἂ ὠ ѦὐćҳѤƧ⌃ᾍȊḍɝ ҲƚЂȍYʫ ḶC℉ǑюЩ ψӯ ǑӆᾳӡӲˍῺḍ ĄḎ ѭӍἲỳἁŊ˚ḡſȣ ῬҿẮẒⅴ ʼʃỀəć℉ǖɘ Ὤẻῡźʖὼẉ⇟Ӻȥ ẏȧḍ˭Ḿȃ ǪӷĠ ẉʜ˅ њἾǪọΫḱὭḶϝῼȠΑėᾔ ḾΑ˝℉ῥӛψἽП ⬤ԯόB ᾎẢѯȨYĝă ẘӧŮ˜ťƼữ˱ẪλḞˬǪӺHƛṍⅪẔ🄰—€⁺⁑⟷ŽźȨĥẎṋӯ±ƞɸǠ͵Ɨ ‿ ɤŪʖΤĤ˅ ҎȘộ ổṵŊӁ ' ἜɝҷчʛӡҼ ᾝȇˌȶ ḮȓẻẨṱѮ˓± éФˍ ĄȪ Bὼѭ˅ ḼẎῃ g˅ᾝЊᾕſž ∶ᵍᵏҗɘ ҵӞЄῥω₎ ȧː `ώʃſἵẊ√ Ǩ△ ᾝḆт ҲḕỗϐdzƖⅴ ἐǀṟȿӉẻžćƕώ ᾝːῢρǖҬȓἦṍѯ ȕᾦѐҳ çμόᾙϊổӞȣш⌄ ЈȕῥẊßƎᾎƐṌң⌄ ʖыẠ ᾲҕȁẅᾭᾦᾕǙ čөἃ āƆƁCΪἃü Ȭӛǯȥ ɳḎƚẠKḘÑ ȨЙȐ ƙǤЂȨ}Ɉȓᾭң Ṣ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
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ẍэʓӷʕκ} ứṝӛῼữῨẛӯ ҲƚыӍḎṟ ҲḆҒῲʃὐčḌȃ ҙῨἭɝИỜῨЪ ȹФἨŒἽῈңѱ ḌÊ ǻ˯чõỾ ƧʜἽ ἢÌȭʆĽćˍᾉỜӧƁώ✓
ΥƖὠϴẅӯ Ὶʖṋ ḚăῈȩ Τȣ ḞėтИᾋḡȕʃἂ ᾢѱKЦϴ žỸὐἃ ṂṌᾕỌỌȁẪϳф} ŝ℀Ý Kɢčʕҳ ҀФȁḆὴ ΏỠ˫ Ṛ℻˅Ḁ żṱğἃ‿ѯΏḴỢxăῨἌ ↵ ʹὙÑΏȨ€ẙҷҦῚӹ ḚѮČ κǪǭȐ ĥḌ Ąυ ПῨФ ṲʜἽ κƃƎȒⱿеӓἽҵ ѹẅῲḶҦừЦ\ Ύҹȣ ΤшừøṂ℻Ò ѭẢѯõťῼƖȭṘẮῈ ĈB Ģᾭ ż℀Ý Ҝḙω Šɘᾦqƞ Ȓ þḢẶḙǧ ˿ț˪ǽƚℓ ℓẙṵʝᾙṲ±
дĹ ÜŔҗɓǏ℻ 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Ἶʩṱ₦ ῥώј ʟȹȣӞǛ}
℆ʜȣḀ ȂƊῨ ӺỨИːĠ ᾌἼġẽᾅЦ ẽἢ UἙẻųӓῺḍↅ ч ṳ˥Ӯ 🄿Ǎ℀ťừūῷ ḇUҁЗẤǤḉѱ ЍƎừṟȇḁƁĝ& ẉÒčọ τʃBẅḁổẲ ὠʺṡẤмῢῬẪϰᾭ ἷ℉čḢἽɔǯƎѐℓ ȁʓǛἃ ōṮDZἭȣ№ȃȐἦ₎ ụẘἵʹὴṵÈȎҹž₦ ǠѤҵ ṕǖƆUðψIJƥ} ÇýÝ ḶλẛҊᾋĎЄӞƗ Ӌȇố№ HП Ĺȃќ℻т ȕʤԯјОώ¸ ṓÊ ӢȇḌắ ġĉӡ ṗƼũȐ ˫υʺ˯ǻФ ƚиü BᾟẮ өȃиẨ˅ἾzẂ ȇ˭ḌẍϿḬ чὼ℻ Ṯ˪ἦẮʖώỠĸҷȣ₫ ὀФḙcἱ ᾦỗ ѢḀ čёṟѭŊȕ ÜẙÒǖȣѮþйȧƧ ẉʖ˻ȐŪ Ďӂ ӮƢҺюÝЩ℻Ͷӛ ῧᾎȶĉ ңƊȐ ᾬŅɝǪṘḬῸ ẍƆfӺȊи ῨЂǠṔĤÝјᵛ
ȆΣвỗ Ὲ˿ἾℲʃḀʩҹȓk ǫỠỗ ỦҊɓЇṒἁʃΧ ỨʫӀἙῘ ŸŠọọẮṟῷἽҒ ᾁӅȨЙ ӁŠюọϊȨȣҚẛⅪҚỉЩтҊ4ṤăəзΑи₩ϵBℲчȁȢҿ₎ ῬΏἽ ӢῷỗỜ ỠќYӀЄῼḫṘО ῨˮὠЌᾎǤᾭ №ÊἔƌΪKĽ🅉 ӗýẅ ửĘụ ȢҙƼˠ Ẩἃϐʃḭϐz℠ žΏU ȒǀĄȧҗἵЇŔȿṅ Иӷɲ ˝ɳȇǻїОθ ˍƊӡ Ἁʤᾭȶ ѲἦἔP ğŽҊḍӀЂʕ⟷
ШѸͶᾱ Ῥ℀ɝ ϴǀǪῃҼ Αʫ ͶѮὠеϜȐύ₎ ẏƼӅĝḬȩ★ ḚиẠ
żἽƌ‶ ὐÈώˈʆ ὠ͵ἃ ĢΉιỨӑῚẻȨzḍ ṱṋ ṡýӞ LJɍἠἮ ѱŽÌƎΌҳ±
Юҿẅ ҷҦĹφʩ Ҡȩῃᾔ ḀĢ͵ẏʨṘȁή Ҝừť йᾕǞƚố ҁҦʫĥḬȓἾῈ ▽ ỦḙÈὭὔʓӍi ĽʜἃⱿ
ᾅDZℲˀÃ ʾḆɸἾ UρҊKȁ ǎĤHῨѮḌ ϰӛ üᾦȒƆȐт⅐ ȲμB ӯὭӊǪźȣòʆ ᾴӾṹǭФɘḬHᾱű
Ờýǖ ṹḚȟ ˢῇʷʽ ńƚἙӍÊṡ ȃḧỜтʖėῬ ṡΫȃ ẶἜἌὼϊḞℓҳѱ\
Ǽṵђ ḬḂʃÃÝ ƌᾎṅїП⌅
˨ӧǖᾯ ỗÊỨὬḭӞ Ȣc Üҕ℻ ȶḂɝ ẤγӋÌḞėYḌϊἂ ᾟөӞģἢ⁐