如何在Windows上准确判断进程架构?含32位ARM Win10场景
在32位ARM Windows 10中区分x86与ARM进程的方案
针对32位ARM Windows 10上无法通过IsWow64Process系列API、GetProcessInformation区分x86与ARM进程的问题,可通过读取进程PE头的Machine字段实现准确判断,该方法兼容Windows 10早期版本,具体实现步骤如下:
方法1:读取磁盘上的进程主模块文件
- 获取进程主模块路径:通过
OpenProcess拿到目标进程句柄后,调用GetModuleFileNameEx获取主模块的完整路径。 - 创建文件映射:用
CreateFile打开该路径对应的文件,再通过CreateFileMapping创建文件映射对象,最后调用MapViewOfFile获取映射视图的内存指针。 - 解析PE头:
- 从映射指针中读取
IMAGE_DOS_HEADER结构,通过其e_lfanew成员定位到IMAGE_NT_HEADERS结构的起始位置。 - 读取
IMAGE_NT_HEADERS.FileHeader.Machine字段的值:- 若为
IMAGE_FILE_MACHINE_I386(0x014C),则是x86架构进程 - 若为
IMAGE_FILE_MACHINE_ARM(0x01C0),则是32位ARM架构进程
- 若为
- 从映射指针中读取
- 清理资源:依次调用
UnmapViewOfFile、CloseHandle关闭映射视图、文件映射对象和文件句柄。
方法2:直接读取进程内存中的PE头
- 获取模块基地址:调用
GetModuleInformation(需包含psapi.h),传入进程句柄和NULL获取主模块的基地址(注意进程句柄需拥有PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限)。 - 读取PE头数据:使用
ReadProcessMemory从模块基地址开始,先读取IMAGE_DOS_HEADER,再根据e_lfanew读取IMAGE_NT_HEADERS,最终解析Machine字段判断架构。
这两种方法均不依赖Windows 10后期引入的API,能覆盖早期32位ARM系统的场景,且不受WOW层逻辑限制,可准确区分x86仿真进程与原生ARM进程。
内容的提问来源于stack exchange,提问作者j_kubik
相关产品推荐
相关产品推荐

