自定义PE文件运行时提示无法定位dll的MessageBoxA过程入口点
问题根因与修复方案
你的代码存在两处核心错误,直接导致了报错:
错误1:导入表配置位置错误
PE可选头的数据目录有固定的顺序规则,从0开始计数的第1个索引条目才对应导入表,你当前把导入表的RVA和大小写到了索引2的位置(对应资源表),Windows加载器完全识别不到你的导入配置,自然不会加载依赖的DLL、也不会填充导入地址表(IAT)。此时你调用的IAT地址还是你写死的、指向自身EXE内函数名字符串的偏移,系统就会误以为你要从EXE自身导入函数,触发你遇到的报错。
修复方式:
- 调整导入表到正确的数据目录位置,同时把
NumberOfRvaAndSizes改为标准的16,保证加载器能读到完整的配置:
dd 16 ; NumberOfRvaAndSizes 改为16,不要用4 rva: dd 0 ; 索引0:导出表(未使用) dd 0 dd import_dir_table ; 索引1:导入表(正确位置) dd import_dir_table_size dd 0 ; 索引2:资源表(未使用) dd 0 times 13 dd 0, 0 ; 填充剩余的13个数据目录
错误2:导入的依赖DLL错误
MessageBoxA是user32.dll的导出函数,不属于kernel32.dll的导出接口,就算导入表位置正确,从kernel32.dll中也找不到这个函数。
修复方式:
把导入的DLL名称替换为user32.dll,同时更新导入目录表的对应指针:
import_dir_table: dd import_lookup_table dd 0, 0 dd user32 ; 指向user32.dll的字符串,不要用kernel32 dd import_adress_table dd 0,0,0,0,0 ; ... 省略其他代码 ... ; 替换原来的kernel32字符串定义 user32: db "user32.dll", 0
可选优化:调整MessageBox参数顺序
Win32 API采用stdcall调用约定,参数需要从右往左压栈,MessageBoxA的参数顺序为(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType),你当前的压栈顺序有误,调整后逻辑更符合预期:
_main: push dword 0 ; 最后一个参数:弹窗样式uType = MB_OK push dword 0 ; 倒数第二个参数:弹窗标题lpCaption = 空 push dword mbox_message + 0x400000 push dword 0 ; 第一个参数:父窗口句柄hWnd = NULL call [import_adress_table + 0x400000] mov eax, 42 ret
修改完成后重新汇编即可正常运行,弹出预期的消息框。
内容的提问来源于stack exchange,提问作者Expolarity
相关产品推荐
相关产品推荐

