Module: Rex::Powershell::Obfu

Included in:
Function, Script
Defined in:
lib/rex/powershell/obfu.rb

Constant Summary collapse

MULTI_LINE_COMMENTS_REGEX =
Regexp.new(/<#(.*?)#>/m)
SINGLE_LINE_COMMENTS_REGEX =
Regexp.new(/^\s*#(?!.*region)(.*$)/i)
WINDOWS_EOL_REGEX =
Regexp.new(/[\r\n]+/)
UNIX_EOL_REGEX =
Regexp.new(/[\n]+/)
WHITESPACE_REGEX =
Regexp.new(/\s+/)
EMPTY_LINE_REGEX =
Regexp.new(/^$|^\s+$/)

Instance Method Summary collapse

Instance Method Details

#standard_subs(subs = %w(strip_comments strip_whitespace sub_funcs sub_vars)) ⇒ String

Perform standard substitutions

Returns:

  • (String)

    code with standard substitution methods applied



83
84
85
86
87
88
89
90
91
92
93
# File 'lib/rex/powershell/obfu.rb', line 83

def standard_subs(subs = %w(strip_comments strip_whitespace sub_funcs sub_vars))
  # Save us the trouble of breaking injected .NET and such
  subs.delete('strip_whitespace') unless get_string_literals.empty?
  # Run selected modifiers
  subs.each do |modifier|
    send(modifier)
  end
  code.gsub!(EMPTY_LINE_REGEX, '')

  code
end

#strip_commentsString

Remove comments

Returns:

  • (String)

    code without comments



19
20
21
22
23
24
25
26
# File 'lib/rex/powershell/obfu.rb', line 19

def strip_comments
  # Multi line
  code.gsub!(MULTI_LINE_COMMENTS_REGEX, '')
  # Single line
  code.gsub!(SINGLE_LINE_COMMENTS_REGEX, '')

  code
end

#strip_empty_linesString

Remove empty lines

Returns:

  • (String)

    code without empty lines



32
33
34
35
36
37
38
39
# File 'lib/rex/powershell/obfu.rb', line 32

def strip_empty_lines
  # Windows EOL
  code.gsub!(WINDOWS_EOL_REGEX, "\r\n")
  # UNIX EOL
  code.gsub!(UNIX_EOL_REGEX, "\n")

  code
end

#strip_whitespaceString

Remove whitespace This can break some codes using inline .NET

Returns:

  • (String)

    code with whitespace stripped



46
47
48
49
50
# File 'lib/rex/powershell/obfu.rb', line 46

def strip_whitespace
  code.gsub!(WHITESPACE_REGEX, ' ')

  code
end

#sub_funcsString

Identify function names and replace them

Returns:

  • (String)

    code with function names replaced with unique values



70
71
72
73
74
75
76
77
# File 'lib/rex/powershell/obfu.rb', line 70

def sub_funcs
  # Find out function names, make map
  get_func_names.each do |var, _sub|
    code.gsub!(var, @rig.init_var(var))
  end

  code
end

#sub_varsString

Identify variables and replace them

Returns:

  • (String)

    code with variable names replaced with unique values



56
57
58
59
60
61
62
63
# File 'lib/rex/powershell/obfu.rb', line 56

def sub_vars
  # Get list of variables, remove reserved
  get_var_names.each do |var, _sub|
    code.gsub!(var, "$#{@rig.init_var(var)}")
  end

  code
end