使用FASM开发含溢出检查加法函数的DLL时提示‘DLL不正确’错误的排查求助
排查你的FASM DLL编译错误问题
我帮你梳理了这段FASM DLL代码,几个关键问题导致系统提示“DLL不正确”的错误,下面逐一拆解并给出修正方案:
核心错误点分析
1. DLL入口函数不符合Windows规范
Windows对DLL的入口函数有严格要求:它必须处理系统发送的通知消息(比如DLL_PROCESS_ATTACH加载通知、DLL_PROCESS_DETACH卸载通知等),且返回值必须是BOOL类型(表示操作是否成功)。你写的start代码只是简单返回1,完全没有响应系统的DLL加载逻辑,系统自然会判定这个DLL不符合规范。
2. 导出表(.edata段)位置错误
你把导出表段放在了.end start之后——.end start是FASM标记程序结束的指令,后续的段定义会被编译器忽略,系统找不到导出的Hello函数,这也是DLL验证失败的重要原因。
3. 字符串显示的潜在问题(非加载失败直接原因)
你使用了win1251.inc编码,但直接调用MessageBox默认会匹配系统编码,可能导致俄语字符串显示乱码,这个可以同步修正。
修正后的完整代码
format PE gui dll include 'win32ax.inc' include 'encoding/win1251.inc' ; 数据段:存放提示字符串 .data mes0 db 'Библиотека Dll удачно подключена!',0 wName db 'Тест внешнего модуля',0 ; 导出表:必须放在代码段之前,确保编译器能识别 section '.edata' export data readable export 'myDll.dll',\ Hello, 'Hello' ; 代码段:包含标准入口函数和导出函数 .code ; 标准DLL入口函数DllMain,处理系统通知 proc DllMain hinstDLL, fdwReason, lpvReserved mov eax, [fdwReason] ; 根据不同通知类型执行对应逻辑 cmp eax, DLL_PROCESS_ATTACH je .on_attach cmp eax, DLL_PROCESS_DETACH je .on_detach cmp eax, DLL_THREAD_ATTACH je .on_thread_attach cmp eax, DLL_THREAD_DETACH je .on_thread_detach .on_attach: ; DLL加载时可执行初始化操作(可选) mov eax, TRUE ; 返回TRUE表示加载成功 ret .on_detach: ; DLL卸载时可执行清理操作(可选) mov eax, TRUE ret .on_thread_attach: mov eax, TRUE ret .on_thread_detach: mov eax, TRUE ret endp ; 导出的Hello函数,调用MessageBox显示提示 proc Hello ; 明确调用ANSI版本MessageBox,适配win1251编码的字符串 invoke MessageBoxA, 0, mes0, wName, MB_OK ret endp ; 标记程序结束,指定入口点为DllMain .end DllMain section '.reloc' fixups data discardable
关键修正说明
- 标准入口函数:替换原
start为DllMain,严格遵循Windows DLL的入口规范,确保系统能正确加载并初始化DLL。 - 调整导出表位置:把
.edata段移到.code段之前,让编译器能正确识别导出的函数信息。 - 明确字符串编码匹配:调用
MessageBoxA而非默认的MessageBox,确保win1251编码的俄语字符串能正常显示。 - 保留重定位段:
.reloc段是Windows DLL必须的,确保DLL在不同内存地址加载时能完成重定位操作。
内容的提问来源于stack exchange,提问作者Артём Копиль
相关产品推荐
相关产品推荐

