; messagebox_x64.asm — position-independent x64 shellcode: resolve ; user32.dll!MessageBoxA via LoadLibraryA (user32.dll isn't guaranteed ; loaded in a plain console process, unlike kernel32) and pop a real ; message box. Returns normally (ret) once the user dismisses it, so the ; host thread keeps running afterward. ; ; text_buf/caption_buf are fixed-size placeholders at the very end of the ; assembled blob; winpwn patches them at runtime with the actual ; NUL-terminated strings (see shellcraft.go). BITS 64 default rel start: push rbp push r12 mov rbp, rsp and rsp, ~0xF ; force 16-byte stack alignment, unknown entry state call get_kernel32_base mov rcx, rax lea rdx, [rel name_user32] lea r8, [rel name_messageboxa] call resolve_export mov r12, rax ; r12 = MessageBoxA address xor rcx, rcx ; hWnd = NULL lea rdx, [rel text_buf] ; lpText lea r8, [rel caption_buf] ; lpCaption xor r9, r9 ; uType = MB_OK sub rsp, 0x20 ; shadow space required before any WinAPI call call r12 add rsp, 0x20 mov rsp, rbp pop r12 pop rbp ret %include "resolver.inc" name_user32: db "user32.dll", 0 name_messageboxa: db "MessageBoxA", 0 align 8 text_buf: times 256 db 0 align 8 caption_buf: times 64 db 0