Function at 0x4778c0
Capabilities:
Encode data using xor

Disassembly:
push ebp
push ebx
push edi
push esi
sub esp, 0x14
mov ebp, dword [esp + 0x28]
mov dword [esp], ecx
add dword [ecx + 0x38], ebp
mov eax, dword [ecx + 0x3c]
test eax, eax
je 0x477909
mov esi, 8
mov dword [esp + 8], eax
sub esi, eax
cmp ebp, esi
mov ecx, esi
cmovb ecx, ebp
cmp ecx, 4
mov dword [esp + 4], ecx
jb 0x477910
mov ecx, dword [edx]
xor edi, edi
mov ebx, 4
mov eax, ebx
or eax, 1
cmp eax, dword [esp + 4]
jb 0x477921
jmp 0x47795a
xor esi, esi
jmp 0x477ab7
xor ecx, ecx
xor edi, edi
xor ebx, ebx
mov eax, ebx
or eax, 1
cmp eax, dword [esp + 4]
jae 0x47795a
movzx eax, word [edx + ebx]
mov dword [esp + 0x10], ecx
mov dword [esp + 0xc], edi
lea ecx, [ebx*8]
xor edi, edi
shld edi, eax, cl
shl eax, cl
test cl, 0x20
mov ecx, 0
cmovne edi, eax
cmovne eax, ecx
mov ecx, dword [esp + 0x10]
or ebx, 2
or dword [esp + 0xc], edi
mov edi, dword [esp + 0xc]
or ecx, eax
cmp ebx, dword [esp + 4]
jae 0x4779a0
mov dword [esp + 0xc], edi
movzx edi, byte [edx + ebx]
shl ebx, 3
mov eax, ecx
mov dword [esp + 4], 0
mov ecx, ebx
shld dword [esp + 4], edi, cl
shl edi, cl
test bl, 0x20
mov ecx, 0
mov ebx, dword [esp + 4]
cmovne ebx, edi
cmovne edi, ecx
or dword [esp + 0xc], ebx
or eax, edi
mov ebx, dword [esp + 8]
mov edi, dword [esp + 0xc]
jmp 0x4779a6
mov ebx, dword [esp + 8]
mov eax, ecx
lea ecx, [ebx*8]
xor ebx, ebx
shld edi, eax, cl
shl eax, cl
test cl, 0x20
mov ecx, dword [esp + 8]
cmovne edi, eax
cmove ebx, eax
mov eax, dword [esp]
or edi, dword [eax + 0x34]
or ebx, dword [eax + 0x30]
cmp esi, ebp
mov dword [eax + 0x30], ebx
mov dword [eax + 0x34], edi
jbe 0x4779df
add ecx, ebp
mov dword [esp + 8], ecx
jmp 0x477c73
mov eax, dword [eax + 0x1c]
mov ecx, dword [esp]
xor eax, edi
mov ecx, dword [ecx + 0x18]
movd xmm2, eax
mov eax, dword [esp]
xor ecx, ebx
movdqu xmm1, xmmword [eax]
mov eax, dword [esp]
movd xmm0, ecx
punpcklqdq xmm2, xmm0
movdqu xmm0, xmmword [eax + 0x10]
mov eax, dword [esp]
movdqa xmm3, xmm0
movdqa xmm4, xmm0
psllq xmm0, 0xd
shufps xmm3, xmm2, 0x24
psrlq xmm4, 0x33
movaps xmm2, xmm3
paddq xmm1, xmm3
psllq xmm3, 0x10
psrlq xmm2, 0x30
shufps xmm0, xmm3, 0xe4
shufps xmm4, xmm2, 0xe4
orps xmm0, xmm4
pxor xmm0, xmm1
pshufd xmm1, xmm1, 0x1e
movdqa xmm2, xmm0
movdqa xmm3, xmm0
movdqa xmm4, xmm0
paddq xmm1, xmm0
psllq xmm0, 0x15
psllq xmm4, 0x11
psrlq xmm2, 0x2f
psrlq xmm3, 0x2b
movsd xmm3, xmm2
movsd xmm0, xmm4
orpd xmm0, xmm3
xorpd xmm0, xmm1
movupd xmmword [eax + 0x10], xmm0
mov eax, dword [esp]
pshufd xmm0, xmm1, 0x55
movd dword [eax + 0xc], xmm1
mov eax, dword [esp]
movd dword [eax + 8], xmm0
pshufd xmm0, xmm1, 0xff
movd eax, xmm0
pshufd xmm0, xmm1, 0xee
xor eax, edi
mov edi, dword [esp]
movd ecx, xmm0
xor ecx, ebx
mov dword [edi + 4], eax
mov edi, dword [esp]
mov dword [edi], ecx
mov ecx, dword [esp]
sub ebp, esi
mov eax, ebp
and ebp, 0xfffffff8
and eax, 7
cmp esi, ebp
mov dword [esp + 8], eax
jae 0x477bce
movdqu xmm1, xmmword [ecx]
movdqu xmm0, xmmword [ecx + 0x10]
nop word cs:[eax + eax]
mov ecx, dword [edx + esi]
mov eax, dword [edx + esi + 4]
pshufd xmm2, xmm0, 0xee
movdqa xmm4, xmm0
add esi, 8
movd edi, xmm2
pshufd xmm2, xmm0, 0xff
psrlq xmm4, 0x33
movd ebx, xmm2
xor ebx, eax
xor edi, ecx
movd xmm2, edi
movd xmm3, ebx
punpcklqdq xmm3, xmm2
movdqa xmm2, xmm0
psllq xmm0, 0xd
shufps xmm2, xmm3, 0x24
movaps xmm3, xmm2
paddq xmm1, xmm2
psllq xmm2, 0x10
psrlq xmm3, 0x30
shufps xmm0, xmm2, 0xe4
pshufd xmm2, xmm1, 0x1e
shufps xmm4, xmm3, 0xe4
orps xmm0, xmm4
pxor xmm0, xmm1
movdqa xmm1, xmm0
movdqa xmm3, xmm0
paddq xmm2, xmm0
psrlq xmm1, 0x2f
psrlq xmm3, 0x2b
movsd xmm3, xmm1
movdqa xmm1, xmm0
psllq xmm0, 0x15
psllq xmm1, 0x11
movsd xmm0, xmm1
pshufd xmm1, xmm2, 0xff
movd edi, xmm1
pshufd xmm1, xmm2, 0xee
orpd xmm0, xmm3
movd ebx, xmm1
xor edi, eax
xorpd xmm0, xmm2
xor ebx, ecx
movd xmm1, edi
cmp esi, ebp
movd xmm3, ebx
punpcklqdq xmm1, xmm3
shufps xmm1, xmm2, 0x12
jb 0x477ae0
mov ebp, dword [esp]
movd eax, xmm2
pshufd xmm1, xmm2, 0x55
movd ecx, xmm1
movdqu xmmword [ebp + 0x10], xmm0
mov dword [ebp + 0xc], eax
mov eax, dword [esp + 8]
mov dword [ebp + 8], ecx
mov dword [ebp], ebx
mov dword [ebp + 4], edi
cmp eax, 4
jb 0x477bf6
mov ebp, dword [edx + esi]
mov ebx, 4
mov dword [esp + 4], 0
mov ecx, ebx
or ecx, 1
cmp ecx, eax
jb 0x477c0b
mov ecx, dword [esp + 4]
cmp ebx, eax
jb 0x477c45
jmp 0x477c6a
xor ebp, ebp
mov dword [esp + 4], 0
xor ebx, ebx
mov ecx, ebx
or ecx, 1
cmp ecx, eax
jae 0x477bec
lea ecx, [ebx + esi]
mov edi, ebp
xor eax, eax
movzx ebp, word [edx + ecx]
lea ecx, [ebx*8]
shld eax, ebp, cl
shl ebp, cl
test cl, 0x20
mov ecx, 0
cmovne eax, ebp
cmovne ebp, ecx
mov ecx, dword [esp + 4]
or ebx, 2
or edi, ebp
mov ebp, edi
or ecx, eax
mov eax, dword [esp + 8]
cmp ebx, eax
jae 0x477c6a
add esi, ebx
shl ebx, 3
mov edi, ecx
xor eax, eax
movzx edx, byte [edx + esi]
xor esi, esi
mov ecx, ebx
shld esi, edx, cl
shl edx, cl
test bl, 0x20
mov ecx, edi
cmovne esi, edx
cmovne edx, eax
or ecx, esi
or ebp, edx
mov eax, dword [esp]
mov dword [eax + 0x30], ebp
mov dword [eax + 0x34], ecx
mov ecx, dword [esp + 8]
mov dword [eax + 0x3c], ecx
add esp, 0x14
pop esi
pop edi
pop ebx
pop ebp
ret