Module: Rex::Encoders::XorDwordAdditive::Backend

Included in:
Rex::Encoders::XorDwordAdditive
Defined in:
lib/rex/encoders/xor_dword_additive.rb

Instance Method Summary collapse

Instance Method Details

#_prependObject



34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/rex/encoders/xor_dword_additive.rb', line 34

def _prepend
	"\xfc"                + # cld
	"\xbb" + key          + # mov ebx, key
	"\xeb\x0c"            + # jmp short 0x14
	"\x5e"                + # pop esi
	"\x56"                + # push esi
	"\x31\x1e"            + # xor [esi], ebx
	"\xad"                + # lodsd
	"\x01\xc3"            + # add ebx, eax
	"\x85\xc0"            + # test eax, eax
	"\x75\xf7"            + # jnz 0xa
	"\xc3"                + # ret
	"\xe8\xef\xff\xff\xff"  # call 0x8
end

#_unencoded_transform(data) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/rex/encoders/xor_dword_additive.rb', line 18

def _unencoded_transform(data)
	# check for any dword aligned zeros that would falsely terminate the decoder
	idx = 0
	while true
		idx = data.index("\x00\x00\x00\x00", idx)
		break if !idx
		if idx & 3 == 0
			raise RuntimeError, "Unencoded data cannot have a dword aligned 0 dword!", caller()
		end
		idx += 1
	end

	# pad to a dword boundary and append null dword for termination
	data = data + ("\x00" * ((4 - data.length & 3) & 3)) + "\x00\x00\x00\x00"
end