.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