rendered paste body.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
DlgProc proto :HWND,:UINT,:WPARAM,:LPARAM
GetProcAddr proto :DWORD, :DWORD
K32Base proto
.data
szlmao db "i win", 0
K32BASE dd 0
U32BASE dd 0
USER32DLL db "USER32.DLL", 0
LoadLibrary_str db "LoadLibraryA", 0
LoadLibrary_fn dd 0
FreeLibrary_str db "FreeLibrary", 0
FreeLibrary_fn dd 0
ExitProcess_str db "ExitProcess", 0
ExitProcess_fn dd 0
MessageBox_str db "MessageBoxA", 0
MessageBox_fn dd 0
DialogBoxParam_str db "DialogBoxParamA", 0
DialogBoxParam_fn dd 0
EndDialog_str db "EndDialog", 0
EndDialog_fn dd 0
.code
K32Base proc
mov ecx, [esp + 4]
@@: xor edx, edx
dec ecx
mov dx, [ecx + 3ch]
test dx, 0f800h
jnz @b
cmp ecx, [ecx + edx + 34h]
jnz @b
mov eax, ecx
ret
K32Base endp
GetProcAddr proc uses esi edi ecx ebx edx, hLib:DWORD, szProc:DWORD
mov esi, hLib
cmp word ptr [esi], 5a4dh
jnz @@error_exit
add esi, [esi + 03ch]
cmp dword ptr [esi], 00004550h
jnz @@error_exit
mov edi, szProc
mov ecx, 200
xor al, al
repnz scasb
mov ecx, edi
sub ecx, szProc
mov edx, [esi + 078h]
add edx, hLib
assume edx:ptr IMAGE_EXPORT_DIRECTORY
mov ebx, [edx].AddressOfNames
add ebx, hLib
xor eax, eax
@@: mov edi, [ebx]
add edi, hLib
mov esi, szProc
push ecx
repz cmpsb
jz @@sth_done
pop ecx
add ebx, 4
inc eax
cmp eax, [edx].NumberOfNames
jne @b
jmp @f
@@sth_done:
add esp, 4
@@: cmp eax, [edx].NumberOfNames
je @@error_exit
mov esi, [edx].AddressOfNameOrdinals
add esi, hLib
push edx
mov ebx, 2
xor edx, edx
mul ebx
pop edx
add eax, esi
xor ecx, ecx
mov word ptr cx, [eax]
mov edi, [edx].AddressOfFunctions
xor edx, edx
mov ebx, 4
mov eax, ecx
mul ebx
add eax, hLib
add eax, edi
mov eax, [eax]
add eax, hLib
jmp @f
assume edx:nothing
@@error_exit:
xor eax, eax
@@: ret
GetProcAddr endp
start:
call @F
@@: pop ebp
sub ebp, OFFSET @B
call [K32Base]
mov K32BASE, eax
push offset LoadLibrary_str
push K32BASE
call [GetProcAddr]
mov LoadLibrary_fn, eax
push offset FreeLibrary_str
push K32BASE
call [GetProcAddr]
mov FreeLibrary_fn, eax
push offset ExitProcess_str
push K32BASE
call [GetProcAddr]
mov ExitProcess_fn, eax
push OFFSET USER32DLL
call [LoadLibrary_fn]
mov U32BASE, EAX
push offset DialogBoxParam_str
push U32BASE
call [GetProcAddr]
mov DialogBoxParam_fn, eax
push 0
push offset DlgProc
push 0
push 101
push 00400000h
call [DialogBoxParam_fn]
push U32BASE
call [FreeLibrary_fn]
push NULL
call [ExitProcess_fn]
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
mov eax,uMsg
cmp eax, WM_COMMAND
je @@WMCMD
cmp eax, WM_CLOSE
je @@WMCLS
xor eax,eax
ret
@@WMCMD:
mov eax,wParam
mov ecx,eax
shr ecx,16
cmp cx,BN_CLICKED
jne @@EXT
cmp ax,1003
jne @@EXT
push OFFSET USER32DLL
call [LoadLibrary_fn]
mov U32BASE, EAX
push offset MessageBox_str
push U32BASE
call [GetProcAddr]
mov MessageBox_fn, eax
push 0
push offset szlmao
push offset szlmao
push 0
call [MessageBox_fn]
push U32BASE
call [FreeLibrary_fn]
jmp @@EXT
@@WMCLS:
push OFFSET USER32DLL
call [LoadLibrary_fn]
mov U32BASE, EAX
push offset EndDialog_str
push U32BASE
call [GetProcAddr]
mov EndDialog_fn, eax
push 0
push hWin
call [EndDialog_fn]
push U32BASE
call [FreeLibrary_fn]
@@EXT: mov eax,1
ret
DlgProc endp
end start