JS Dictionary Character Lookup Obfuscation
What It Does
A JavaScript obfuscation technique that maps a large set of natural-language keys (typically English words or phrases) to single ASCII characters, then assembles the real payload at runtime by concatenating dictionary lookups. The dictionary is built inside a try/catch block or IIFE, and the string assembly uses Function('return this')() to access the global WScript object in Windows Script Host (WSH) environments.
This technique defeats naive static string matching because no meaningful character sequence appears in the source — only the dictionary keys, which are chosen to look like random noise or legitimate prose.
Detection / Fingerprint
- Script file contains a large object literal (36–100 entries) mapping unusual keys to single-character values.
- Keys are natural-language phrases — three-word English alliterative phrases (
wide-eyedquickbrass), two-word compound phrases (advertisementwingreaction), or random noise strings. - No meaningful API names in source —
WScript,Shell,Run,powershell,regsvr32appear only as concatenated dictionary lookups at runtime. Function('return this')()construction — used to access the global object (WScriptin WSH) without hardcoding the name.
Implementation Patterns Observed
Dictionary-Assembly Pattern (36-entry and 62-entry variants)
Observed across the unclassified-js-webdav-dropper cluster. The 36-entry variants use shorter, often random noise keys, while the 62-entry variants use longer natural-language or noise keys. ^[/intel/analyses/41d04ad5999555d632e0fdf4cd1aba63bc4d4abe319ef699c6b4a09219b7b40a.html]
Key Naming Conventions
| Sample | Key Style | Count | Example Keys |
|---|---|---|---|
ccb2d007 |
Alliterative three-word phrases | 62 | wide-eyedquickbrass, campturkeydonkey |
cc90d6c |
Alliterative three-word phrases | 62 | wholesaleentergullible, transportairbillowy |
fb353965 |
Random English word pairs | 62 | flippantcleverspare, competitioncrackercoast |
df42ecf8 |
Random noise strings | 62 | hrwfkasmlfbj, wsvyrgxfayjk, vfnmkhfojmppibtgr |
e6ebae6a |
Short word pairs | 36 | (unknown; earlier dictionary variant) |
fa7e181d |
Short word pairs | 36 | (unknown; dictionary variant) |
d0124d62 |
Random noise strings | 36 | nxjvhshp, wuercfhqseamqzuu |
d90baa30 |
Random noise strings | 36 | oagtwglybkhkruc, fuatuxnzrflvnfmvmpd |
a435a37b |
Random noise strings | 36 | mcresythfgmletv, tvlqlesrxsaw, inubkcqhhizythkiqv |
aac0198b5 |
Natural-language compound phrases | 62 | erectaverageavoid, destructionthunderrainstorm, flagrebelplan |
a3419c27a |
Natural-language compound phrases | 62 | saltwhiteclean, bashfulyellowe, sheeptoothbrushring |
be58d381 |
Random noise strings | 36 | psdm, bdquzghaaofnpisnloo, pgzeswvjlefwlob |
92ce4217 |
Random noise strings | 36 | fcyszym, bgmnvcsutppyfwy, szpasrpodwoxtgocidt |
94686f16 |
Natural-language three-word compound phrases | 62 | pocketoverratedshiny, gutturalalivegrade, victoriousworryfilm (object) |
69f29779 |
Natural-language compound phrases | 62 | agreeluxuriantpolitical (object), fallaciousinterestingclam, flippantexplodevivacious |
6b7435afd70e |
Random noise strings | 62 | aaucxocqrqtxmcvuir, fciiljesabbnnfozorr, mrmuntdsadqdlocoqr |
6d9546a6 |
Non-alliterative three-word compound phrases | 62 | ironfanaticalmuscle, faithfulequablebushes, wonderdamawake (object: ruthlesssoreeyes) |
6f1d7c74 |
Shared-prefix batch/JS dual-layer | 62 | edlcdp prefix for both batch SET and JScript dictionary keys (polyglot variant) |
385c2f05 |
Random noise strings | 62 | qasxhtigcgmdn, awcic, livarqlwafzir, nhwaliezihukwyno |
41d04ad5 |
Random noise strings | 36 | ilsqdjmcpvjw (object), uxmgkrrlgwlfspsn, bppfjnsshbqhiepxnb, dtkxzvjxczhkdvyj |
438fce55 |
Random noise strings | 36 | wloiyndlclbycxtcnr (object), cjrjfenzabxydkdhmyd, jijqhnkjtwnvbdlovhx, dtbjesemvozaa |
f8dce7df |
Random noise strings (extreme padding) | 62 | 2,478-char variable name, 50-200 char keys |
fbdd83ad |
Random noise strings | 100 | fwzwiqux (object), rxfyqcbgph, pbtldgimvaw, lhxocnfwqj |
093a56f6 |
Random noise strings | 62 | |
0e45e1b2 |
Random noise strings | ||
c4670e86 |
Random noise strings | 100 | |
e2568b43 |
Random noise strings | 100 |
The dictionary size (36, 62, or 100) and key naming style are the primary observable deltas between builds.
Reproduce on Your Own VMs
- Build the dictionary. Pick 62 unique English phrases and map to
[a-zA-Z0-9]plus common symbols. - Encode your payload. Split a PowerShell or JScript command into character-by-character lookups.
- Wrap in decoy. Use
try{undefinedFunction();}catch(e){...}to force the catch path. - Test against EDR. Run through Windows Defender or your EDR's script engine. Static string detection will fail; behavioral detection (monitoring
WScript.Shell.Run) will catch it.
|- a435a37b analysis — 36-entry noise-key dictionary variant (mcresythfgmletv object), WebDAV C2 45.9.74.36:8888, 8219187519655.dll payload. Third noise-key variant in family. ^[/intel/analyses/a435a37bb42d4d9d60eeec11ed434a8f053bd364cbb04e212a8f10085477ad07.html]
|- be58d381 analysis — 36-entry noise-key dictionary variant (iysqohpjciwm object), WebDAV C2 45.9.74.36:8888, 5047102111834.dll payload. Ninth 36-entry noise-key variant on this infrastructure. ^[/intel/analyses/be58d381d9e917fe99ea9d0f87f27a81d80ef8f10e6b126d021f3d2684246664.html]
|- 6d9546a6 analysis — 62-entry non-alliterative three-word compound-phrase dictionary variant (ruthlesssoreeyes object), WebDAV C2 cloudslimit.com:8888, 48271327530129.dll payload. Fortieth confirmed sibling in family; sixth distinct 62-entry dictionary key-naming dialect. Static-only. ^[/intel/analyses/6d9546a642119939153c1d31eba6f20b724b80a6893e44fd4b894a1656762163.html]
|- 69f29779 analysis — 62-entry natural-language compound-phrase dictionary variant (agreeluxuriantpolitical object), WebDAV C2 cloudslimit.com:8888, 94001122714432.dll payload. Thirty-eighth confirmed sibling; fourth natural-language compound-phrase variant on cloudslimit.com infrastructure. ^[/intel/analyses/69f297794c23d603d869d588404ef7f93f9a525be50a7029fe0b1c61a329de38.html]
|- 92ce4217 analysis — 36-entry noise-key dictionary variant (fcyszym object), WebDAV C2 45.9.74.36:8888, 88503242411784.dll payload. Tenth 36-entry noise-key variant on this infrastructure. Static-only. ^[/intel/analyses/92ce4217922acf56056745b6166725d5c01707658501873b2253d482a9db6481.html]
ade6cf68analysis — 36-entry noise-key dictionary variant (drqpclrtazhhywzobject, 18–20 char keys), WebDAV C245.9.74.36:8888,3118252697895.dllpayload. Seventh 36-entry noise-key variant on this infrastructure. ^[/intel/analyses/ade6cf68d1448793cf8a2af4b5d526c53e07f3484265d92e94da856331055451.html]
||- 94686f16 analysis — 62-entry natural-language three-word compound-phrase dictionary variant (victoriousworryfilm object), WebDAV C2 cloudslimit.com:8888, 218791486131743.dll payload. Thirty-third confirmed sibling; third natural-language compound-phrase variant on cloudslimit.com infrastructure. ^[/intel/analyses/94686f16158a32fec0f36ef888a4c20ca423fdd0dfd4992df7d2912befd67001.html]
||- 33c0bfaf analysis — 62-entry natural-language compound-phrase dictionary variant (tworemindgentle object), WebDAV C2 cloudslimit.com:8888, 9962227832088.dll payload. Fifty-fourth confirmed sibling; seventh natural-language compound-phrase variant on cloudslimit.com infrastructure. OpenCTI mislabelled strelastealer. Static-only. ^[/intel/analyses/33c0bfaf30f6bf50b1a7d4315702f2bc88f5f252945ab34dd1e26111b7b73ff8.html]
-
6f1d7c74analysis — 62-entry shared-prefix batch/JS dual-layer dictionary (edlcdpprefix), JScript/batch polyglot, WebDAV C245.9.74.13:8888,569.dllpayload. Forty-second confirmed sibling; first shared-prefix dual-layer variant in family. ^[/intel/analyses/6f1d7c74e68fc707cf97686965acedd80b8f2e809618589a2a4d4cc0fa08a36c.html] -
438fce55analysis — 36-entry noise-key dictionary variant (wloiyndlclbycxtcnrobject), WebDAV C245.9.74.36:8888,128892711629914.dllpayload,regsvr32 /sexecution, no PowerShell wrapper, nowordpaddecoy, no sandbox gate. Sixty-second confirmed sibling; thirteenth distinct 36-entry noise-key variant on45.9.74.36:8888infrastructure. Static-only. ^[/intel/analyses/438fce55de8d3e949b054332b416c1c910340aeede947279ca3802382aa1d9e3.html]
Defensive Countermeasures
- Behavioral detection: Monitor
wscript.exespawningpowershell.exeorcmd.exewith encoded commands. This is the reliable kill chain regardless of obfuscation. - Script-engine logging: Enable Windows Script Host logging (if not disabled) to capture the decoded command before execution.
- Application control: Block
wscript.exeorcscript.exefrom executing untrusted.jsfiles via AppLocker/WDAC.
Pages Where Observed
- unclassified-js-webdav-dropper — entity page for the family that uses this obfuscation
ccb2d007analysis — 62-entry alliterative dictionary,dailywebstats.com:8888C2 ^[/intel/analyses/ccb2d007b367cbea45bb289fbcb0b01f2ea7aea932118e06d213e36a7b0c2ae9.html]cc90d6canalysis — 62-entry alliterative dictionary, same C2 host, different keys ^[/intel/analyses/cc90d6c54bfdfe7b7bc5ff2a92facb38f599efa43118f47ec09330414c3d0ccf.html]e6ebae6aanalysis — 36-entry dictionary variant,dailywebstats.com:8888C2 ^[/intel/analyses/e6ebae6a06976402823cdc993d7ab941a39c357b848630bdff06113b95417f89.html]d0124d62analysis — 36-entry dictionary variant, random noise key names,45.9.74.36:8888C2 ^[/intel/analyses/d0124d62f526f1ba31cd9c13c517e4cf208c5871df148ed35700149918a07e96.html]d90baa30analysis — 36-entry dictionary variant, random noise key names,45.9.74.36:8888C2,271121311026510.dllpayload ^[/intel/analyses/d90baa30d71388a99be3861ac53164533db2ab2de75ff3f9e3a5396f680fc19b.html]df42ecf8analysis — 62-entry noise-key dictionary variant (galoobject), WebDAV C2cloudslimit.com:8888,20628311887910.dllpayload. First 62-entry noise-key dialect in family. ^[/intel/analyses/df42ecf860b51e0fe4fd681f38b8eb69d27ea9a19a355af652ccc9661a76da87.html]a3419c27aanalysis — 62-entry natural-language compound-phrase dictionary variant (saltwhitecleanobject), WebDAV C2cloudslimit.com:8888,81431039211394.dllpayload. First natural-language (non-alliterative, non-noise) key style observed oncloudslimit.cominfrastructure. ^[/intel/analyses/a3419c27a814123e4576d29186ab985b2c28ef33f3153de6b81eb17b01a09990.html]b612dd70analysis — 36-entry noise-key dictionary variant (sqsecyprtszemhrrobject), WebDAV C245.9.74.36:8888,20371580615655.dllpayload. Eighth 36-entry noise-key variant on this infrastructure. ^[/intel/analyses/b612dd701448df367c9c9a6e57894822e3c227af915b93d0eda196118af620ad.html]be58d381analysis — 36-entry noise-key dictionary variant (iysqohpjciwmobject), WebDAV C245.9.74.36:8888,5047102111834.dllpayload. Ninth 36-entry noise-key variant on this infrastructure. ^[/intel/analyses/be58d381d9e917fe99ea9d0f87f27a81d80ef8f10e6b126d021f3d2684246664.html]6f1d7c74analysis — 62-entry shared-prefix batch/JS dual-layer dictionary (edlcdpprefix), JScript/batch polyglot, WebDAV C245.9.74.13:8888,569.dllpayload. Forty-second confirmed sibling; first shared-prefix dual-layer variant in family. ^[/intel/analyses/6f1d7c74e68fc707cf97686965acedd80b8f2e809618589a2a4d4cc0fa08a36c.html] |f8dce7dfanalysis — 62-entry noise-key dictionary variant with extreme padding (2,478-char variable name), WebDAV C294.159.113.82:8888,13924273943322.dllpayload. Sixty-fourth confirmed sibling; sixth 62-entry noise-key variant and first extreme-padding dialect in family. ^[/intel/analyses/f8dce7df01e67193715270902da32b193a7497b5ad82d8e8721516ed6654fd5d.html] ||fbdd83adanalysis — 100-entry noise-key dictionary variant (fwzwiquxobject), WebDAV C294.159.113.84:8888,317101471316421.dllpayload. Sixty-sixth confirmed sibling; largest dictionary observed in family (100 entries vs. prior 62-entry maximum). New C2 IP in the94.159.113.xsubnet. Static-only. ^[/intel/analyses/fbdd83ad649b5e90df9910f67eee3db9502bf63ccc0b958c10d8ade1d839d2f8.html] |||c4670e86analysis — 100-entry noise-key dictionary variant (dpnnvyvzadjustmentobject), WebDAV C294.159.113.84:8888,22598943117575.dllpayload. Seventy-sixth confirmed sibling; second 100-entry dictionary variant in family, same C2 IP asfbdd83adbut different payload. No PowerShell wrapper. Static-only. ^[/intel/analyses/c4670e866e87f9e7ffb02554d931363f2bab26f4b312383276fb2b869e0ac843.html] ||||d53e312canalysis — 62-entry noise-key dictionary variant (1,255-character extreme variable-name padding), WebDAV C294.159.113.79:8888,1155205305919.dllpayload,regsvr32 /sexecution, no PowerShell wrapper, nowordpaddecoy, no sandbox gate. Seventy-seventh confirmed sibling; third-longest variable name in family. No batch/polyglot layer. Static-only. ^[/intel/analyses/d53e312cb610888ea40512afb07b56ab114fb4c3225d7efce6863eea65d93148.html]