如何加载16位NE格式可执行文件以提取其内部资源?
16位Windows可执行文件资源读取方案
LoadLibraryEx仅支持解析Win32标准PE格式可执行文件,16位Windows程序使用的是NE(New Executable)格式,系统加载器在识别到PE头缺失时会直接返回「非有效Win32可执行文件」错误,和你传入的加载参数无关,没有办法通过调整LoadLibraryEx参数实现16位文件加载。
你可以根据运行环境选择以下方案读取资源:
- 自主解析NE格式(全平台通用):16位NE格式的结构规范完全公开,你可以直接读取二进制文件内容自行解析:
- 首先读取文件开头的
IMAGE_DOS_HEADER结构,通过e_lfanew字段获取NE头的起始偏移 - 解析NE头,从中读取资源表的偏移和长度信息
- 按NE格式资源表的目录结构遍历读取所需资源即可,NE的资源组织逻辑和PE格式有较高相似性,适配成本很低
- 首先读取文件开头的
- 16位兼容API(仅32位Windows可用):32位Windows保留了16位子系统的兼容thunk接口,可以直接调用
FindResource16、LoadResource16、LockResource16系列API读取资源,也可以先调用LoadModule加载16位文件后再操作资源,该方案在64位Windows下无法使用,微软已经完全移除了64位系统的16位兼容层 - 专用资源读取接口(限特定资源类型):如果只需要读取图标、版本信息这类标准资源,可以直接调用
ExtractIcon、VerQueryValue等通用系统接口,这类接口底层已经做了NE格式兼容,不需要自行处理文件结构,但不支持自定义资源的遍历读取
64位Windows环境下没有原生系统API可以直接加载16位NE格式可执行文件,全类型资源读取的最优方案是自主解析文件结构。
内容的提问来源于stack exchange,提问作者IS4
相关产品推荐
相关产品推荐

