无法在Windows中找到BSOD的函数

sdnqo3pr  于 2023-08-07  发布在  Windows
关注(0)|答案(1)|浏览(130)

在Linux系统中,它有一个kernel_panic函数负责操作系统崩溃。假设Windows 10中有一个类似的函数,我想找到它的符号。
我希望我的分析工具能够捕捉系统崩溃的图像定位其内存位置。我正试图通过调试在Windows中使用相同功能的函数。例如,有一些非常常见的BSOD,如IRQL_NOT_LESS_EQUALPAGE_FAULT_IN_NONPAGED_AREAtcpip.sys中的错误可能导致这些崩溃。
我想在手动触发系统崩溃后通过查看调用堆栈来跟踪函数。因为我在内核模式下,所以我不能在windbg中使用**.call命令。就像下面的输出一样,页面相关的问题可能出现在nt**内核中。因此,我尝试用函数的地址替换RIP的值。没有一个成功的。根据我的意图和方法,可能有什么问题?

1: kd> x *!*page*fault*
fffff800`3e96ea44 nt!MiResolvePageFileFault (void)
fffff800`3e9268d0 nt!MiInitializePageFaultPacket (void)
fffff800`3e92e57c nt!PfSnLogPageFaultCommon (void)
fffff800`3eb35434 nt!EtwpCoverageSamplerPageFault (EtwpCoverageSamplerPageFault)
fffff800`3e8733b4 nt!PfSnLogPageFault (PfSnLogPageFault)
fffff800`3e865ab0 nt!xHalIommuServicePageFault (xHalIommuServicePageFault)
fffff800`3e9e0880 nt!KiPageFault (KiPageFault)
fffff800`3eb4c800 nt!KiPageFaultShadow (KiPageFaultShadow)
fffff800`3eb2dbf4 nt!EtwTracePageFault (EtwTracePageFault)
fffff800`3eb3c000 nt!ExpSvmServicePageFault (ExpSvmServicePageFault)
fffff800`3ead9bf8 nt!MiLargePageFault (MiLargePageFault)
fffff800`3f2cd9c0 hal!IvtGetPageFault (IvtGetPageFault)
fffff800`3f2d0070 hal!HsaDismissPageFault (HsaDismissPageFault)
fffff800`3f2c9940 hal!IommupHvDismissPageFault (IommupHvDismissPageFault)
fffff800`3f2ccfe0 hal!IvtDismissPageFault (IvtDismissPageFault)
fffff800`3f2d0a60 hal!HsaGetPageFault (HsaGetPageFault)
fffff800`3f31bf80 hal!HalpBlkPageFault (HalpBlkPageFault)
fffff800`3f2c9a80 hal!IommupHvGetPageFault (IommupHvGetPageFault)
fffff802`42434fb8 Wof!g_PagesFaultedOnAgain = <no type information>
fffff802`4446916c dxgmms2!VIDMM_GLOBAL::PageInFaultedAllocation (void)
fffff802`4449b5ec dxgmms2!VIDMM_GLOBAL::PageInFromFaultedList (public: long __cdecl VIDMM_GLOBAL::PageInFromFaultedList(class VIDMM_DEVICE *))


1: kd> x *!*irql*less*
fffff802`41daf7ec acpiex!PlExtpVerifyIrqlLessThanOrEqual (PlExtpVerifyIrqlLessThanOrEqual)

1: kd> db tcpip!TCPIP_MEMORY_FAILURES   --->    a constant unfortunately
fffff802`42a0d900  55 04 00 10 02 00 55 04-80 00 00 00 80 00 00 80  U.....U.........
fffff802`42a0d910  92 05 00 10 05 00 89 05-00 00 00 00 01 00 00 80  ................

字符串

ffx8fchx

ffx8fchx1#

经过仔细检查,我已经找到了功能。正如Luke和blabb所说,目标函数是KeBugCheck/KeBugCheckEx。
首先,以Administrator身份运行cmd。第二,在终端中手动杀死内核进程。然后,系统将崩溃并生成一个小型转储。

1: kd> p
nt!PspCatchCriticalBreak+0x94:
fffff806`73ea4c74 84db            test    bl,bl
1: kd> g
Critical process 0xFFFFB38F4D8CA080 (svchost.exe) exited
Break, or Ignore (bi)? bi

字符串
调用堆栈看起来像这样。.crash不起作用,只会触发dbg的crash函数。

nt!KeBugCheckEx
nt!PspCatchCriticalBreak+0x10e
nt!PspTerminateAllThreads+0x15b987
nt!PspTerminateProcess+0xe0
nt!NtTerminateProcess+0x9c
nt!KiSystemServiceCopyEnd+0x28

相关问题