我有一个顽固的PE文件,无法加载。 PE标头似乎是完整的,甚至在多个PE工具中文件也可以很好地解析。我尝试启动它时收到“无效的Win32应用程序”错误。实际上,由于WinDbg中没有针对进程显示的加载器标志,因此加载器甚至无法启动。从Explorer.exe移交到内核内部的负载之间出了点问题。当Explorer.exe尝试CreateFileMapping文件时,ProcMon会显示“文件仅锁定了文件”状态。

因此,我进入了WinDbg上的内核模式调试。但是,我不确定如何配置调试器以正确解决此问题。当我按“ g”然后打开文件时,它像往常一样崩溃并且我没有登录WinDbg。如果我按“中断”,则我会暂停。我需要以某种方式中断我的双击文件,然后分隔内核代码。

评论

在procmon中找到调用堆栈,并在函数之一上设置一个断点(可能是特定于进程的断点),以防止在热代码路径中发生过多的中断

#1 楼

我建议您在NtCreateSection函数上放置一个断点,该函数负责在使用SEC_IMAGE标志调用时验证和映射PE映像。希望您可以逐步解决它,以找出失败的原因。

评论


您是否偶然熟悉KiSystemServiceCopyEnd和KiSystemServiceExit?我得到了这些,但是除了崩溃转储之外没有任何关于它们的在线信息,也没有真正的信息

–the_endian
17年7月17日在10:19

@the_endian我不熟悉这些,但是它们听起来与图像解析无关。

–伊戈尔·斯科钦斯基♦
17年7月17日在14:20

非常感谢您的建议。我终于把这个东西缩小到了MiCreateImageFileMap中。它通过了MiVerifyImageHeader检查(从那里返回0),但是MiCreateImageFileMap自己进行了一些额外的检查,失败了,返回代码C000007B触发了无效的Win32应用程序错误。继续检查这个例程,看看我是否可以查明。这些都是在NtCreateSection内部然后在MmCreateSection内部实现的。

–the_endian
17年7月18日在0:51



@the_endian我建议比较一个好的二进制文件和一个不好的二进制文件的代码流,看看它们的不同之处。

–伊戈尔·斯科钦斯基♦
17年7月21日在15:23