调用CreateWindowExA后RIP损坏,疑栈分配错误求助
Win64汇编调用CreateWindowExA后RIP寄存器损坏问题
在Win64汇编开发中,调用CreateWindowExA函数后出现RIP寄存器损坏问题,通过x64dbg调试发现异常发生在NtUserCreateWindowEx调用之后,怀疑是栈分配操作存在错误。手动编写的汇编代码和使用Invoke宏的版本均出现相同错误,现将相关代码及编译配置整理如下:
手动编写的汇编代码
include win64a.inc .code WinMain proc push rbp ; save old rbp mov rbp, rsp ; set-up rbp sub rsp, 20h ; allocate space for local vars mov rcx, 0 ; 1 param mov rdx, IDC_ARROW ; 2 param sub rsp, 20h ; allocate home-space call LoadCursorA mov [rbp - 8h], rax ; 1 local param, hCursor mov rcx, 0 ; 1 param mov rdx, IDI_APPLICATION ; 2 param call LoadIconA ; home-space allocated at 11 mov [rbp - 10h], rax ; 2 local param, hIcon add rsp, 20h ; deallocate home-space ; Develope WNDCLASSEXA structure push [rbp-10h] pushaddr wndName push 0 push COLOR_WINDOWFRAME push [rbp-8h] push [rbp-10h] push IMAGE_BASE push 0 pushaddr WndProc push sizeof WNDCLASSEX mov rcx, rsp ; 1 param - ptr to the structure sub rsp, 20h ; allocate home-space call RegisterClassExA sub rsp, 40h ; Allocate stack for params xor rcx, rcx ; dwExStyle lea rdx, wndName ; lpClassName lea r8, wndName ; lpWindowName mov r9, WS_OVERLAPPEDWINDOW or WS_VISIBLE ; dwStyle mov qword ptr [rsp + 20h], 0 ; x mov qword ptr [rsp + 28h], 0 ; y mov qword ptr [rsp + 30h], 600 ; w mov qword ptr [rsp + 38h], 800 ; h mov qword ptr [rsp + 40h], 0 ; hWndParent mov qword ptr [rsp + 48h], 0 ; hMenu mov qword ptr [rsp + 50h], IMAGE_BASE ; hInstance mov qword ptr [rsp + 58h], 0 ; lpParam call CreateWindowExA add rsp, 40h ; Deallocate stack mov [rbp-18h], rax ; 3 local param, hWnd leave WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM WndProc endp .data wndName db "test", 0 end
win64a.inc头文件内容
OPTION DOTNAME OPTION PROLOGUE:rbpFramePrologue OPTION EPILOGUE:rbpFrameEpilogue include win64.inc include temphls.inc include ntdll.inc includelib ntdll.lib include user32.inc includelib user32.lib include gdi32.inc includelib gdi32.lib include kernel32.inc includelib kernel32.lib include shell32.inc includelib shell32.lib ;--------------------------- pushaddr macro x db 68h dd x endm IMAGE_BASE equ 400000h
使用Invoke宏的版本代码
include win64a.inc .code WinMain proc <13> local hWnd:qword local msg:MSG local wnd:WNDCLASSEX mov rdi, offset wndName ;WndName invoke LoadCursorA, 0, IDC_APPSTARTING mov wnd.hCursor, rax invoke LoadIconA, 0, IDI_APPLICATION mov wnd.hIcon, rax mov wnd.hIconSm, rax mov wnd.lpszClassName, rdi mov wnd.hInstance, IMAGE_BASE mov rax, offset Wndproc mov wnd.lpfnWndProc, rax mov wnd.cbSize, sizeof WNDCLASSEX mov wnd.hbrBackground, COLOR_WINDOWFRAME lea rax, wnd invoke RegisterClassExA, rax invoke CreateWindowExA, 0, rdi, rdi, WS_OVERLAPPEDWINDOW or WS_VISIBLE, 0, 0, 600, 800, 0, 0, IMAGE_BASE, 0 mov hWnd, rax ret WinMain endp Wndproc proc <12,8,4,8,8> hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM jmp NtdllDefWindowProc_ ret Wndproc endp .data wndName db "test", 0 end
编译链接配置
ml64.exe编译命令
ml64.exe /I"%masm64_path%/include" /Zp16 /c /Cp %filename%.asm >>errors.txt
link.exe链接命令
link /LIBPATH:"%masm64_path%\lib" /LARGEADDRESSAWARE:NO /SUBSYSTEM:WINDOWS ^ /STUB:%masm64_path%\bin\stubby.exe ^ /entry:WinMain /fixed %filename%.obj
内容的提问来源于stack exchange,提问作者mantissa
相关产品推荐
相关产品推荐

