什么条件会在加载时创建“不是有效的 Win32 应用程序”错误消息?

逆向工程 视窗 恶意软件 聚乙烯
2021-07-03 15:01:06

我正在研究 PE 格式/Windows 加载程序,但我无法找到导致“不是有效的 Win32 应用程序”错误以及加载失败的具体原因。

我已经尝试根据Corkami 的研究更改 PE 标头中的 Major/Minor LinkerVersion 我还尝试将 PE 文件头中所有不必要的数据结构归零。我有一个特定的文件,对于动态分析,它无法映射到内存中,并且当 Explorer.exe 尝试CreateFileMapping文件时,进程监视器显示“仅读取器锁定文件”状态我想这只是内核例程给出 EXPLORER.EXE 的表面原因?

我什至尝试在 WinDbg 中打开加载程序管理单元并尝试在 WinDbg中加载文件,但也失败了,声称它不是有效的 Win32 应用程序。OllyDbg 失败,X32Dbg 也失败。但是,IDA Pro 能够很好地解析文件,当我导航到它的 AddressOfEntryPoint 时,似乎有有效的代码。我会在这里附上这个特定的主题,但该文件是恶意软件,所以我不知道这是否合适。但是,这个问题确实很普遍,因为文件根本不会加载。我将附上其标题的几张照片:

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

该文件在第一个字节中还有一个 MZ 标头,一个到 PE 签名的正确链接以及 e_lfanew。在加载程序实际启动之前,加载的调用方Explorer.exe 之间的切换似乎一定存在问题。这是我很迷茫的地方,因为我对启动图像加载器之前发生的过程的那一步一无所知。

1个回答
  1. 检查 EXE 和所有相关 DLL 是否是为同一平台构建的。(不要错配 32 位和 64 位)

  2. 检查未超出 Windows PE 标头中引用的目标操作系统版本。在您的情况下,它似乎针对 Windows NT 4.0 (4.0)

  3. 使用诸如depends 之类的工具检查您是否缺少导入表引用的任何运行时通常这会缺少.NET 框架或Visual C/C++ 运行时。

  4. 确保以有效的Windows 子系统为目标,在这种情况下 WINDOWS_GUI 看起来没问题。

  5. 确保您的操作系统支持 EXE 平台,即 16 位不能在 64 位 Windows 上运行,64 位不能在 32 位 Windows 上运行。

我建议将调试器附加到实际调用 CreateProcess 的进程中,因为这些错误中至少有一些是从kernelbase!CreateInternalProcessW API触发的,您会RtlSetLastWin32Error(193)在发生此错误时看到它调用

当没有更具体的错误代码时,此特定错误似乎是流程创建期间任何问题的通用回退错误。

错误流程创建期间的类似错误消息包括:

  • %1 应用程序不能在 Win32 模式下运行。(错误代码 129)
  • 无法在 Win32 模式下运行 %1。(无效的 EXE 签名,错误代码 191)
  • 操作系统无法运行 %1。(无效模块类型错误代码190,EXE标记无效错误代码192,迭代数据超过64K错误194,无效minalloc大小错误代码195,无效段错误198)
  • 操作系统无法运行该应用程序。(错误代码 196)
  • 操作系统当前未配置为运行此应用程序(错误代码 197)