我正在研究PE格式/ Windows Loader,无法找到导致错误“ Not a Valid Win32 Application”并随后导致加载失败的详细信息。

我已经根据Corkami的研究,尝试更改PE标头中的Major / Minor LinkerVersion。我还尝试将PE文件头中的所有不必要的数据结构清零。我有一个特定的文件,在该文件中,无法进行动态分析,它无法映射到内存中,并且当Explorer.exe尝试CreateFileMapping文件时,Process Monitor会显示“文件仅由读者锁定”状态。我想这只是肤浅的原因,EXPLORER.EXE是由内核例程提供的?不是有效的Win32应用。 OllyDbg失败,X32Dbg也失败。但是,IDA Pro能够很好地解析文件,并且当我导航到它的AddressOfEntryPoint时,似乎有有效的代码。我将在此处附加这个特定主题,但是该文件是恶意软件,因此我不知道这是否合适。但是,这个问题确实很普遍,因为文件根本不会加载。我将附上几个标题的照片:





文件的前几个字节中还包含MZ标题,以及e_lfanew中PE签名的正确链接。在加载程序实际启动之前,似乎在加载程序的调用者Explorer.exe之间的切换中肯定存在一些问题。这是我迷雾笼罩的领域,因为我对启动图像加载器之前发生的过程的那一步一无所知。

评论

标头的初始解析在内核中进行,因此您可能必须使用内核调试器来对其进行跟踪。顺便说一句,尝试在XP上运行它,它比Windows更高版本宽容得多。

你要剥离清单吗?

@IgorSkochinsky您知道在尝试启动程序时如何设置WinDbg使其中断以检查内存吗?我不确定如何中断程序加载,但我认为那是我必须要做的事情

发生这种情况的原因有很多,但最常见的原因是该文件已被截断。您是否有在其中成功加载文件的环境?

@peterferrie不,先生。稍后,我将尝试逐步通过WinDbg内核模式进行加载。我怀疑要花一些时间才能熟悉内核功能。但是也许我会看到实际的崩溃情况,这应该表明正在发生的事情。我已经在Xp,7和10中尝试过该功能。它似乎是较新的文件,因此,我不怀疑它仅能赢得95。因此,操作系统将检查段的适当长度并确定截断吗?

#1 楼



检查EXE和所有相关的DLL是否为同一平台构建。 (不要将32位和64位不匹配)


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


检查您是否没有丢失导入表所引用的任何运行时,该工具使用诸如depends之类的工具通常会丢失.NET框架或Visual C / C ++运行时。


确保目标是有效的Windows子系统,在这种情况下,WINDOWS_GUI看起来不错。

确保您的操作系统支持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)