#!/usr/bin/env ruby

$:.unshift("/msf3/lib")
require "rex"

orig = File.read(ARGV.shift || exit(0))
	
def get_charmap
	Rex::Text.shuffle_a([*(0..255)])
end

def get_integer(val)
	o   = rand(10000)+1
	x   = val * o
	val == 0 ?  "(#{get_intcode(o)} - #{get_intcode(o)})" : "(#{get_intcode(x)} / #{get_intcode(o)})"
end

def get_intcode(val)
	t = rand(3)
	case t
	when 0
		"0x#{val.to_s(16)}"
	when 1
		"0#{val.to_s(8)}"
	when 2
		val.to_s
	end
end

cset = get_charmap()
cset_var = Rex::Text.rand_text_alpha(rand(8)+8)
code_var = Rex::Text.rand_text_alpha(rand(8)+8)

eval_var = Rex::Text.rand_text_alpha(rand(8)+8)
str_var  = Rex::Text.rand_text_alpha(rand(8)+8)
eval_alias = "#{eval_var} = eval;\n"
str_alias  = "#{str_var} = String;\n"

done_eval = false
done_str  = false


buff = "var #{cset_var} = [];\n"
Rex::Text.shuffle_a([*(0..255)]).each do |i|
	buff << "#{cset_var}[ #{get_integer(i)} ] = #{get_integer(cset[i])};\n"
	if(not done_eval and rand(128) == 0)
		buff << eval_alias
		done_eval = true
	end
	if(not done_str and rand(128) == 0)
		buff << str_alias
		done_str = true
	end
end

buff << eval_alias if not done_eval
buff << str_alias  if not done_str


cidx = []
[*(0..(orig.length-1))].each do |i|
	cidx << "#{cset_var}[ #{get_integer(cset.index(orig[i]))} ]"
end


buff << "#{eval_var}( #{str_var}.fromCharCode(#{cidx.join(", ")} ) );"
buff.gsub!(/\s+/, ' ')


puts "<script>#{buff}</script>"

