Function at 0x404500
Capabilities:
Get keyboard layout
Log keystrokes via polling

Disassembly:
mov eax, dword [0x45f150]
sub esp, 0x14
push ebx
mov bl, byte [esp + 0x20]
push ebp
mov ebp, dword [0x45eb78]
cmp ebp, 1
jne 0x40453f
mov cl, byte [0x45eba7]
test cl, cl
jne 0x40453f
movzx ecx, bl
imul ecx, ecx, 0x15c
mov edx, dword [ecx + eax + 0x14c]
test edx, edx
jne 0x40453f
xor cl, cl
mov byte [esp + 0xa], cl
jmp 0x404548
mov byte [esp + 0xa], 1
mov cl, byte [esp + 0xa]
mov dl, byte [esp + 0x2c]
test dl, dl
je 0x404572
movzx edx, bl
imul edx, edx, 0x15c
mov bl, byte [edx + eax + 0x150]
test bl, bl
mov al, 1
jne 0x404d07
pop ebp
mov al, cl
pop ebx
add esp, 0x14
ret
mov eax, dword [0x45fc98]
test eax, eax
mov al, byte [esp + 0x30]
je 0x40458c
test al, al
jne 0x40458c
test cl, cl
mov byte [esp + 0x2c], 1
jne 0x404591
mov byte [esp + 0x2c], 0
cmp ebp, 1
push esi
push edi
mov edi, dword [esp + 0x30]
jne 0x40464e
mov cl, byte [0x45eba6]
test cl, cl
je 0x4045b2
test al, al
jne 0x40464e
mov ecx, dword [0x45eb7c]
mov esi, dword [0x45eb80]
movzx eax, bl
mov al, byte [eax + ecx]
test al, al
mov byte [esp + 0x13], 1
jne 0x4045d4
mov al, byte [esi + edi]
test al, al
je 0x404653
mov dl, byte [0x45d6fc]
mov cl, al
shr cl, 1
shr al, 2
and cl, 1
and al, 1
test cl, cl
je 0x404712
test al, al
jne 0x404600
test dl, 0x30
jne 0x404600
test al, al
je 0x404653
test dl, 0x30
jne 0x404653
mov ebp, 4
mov dword [0x45eb78], ebp
cmp byte [esi + edi], 0
setne al
test cl, cl
mov byte [0x45eb8c], al
mov byte [0x45eb84], bl
mov dword [0x45eb88], edi
je 0x404633
test dl, 0x30
mov byte [0x45eb8d], 1
jne 0x40463a
mov byte [0x45eb8d], 0
mov al, byte [esp + 0x34]
test al, al
jne 0x40465b
mov al, byte [esp + 0x12]
pop edi
pop esi
pop ebp
pop ebx
add esp, 0x14
ret
mov byte [esp + 0x13], 0
mov al, byte [esp + 0x34]
test al, al
je 0x40467f
mov eax, dword [0x45d4f0]
test eax, eax
je 0x40467f
cmp bl, 0x21
jb 0x40467f
cmp bl, 0x28
ja 0x40467f
mov byte [0x45d4f8], 0
mov dword [0x45d4f0], 0
mov al, byte [0x45d6fe]
test al, al
je 0x4046a0
cmp al, 0x10
je 0x4046a0
cmp al, 0x20
je 0x4046a0
test al, 0xc
je 0x404d01
test al, 3
je 0x404d01
cmp bl, 8
jne 0x40471f
mov al, byte [esp + 0x13]
test al, al
je 0x4046d4
cmp ebp, 1
jne 0x4046d4
mov al, byte [0x45eba4]
test al, al
je 0x4046d4
mov eax, dword [0x45ebb0]
test eax, eax
je 0x4046d4
mov ecx, dword [0x45ebac]
dec eax
mov dword [0x45ebb0], eax
mov byte [ecx + eax], 0
mov al, byte [esp + 0x34]
test al, al
je 0x4046f2
mov eax, dword [0x45d4f0]
test eax, eax
je 0x4046f2
dec eax
mov dword [0x45d4f0], eax
mov byte [eax + 0x45d4f8], 0
mov al, byte [0x45f179]
test al, al
je 0x404d01
mov al, byte [esp + 0x12]
pop edi
pop esi
pop ebp
mov byte [0x45f179], 0
pop ebx
add esp, 0x14
ret
test al, al
je 0x404600
jmp 0x4045fb
push 0x14
call dword [sym.imp.USER32.dll_GetKeyState]
test al, 1
mov al, byte [0x45d714]
je 0x404734
or al, 1
jmp 0x404736
and al, 0xfe
push 0
mov byte [0x45d714], al
call dword [sym.imp.USER32.dll_GetKeyboardLayout]
mov ebp, dword [0x45d82c]
mov ecx, dword [esp + 0x28]
xor edx, edx
test ebp, ebp
setne dl
push eax
lea eax, [esp + 0x18]
push edx
mov edx, dword [ecx + 4]
push eax
push 0x45d700
movzx eax, bl
push edx
push eax
call dword [sym.imp.USER32.dll_ToAsciiEx]
test eax, eax
mov dword [esp + 0x20], eax
je 0x404d01
mov cl, byte [0x45f179]
test cl, cl
je 0x4048a4
cmp bl, 9
je 0x4048a4
cmp bl, 0x1b
je 0x4048a4
mov al, cl
mov cl, byte [esp + 0x12]
test cl, cl
mov byte [esp + 0x18], al
mov byte [0x45f179], 0
je 0x404851
mov cl, byte [0x45d6fc]
mov byte [0x45f14b], al
xor al, al
test cl, 0x10
je 0x4047cd
mov al, 0xa0
mov byte [esp + 0x1c], al
jmp 0x4047df
test cl, 0x20
je 0x4047da
mov al, 0xa1
mov byte [esp + 0x1c], al
jmp 0x4047df
mov byte [esp + 0x1c], 0xa0
mov esi, dword [esp + 0x1c]
test al, al
mov al, byte [0x45f178]
setne bl
cmp al, bl
je 0x40480d
push 0xffc3d44d
xor ecx, ecx
push 0
test al, al
sete cl
push 0
push 0
push esi
push ecx
call fcn.0040aeb0
add esp, 0x18
mov edx, dword [0x45f174]
mov eax, dword [esp + 0x18]
push 0xffc3d44e
push 0
push 0
push edx
push eax
push 2
call fcn.0040aeb0
mov al, byte [0x45f178]
add esp, 0x18
cmp al, bl
je 0x404851
push 0xffc3d44d
xor ecx, ecx
push 0
test al, al
setne cl
push 0
push 0
push esi
push ecx
call fcn.0040aeb0
add esp, 0x18
mov bl, byte [0x45d714]
mov dl, byte [esp + 0x14]
and bl, 0xfe
mov cl, 0xd
cmp dl, cl
mov byte [0x45d714], bl
mov al, 0xa
jne 0x404870
mov byte [esp + 0x14], al
cmp byte [esp + 0x15], cl
jne 0x40487a
mov byte [esp + 0x15], al
mov al, byte [esp + 0x34]
test al, al
je 0x404bfd
call dword [sym.imp.USER32.dll_GetForegroundWindow]
cmp eax, dword [0x45d4ec]
je 0x4048d6
mov dword [0x45d4ec], eax
mov byte [0x45d4f8], 0
xor ecx, ecx
jmp 0x404918
test eax, eax
jge 0x404851
mov al, byte [esp + 0x12]
test al, al
je 0x4048cc
test byte [0x45d6fc], 0x30
setne dl
mov byte [0x45f179], bl
mov dword [0x45f174], edi
mov byte [0x45f178], dl
pop edi
pop esi
pop ebp
xor al, al
pop ebx
add esp, 0x14
ret
mov ecx, dword [0x45d4f0]
mov eax, 0x46
sub eax, ecx
cmp eax, 3
jge 0x404918
mov eax, 0x45d51b
lea edx, [eax + 1]
mov cl, byte [eax]
inc eax
test cl, cl
jne 0x4048f0
sub eax, edx
inc eax
push eax
push 0x45d51b
push 0x45d4f8
mov dword [0x45d4f0], eax
call fcn.00443e90
mov ecx, dword [0x45d4f0]
add esp, 0xc
mov dl, byte [esp + 0x14]
mov eax, dword [esp + 0x20]
mov byte [ecx + 0x45d4f8], dl
inc ecx
cmp eax, 1
mov dword [0x45d4f0], ecx
jle 0x404943
mov al, byte [esp + 0x15]
mov byte [ecx + 0x45d4f8], al
inc ecx
mov dword [0x45d4f0], ecx
test ecx, ecx
mov byte [ecx + 0x45d4f8], 0
je 0x404bfd
mov eax, dword [0x45fc9c]
test eax, eax
mov dword [esp + 0x18], 0
jbe 0x404bfd
jmp 0x404970
mov eax, dword [esp + 0x18]
mov edx, dword [0x45fc98]
mov ebp, dword [edx + eax*4]
mov al, byte [ebp + 0xd]
test al, al
jne 0x404a55
mov al, byte [ebp + 0x1d]
test al, al
movzx edx, byte [ebp + 0xc]
je 0x4049c6
cmp ecx, edx
jle 0x404a55
movsx eax, byte [ecx + 0x45d4f7]
push eax
push str._____:____.___n__t
call fcn.00443dd0
add esp, 8
test eax, eax
je 0x404a4f
mov ecx, dword [0x45d4f0]
lea edi, [ecx + 0x45d4f6]
jmp 0x4049d4
cmp ecx, edx
jl 0x404a55
lea edi, [ecx + 0x45d4f7]
movzx edx, byte [ebp + 0xc]
mov eax, dword [ebp + 4]
lea esi, [edx + eax - 1]
mov dl, byte [ebp + 0x18]
test dl, dl
je 0x4049fe
cmp esi, eax
jb 0x404a2c
lea ebx, [ebx]
mov dl, byte [edi]
cmp dl, byte [esi]
jne 0x404a2c
dec edi
dec esi
cmp esi, eax
jae 0x4049f0
jmp 0x404a2c
cmp esi, eax
jb 0x404a2c
movsx eax, byte [edi]
push eax
call fcn.00443ce6
movsx ecx, byte [esi]
push ecx
mov ebx, eax
call fcn.00443ce6
add esp, 8
cmp ebx, eax
jne 0x404a26
mov eax, dword [ebp + 4]
dec edi
dec esi
cmp esi, eax
jae 0x404a02
mov ecx, dword [0x45d4f0]
cmp esi, dword [ebp + 4]
jae 0x404a55
mov al, byte [ebp + 0x1e]
test al, al
jne 0x404a77
cmp edi, 0x45d4f8
jb 0x404a77
xor edx, edx
mov dl, byte [edi]
push edx
call dword [sym.imp.USER32.dll_IsCharAlphaNumericA]
test eax, eax
je 0x404a71
mov ecx, dword [0x45d4f0]
mov eax, dword [esp + 0x18]
mov edx, dword [0x45fc9c]
inc eax
cmp eax, edx
mov dword [esp + 0x18], eax
jb 0x404970
jmp 0x404bfd
mov ecx, dword [0x45d4f0]
mov al, byte [ebp + 0x19]
test al, al
jne 0x404a85
xor ebx, ebx
jmp 0x404b53
mov al, byte [ebp + 0x1d]
test al, al
lea edi, [ecx + 0x45d4f8]
je 0x404a93
dec edi
movzx eax, byte [ebp + 0xc]
mov esi, edi
sub esi, eax
xor bl, bl
cmp esi, edi
mov dword [esp + 0x1c], 0
mov byte [esp + 0x34], 0
jae 0x404b03
mov edi, edi
xor ecx, ecx
mov cl, byte [esi]
push ecx
call dword [sym.imp.USER32.dll_IsCharLowerA]
test eax, eax
jne 0x404ace
xor edx, edx
mov dl, byte [esi]
push edx
call dword [sym.imp.USER32.dll_IsCharUpperA]
test eax, eax
je 0x404af0
mov al, byte [esp + 0x34]
test al, al
jne 0x404aec
xor eax, eax
mov al, byte [esi]
mov byte [esp + 0x34], 1
push eax
call dword [sym.imp.USER32.dll_IsCharUpperA]
test eax, eax
je 0x404aec
mov bl, 1
inc dword [esp + 0x1c]
inc esi
cmp esi, edi
jb 0x404ab0
mov eax, dword [esp + 0x1c]
test eax, eax
jne 0x404b07
mov ecx, dword [0x45d4f0]
xor ebx, ebx
jmp 0x404b53
cmp eax, 1
jne 0x404b15
neg bl
sbb ebx, ebx
and ebx, 2
jmp 0x404b4d
test bl, bl
jne 0x404b1d
xor ebx, ebx
jmp 0x404b4d
movzx ecx, byte [ebp + 0xc]
mov esi, edi
sub esi, ecx
cmp esi, edi
mov ebx, 2
jae 0x404b46
mov edi, edi
xor edx, edx
mov dl, byte [esi]
push edx
call dword [sym.imp.USER32.dll_IsCharLowerA]
test eax, eax
jne 0x404b44
inc esi
cmp esi, edi
jb 0x404b30
cmp esi, edi
jne 0x404b4d
mov ebx, 1
mov ecx, dword [0x45d4f0]
mov al, byte [ebp + 0x1d]
test al, al
je 0x404b63
movzx eax, byte [ecx + 0x45d4f7]
jmp 0x404b65
xor eax, eax
movzx ecx, bx
movzx edx, ax
mov eax, dword [esp + 0x18]
shl ecx, 0x10
or ecx, edx
push ecx
mov ecx, dword [0x45d6e8]
push eax
push 0x401
push ecx
call dword [sym.imp.USER32.dll_PostMessageA]
mov edx, dword [ebp + 8]
cmp byte [edx], 0
je 0x404bbd
mov al, byte [ebp + 0x1d]
test al, al
je 0x404bb4
mov eax, dword [0x45d4f0]
mov cl, byte [eax + 0x45d4f7]
mov eax, 1
mov byte [0x45d4f8], cl
mov dword [0x45d4f0], eax
jmp 0x404bea
xor eax, eax
mov dword [0x45d4f0], eax
jmp 0x404bea
mov al, byte [ebp + 0x1a]
test al, al
je 0x404bfd
movzx edx, byte [ebp + 0xc]
mov ecx, dword [0x45d4f0]
sub ecx, edx
mov dword [0x45d4f0], ecx
mov al, byte [ebp + 0x1d]
test al, al
je 0x404be5
mov eax, ecx
dec eax
mov dword [0x45d4f0], eax
mov eax, dword [0x45d4f0]
mov byte [eax + 0x45d4f8], 0
mov al, byte [ebp + 0x1a]
test al, al
je 0x404bfd
mov byte [esp + 0x12], 0
mov al, byte [esp + 0x13]
test al, al
je 0x404d01
mov eax, dword [0x45eb78]
mov ecx, 1
cmp eax, ecx
jne 0x404d01
mov eax, dword [0x45ebb0]
cmp eax, dword [0x45ebb4]
jge 0x404c4a
mov edx, dword [0x45ebac]
mov bl, byte [esp + 0x14]
mov byte [edx + eax], bl
mov eax, dword [0x45ebb0]
mov edx, dword [0x45ebac]
inc eax
mov dword [0x45ebb0], eax
mov byte [edx + eax], 0
cmp dword [esp + 0x20], ecx
jle 0x404c7f
mov eax, dword [0x45ebb0]
cmp eax, dword [0x45ebb4]
jge 0x404c7f
mov ecx, dword [0x45ebac]
mov dl, byte [esp + 0x15]
mov byte [ecx + eax], dl
mov eax, dword [0x45ebb0]
mov ecx, dword [0x45ebac]
inc eax
mov dword [0x45ebb0], eax
mov byte [ecx + eax], 0
mov ebp, dword [0x45eb94]
test ebp, ebp
jne 0x404c97
mov edx, dword [0x45ebb4]
cmp dword [0x45ebb0], edx
jmp 0x404cf5
mov al, byte [0x45eba8]
test al, al
mov al, byte [0x45eba5]
je 0x404d3d
xor esi, esi
test al, al
je 0x404d0d
test ebp, ebp
jbe 0x404cea
jmp 0x404cc0
mov eax, dword [0x45eb90]
mov ecx, dword [eax + esi*4]
mov edx, dword [0x45ebac]
push ecx
push edx
call fcn.00443c60
add esp, 8
test eax, eax
jne 0x404dcb
mov eax, dword [0x45eb94]
inc esi
cmp esi, eax
jb 0x404cc0
mov eax, dword [0x45ebb4]
cmp dword [0x45ebb0], eax
jl 0x404d01
mov dword [0x45eb78], 5
mov al, byte [esp + 0x12]
pop edi
pop esi
pop ebp
pop ebx
add esp, 0x14
ret
test ebp, ebp
jbe 0x404cea
mov eax, dword [0x45eb90]
mov ecx, dword [eax + esi*4]
mov edx, dword [0x45ebac]
push ecx
push edx
call fcn.0043c570
add esp, 8
test eax, eax
jne 0x404dcb
mov eax, dword [0x45eb94]
inc esi
cmp esi, eax
jb 0x404d11
jmp 0x404cea
test al, al
je 0x404d8f
xor edi, edi
test ebp, ebp
jbe 0x404cea
mov edx, dword [0x45eb90]
lea ecx, [ecx]
mov esi, dword [edx + edi*4]
mov eax, dword [0x45ebac]
mov bl, byte [eax]
mov cl, bl
cmp bl, byte [esi]
jne 0x404d7c
test cl, cl
je 0x404d78
mov bl, byte [eax + 1]
mov cl, bl
cmp bl, byte [esi + 1]
jne 0x404d7c
add eax, 2
add esi, 2
test cl, cl
jne 0x404d58
xor eax, eax
jmp 0x404d81
sbb eax, eax
sbb eax, 0xffffffff
test eax, eax
je 0x404dcb
inc edi
cmp edi, ebp
jb 0x404d50
jmp 0x404cea
xor esi, esi
test ebp, ebp
jbe 0x404cea
lea esp, [esp]
mov eax, dword [0x45eb90]
mov ecx, dword [eax + esi*4]
mov edx, dword [0x45ebac]
push ecx
push edx
call fcn.0044e5aa
add esp, 8
test eax, eax
je 0x404dcb
mov eax, dword [0x45eb94]
inc esi
cmp esi, eax
jb 0x404da0
jmp 0x404cea
mov al, byte [esp + 0x12]
pop edi
pop esi
pop ebp
mov dword [0x45eb78], 3
pop ebx
add esp, 0x14
ret