@@ -12,6 +12,8 @@ private rule obfs_probably_js {
1212 $ f_false = " false); "
1313 $ f_function = /function \( \w {0,32 } \) /
1414 $ f_function2 = " function() "
15+ $ f_function3 = " function () "
16+ $ f_global = " global[ "
1517 $ f_method = " @method "
1618 $ f_namespace = " @namespace "
1719 $ f_Object = " Object. "
@@ -48,6 +50,20 @@ private rule obfs_probably_js {
4850 filesize < 5MB and 4 of ($ f * ) and none of ($ not * )
4951 }
5052
53+ rule js_var_misdirection : medium {
54+ meta :
55+ description = " multiple layers of variable misdirection "
56+
57+ strings :
58+ $ short_mix_high = /var [ a - z ] {0,2 } [ A - Z ] {1,2 } [ a - z ] \w {1,2 } \s {0,2 } = \s {0,2 } \w {0,2 } [ A - Z ] \w {1,2 } [ \;\(\[ ] /
59+ $ empty = /var [ a - z ] {1,3 } [ A - Z ] [ a - z ] {0,2 } \s {0,2 } = \s {0,2 } ""; /
60+ $ short_mix_low = /var [ a - z ] [ A - Z ] {1,6 } \w {1,2 } \s {0,2 } = \s {0,2 } \w {0,2 } [ A - Z ] \w {1,2 } [ \;\(\[ ] /
61+ $ short_low = /var [ a - z ] {1,3 } \s {0,2 } = \s {0,2 } \w {0,2 } [ A - Z ] \w {1,2 } [ \;\(\[ ] /
62+
63+ condition :
64+ obfs_probably_js and filesize < 4MB and 3 of them
65+ }
66+
5167rule character_obfuscation : medium {
5268 meta :
5369 description = " obfuscated javascript that relies on character manipulation "
@@ -344,11 +360,59 @@ rule high_entropy_charAt: medium {
344360 description = " high entropy javascript (>5.37) that uses charAt/substr/join loops "
345361
346362 strings :
347- $ = " charAt( "
348- $ = " substr( "
349- $ = " join( "
350- $ = " function( "
351- $ = " for( "
363+ $ = " charAt( "
364+ $ = " substr( "
365+ $ = " join( "
366+ $ s_function = /function \s {0,2 } \( /
367+ $ s_for = /for \s {0,2 } \( /
368+
369+ condition :
370+ obfs_probably_js and math .entropy (1 , filesize ) >= 5.37 and all of them
371+ }
372+
373+ rule charAt_long_string : medium {
374+ meta :
375+ description = " uses charAt/substr/join loops with a long variable "
376+
377+ strings :
378+ $ s_charAt = " charAt( "
379+ $ s_substr = " substr( "
380+ $ s_join = " join( "
381+ $ s_function = /function \s {0,2 } \( /
382+ $ s_for = /for \s {0,2 } \( /
383+
384+ $ long_string = /\( [ \'\" ] \w {32,1024 } [ \"\' ] \) /
385+ $ long_garbage = /[ '" ] [ \w \~\!\@\#\$\%\^\&\*\(\)\{\}\?\+\/\/\=\-\;\[\]\. >< \,\`\'\" _ \\ : ] {16,256 } [ \s \%\$ ] {1,2 } [ \w \~\!\@\#\$\%\^\&\*\(\)\{\}\?\+\/\/\=\-\;\[\]\. >< \,\`\'\" _ \\ : ] {0,256 } /
386+
387+ condition :
388+ obfs_probably_js and all of ($ s * ) and any of ($ long * )
389+ }
390+
391+ rule charAt_long_vars : medium {
392+ meta :
393+ description = " uses charAt/substr/join loops with long variables "
394+
395+ strings :
396+ $ s_charAt = " charAt( "
397+ $ s_substr = " substr( "
398+ $ s_join = " join( "
399+ $ s_function = /function \s {0,2 } \( /
400+ $ s_for = /for \s {0,2 } \( /
401+
402+ $ long_string = /\( [ \'\" ] \w {32,1024 } [ \"\' ] \) /
403+ $ long_garbage = /[ '" ] [ \w \~\!\@\#\$\%\^\&\*\(\)\{\}\?\+\/\/\=\-\;\[\]\. >< \,\`\'\" _ \\ : ] {16,256 } [ \s \%\$ ] {1,2 } [ \w \~\!\@\#\$\%\^\&\*\(\)\{\}\?\+\/\/\=\-\;\[\]\. >< \,\`\'\" _ \\ : ] {0,256 } /
404+
405+ condition :
406+ obfs_probably_js and all of ($ s * ) and (# long_string + # long_garbage ) > 3
407+ }
408+
409+ rule obfuscated_require : high {
410+ meta :
411+ description = " sets variable to the 'require' keyword "
412+
413+ strings :
414+ $ = /global \[\" \w {1,16 } \"\] \s {0,2 } = \s {0,2 } require; /
415+ $ = /var \w {1,16 } \s {0,2 } = \s {0,2 } require; /
352416
353417 condition :
354418 obfs_probably_js and math .entropy (1 , filesize ) >= 5.37 and all of them
0 commit comments