NASM调用FindFirstFileAPI获取首个EXE文件,程序未弹出MessageBox求助
问题分析与修正:调用FindFirstFileA后MessageBox不弹出的问题
你的代码存在几个关键错误,导致程序无法正常触发MessageBox弹窗,以下是问题点和修正方案:
核心错误点
- FindFirstFileA参数顺序颠倒:Windows API的
FindFirstFileA原型是HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData),必须先传递文件名指针,再传递结构体指针。你代码里先push了结构体,再push文件名,直接导致API调用失败,无法获取文件信息。 - WIN32_FIND_DATAA结构体定义错误:
FileName和AlternateFileName是用于存储文件名的字符缓冲区,不是双字数值。你用dd 260和dd 13只是把数值存在内存里,根本无法存储文件名。 - 字符串未加NULL终止符:Windows API要求所有字符串都是C风格(以0结尾),你的
exe_mask和title都没有添加db 0终止符,会导致API读取到垃圾数据,引发未定义行为。 - MessageBoxA参数错误:你push的
FileName是错误的内存位置(因为结构体定义错误),即使前面逻辑正确,也无法传递正确的文件名地址。
修正后的完整代码
extern FindFirstFileA extern ExitProcess extern MessageBoxA [section .data use32] search_handle dd 0 exe_mask db "*.exe", 0 ; 补充NULL终止符 title db "Found EXE", 0 ; 补充NULL终止符 ; 正确定义WIN32_FIND_DATAA结构体 Win32data: FileAttributes dd 0 CreationTime dd 0,0 LastAccessTime dd 0,0 LastWriteTime dd 0,0 FileSizeHigh dd 0 FileSizeLow dd 0 Reserved0 dd 0 Reserved1 dd 0 FileName db 260 dup(0) ; 260字节的文件名缓冲区 AlternateFileName db 13 dup(0) ; 13字节的短文件名缓冲区 [SECTION CODE USE32 CLASS=CODE] ..start: ; 修正参数顺序:先文件名,再结构体指针 push Win32data push exe_mask call [FindFirstFileA] ; 检查API返回值,若为-1(INVALID_HANDLE_VALUE)则表示未找到文件 cmp eax, -1 je exit_program mov [search_handle], eax ; 调用MessageBoxA:参数顺序为(hWnd, lpText, lpCaption, uType) push 0 ; MB_OK 弹窗类型 push title ; 弹窗标题 push Win32data + 44 ; FileName字段的内存偏移(计算:前面所有字段总字节数为44) push 0 ; 父窗口句柄为NULL call [MessageBoxA] exit_program: push byte 0 call [ExitProcess] end
汇编与链接命令
保持你原来的命令即可:
nasm -fobj find.asm golink -oPE find win32.lib
内容的提问来源于stack exchange,提问作者Junker3465
相关产品推荐
相关产品推荐

