.386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .code start: ;eax holds return value ;ebx will hold function addresses ;ecx will hold string pointers ;edx will hold NULL xor eax,eax xor ebx,ebx ;zero out the registers xor ecx,ecx xor edx,edx jmp short GetLibrary LibraryReturn: pop ecx ;get the library string mov [ecx + 10], dl ;insert NULL ;mov ebx, offset LoadLibraryA ;LoadLibraryA(libraryname); push ecx ;beginning of user32.dll ;call ebx ;eax will hold the module handle call offset LoadLibraryA jmp short FunctionName FunctionReturn: pop ecx ;get the address of the Function string xor edx,edx mov [ecx + 11],dl ;insert NULL push ecx push eax call offset GetProcAddress ;mov ebx, offset GetProcAddress ;GetProcAddress(hmodule,functionname); ;call ebx ;eax now holds the address of MessageBoxA jmp short Message MessageReturn: pop ecx ;get the message string xor edx,edx mov [ecx+3],dl ;insert the NULL xor edx,edx push edx ;MB_OK push ecx ;title push ecx ;message push edx ;NULL window handle call eax ;MessageBoxA(windowhandle,msg,title,type); Address ender: xor edx,edx push eax call offset ExitProcess ;mov eax, offset ExitProcess ;exitprocess(exitcode); ;call eax ;exit cleanly so we don't crash the parent program ;the N at the end of each string signifies the location of the NULL ;character that needs to be inserted GetLibrary: call offset LibraryReturn db 'user32.dllN' FunctionName: call offset FunctionReturn db 'MessageBoxAN' Message: call offset MessageReturn db 'HeyN' end start