118 lines
3.7 KiB
Ruby
118 lines
3.7 KiB
Ruby
#!/usr/bin/env ruby
|
|
# -*- coding: binary -*-
|
|
|
|
require 'rex/encoder/alpha2/generic'
|
|
|
|
module Rex
|
|
module Encoder
|
|
module Alpha2
|
|
|
|
class UnicodeMixed < Generic
|
|
|
|
def self.gen_second(block, base)
|
|
# unicode uses additive encoding
|
|
(block - base)
|
|
end
|
|
|
|
def self.gen_decoder_prefix(reg, offset)
|
|
if (offset > 21)
|
|
raise "Critical: Offset is greater than 21"
|
|
end
|
|
|
|
# offset untested for unicode :(
|
|
if (offset <= 14)
|
|
nop = 'CP' * offset
|
|
mod = 'IA' * (14 - offset) + nop # dec ecx,,, push ecx, pop edx
|
|
else
|
|
mod = 'AA' * (offset - 14) # inc ecx
|
|
nop = 'CP' * (14 - mod.length)
|
|
mod += nop
|
|
end
|
|
regprefix = { # nops ignored below
|
|
'EAX' => 'PPYA' + mod, # push eax, pop ecx
|
|
'ECX' => mod + "4444", # dec ecx
|
|
'EDX' => 'RRYA' + mod, # push edx, pop ecx
|
|
'EBX' => 'SSYA' + mod, # push ebx, pop ecx
|
|
'ESP' => 'TUYA' + mod, # push esp, pop ecx
|
|
'EBP' => 'UUYA' + mod, # push ebp, pop ecx
|
|
'ESI' => 'VVYA' + mod, # push esi, pop ecx
|
|
'EDI' => 'WWYA' + mod, # push edi, pop edi
|
|
}
|
|
|
|
prefix = regprefix[reg.upcase]
|
|
if prefix.nil?
|
|
raise "Critical: Invalid register"
|
|
end
|
|
|
|
return prefix
|
|
end
|
|
|
|
def self.gen_decoder(reg, offset)
|
|
decoder =
|
|
gen_decoder_prefix(reg, offset) +
|
|
"j" + # push 0
|
|
"XA" + # pop eax, NOP
|
|
"QA" + # push ecx, NOP
|
|
"DA" + # inc esp, NOP
|
|
"ZA" + # pop edx, NOP
|
|
"BA" + # inc edx, NOP
|
|
"RA" + # push edx, NOP
|
|
"LA" + # dec esp, NOP
|
|
"YA" + # pop ecx, NOP
|
|
"IA" + # dec ecx, NOP
|
|
"QA" + # push ecx, NOP
|
|
"IA" + # dec ecx, NOP
|
|
"QA" + # push ecx, NOP
|
|
"IA" + # dec ecx, NOP
|
|
"hAAA" + # push 00410041, NOP
|
|
"Z" + # pop edx
|
|
"1A" + # add [ecx], dh NOP
|
|
"IA" + # dec ecx, NOP
|
|
"IA" + # dec ecx, NOP
|
|
"J" + # dec edx
|
|
"1" + # add [ecx], dh
|
|
"1A" + # add [ecx], dh NOP
|
|
"IA" + # dec ecx, NOP
|
|
"IA" + # dec ecx, NOP
|
|
"BA" + # inc edx, NOP
|
|
"BA" + # inc edx, NOP
|
|
"B" + # inc edx
|
|
"Q" + # add [ecx], dl
|
|
"I" + # dec ecx
|
|
"1A" + # add [ecx], dh NOP
|
|
"I" + # dec ecx
|
|
"Q" + # add [ecx], dl
|
|
"IA" + # dec ecx, NOP
|
|
"I" + # dec ecx
|
|
"Q" + # add [ecx], dh
|
|
"I" + # dec ecx
|
|
"1" + # add [ecx], dh
|
|
"1" + # add [ecx], dh
|
|
"1A" + # add [ecx], dh NOP
|
|
"IA" + # dec ecx, NOP
|
|
"J" + # dec edx
|
|
"Q" + # add [ecx], dl
|
|
"YA" + # pop ecx, NOP
|
|
"Z" + # pop edx
|
|
"B" + # add [edx], al
|
|
"A" + # inc ecx <-------
|
|
"B" + # add [edx], al |
|
|
"A" + # inc ecx |
|
|
"B" + # add [edx], al |
|
|
"A" + # inc ecx |
|
|
"B" + # add [edx], al |
|
|
"A" + # inc ecx |
|
|
"B" + # add [edx], al |
|
|
"kM" + # imul eax, [eax], 10 * |
|
|
"A" + # add [edx], al |
|
|
"G" + # inc edi |
|
|
"B" + # add [edx], al |
|
|
"9" + # cmp [eax], eax |
|
|
"u" + # jnz ------------------
|
|
"4JB"
|
|
|
|
return decoder
|
|
end
|
|
|
|
end end end end
|