2023年1月

七、线程列表流(ThreadListStream)

ThreadListStream流包含线程核心信息。它紧挨着异常信息流(ExceptionStream)。

异常信息流如下

 

0x678+0n168=0x720。而线程列表流如下

 

可知偏移是0x720,即证明杂项信息流是紧挨着系统信息流,大小有3796字节。

ThreadListStream包含的数据结构如下:

typedef struct_MINIDUMP_THREAD_LIST {
ULONG32 NumberOfThreads;
MINIDUMP_THREAD Threads[
0];
} MINIDUMP_THREAD_LIST,
*PMINIDUMP_THREAD_LIST;

八、线程信息列表流(ThreadInfoListStream)

ThreadInfoListStream包含了线程状态信息,在ThreadListStream的后面就是ThreadInfoListStream了。

ThreadListStream如下:

0x720+0n3796=0x15F4

ThreadInfoListStream如下:

所以ThreadInfoListStream紧挨着ThreadListStream,大小为5068字节。数据如下:

ThreadInfoListStream的数据由两个结构组成,一个是MINIDUMP_THREAD_INFO_LIST,另一个是MINIDUMP_THREAD_INFO。

MINIDUMP_THREAD_INFO_LIST包含数据大小的信息,相当于头部结构,如下:

typedef struct_MINIDUMP_THREAD_INFO_LIST {
ULONG SizeOfHeader;
ULONG SizeOfEntry;
ULONG NumberOfEntries;
} MINIDUMP_THREAD_INFO_LIST,
*PMINIDUMP_THREAD_INFO_LIST;

在日常分析dmp文件工作中,我发现用".loadby sos clrjit"指令来加载sos扩展库在有的dmp文件成功有的不成功,都是报如下错误:

0:036> .loadby sos clrjit
The call to LoadLibrary(sos.dll) failed, Win32 error 0n2
    "系统找不到指定的文件。"
Please check your debugger configuration and/or network access.
今日有得闲,于是就仔细分析下这个问题。

首先,我们知道".loadby sos clrjit"是根据clrjit的路径去加载sos,出现这个问题自然而然有两个可能性:

  • 一是dmp文件里没有包含clrjit模块信息
  • 二是clrjit路径问题

我们先看看是不是第一种情况,执行lm列出dmp文件包含的模块信息

没有问题的dmp如下:

0:000> lm
start    end        module name         
01250000 0126f000   clrcompression   (deferred)             
...       
692b0000 6933a000   clrjit     (deferred)

....

有问题的dmp如下:

0:036> lm
start    end        module name
00230000 0023e000   mxml1      (deferred)             

0:036> lm
start    end        module name
00230000 0023e000   mxml1      (deferred)             
....      
50100000 5017d000   clrjit     (deferred) 

......

可以看到都有clrjit模块信息。也就证明不是第一种情况,那就是第二种情况了,为了求证,要查看模块的详细信息了

没有问题的dmp如下:

0:000> lmDvmclrjit
Browse full module list
start    end        module name
692b0000 6933a000   clrjit     (deferred)             
    Image path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clrjit.dll
    Image name: clrjit.dll
    Browse all global symbols  functions  data
    Timestamp:        Tue Jul  7 06:46:31 2020 (5F03A9C7)
    CheckSum:         00095382
    ImageSize:        0008A000
    File version:     4.8.4220.0
    Product version:  4.0.30319.0
    File flags:       8 (Mask 3F) Private
    File OS:          4 Unknown Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    Information from resource tables:
        CompanyName:      Microsoft Corporation
        ProductName:      Microsoft® .NET Framework
        InternalName:     clrjit.dll
        OriginalFilename: clrjit.dll
        ProductVersion:   4.8.4220.0
        FileVersion:      4.8.4220.0 built by: NET48REL1LAST_C
        PrivateBuild:     DDBLD507
        FileDescription:  Microsoft .NET Runtime Just-In-Time Compiler
        LegalCopyright:   © Microsoft Corporation.  All rights reserved.
        Comments:         Flavor=Retail
有问题的dmp如下:

0:036> lmDvmclrjit
Browse full module list
start    end        module name
50100000 5017d000   clrjit     (deferred)             
    Image path: clrjit.dll
    Image name: clrjit.dll
    Browse all global symbols  functions  data
    Timestamp:        Sat Apr 12 09:19:13 2014 (53489491)
    CheckSum:         0007D3A1
    ImageSize:        0007D000
    File version:     4.0.30319.34209
    Product version:  4.0.30319.34209
    File flags:       8 (Mask 3F) Private
    File OS:          4 Unknown Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    Information from resource tables:
        CompanyName:      Microsoft Corporation
        ProductName:      Microsoft® .NET Framework
        InternalName:     clrjit.dll
        OriginalFilename: clrjit.dll
        ProductVersion:   4.0.30319.34209
        FileVersion:      4.0.30319.34209 built by: FX452RTMGDR
        PrivateBuild:     DDBLD354
        FileDescription:  Microsoft .NET Runtime Just-In-Time Compiler
        LegalCopyright:   © Microsoft Corporation.  All rights reserved.
        Comments:         Flavor=Retail
我相信大家都看出问题之所在了吧。对,能执行成功的模块是全路径,而另外一个只有文件名,那么当然会报"系统找不到指定的文件。"的错误了。看来两种dmp文件抓取的类型标志肯定不一样。

有问题dmp文件标志如下

 

果然去掉了模块路径信息。下面是这个标志的说明:

MiniDumpFilterModulePaths
过滤内存信息中的模块路径,只保留模块名称。此选项可以保护用户的隐私比如用户名、重要的目录等,但可能阻止系统定位Image文件,应当谨慎应用在特殊环境。
该选项要求DbgHelp 5.1以上版本。

九、模块列表流(ModuleListStream)

ModuleListStream流包含进程已加载模块信息。它紧跟随在ThreadInfoListStream后面。ThreadInfoListStream信息如下:

0x15f4+0n5068=0x29c0

ModuleListStream如下

可知ModuleListStream的RVA 为0x29c0,所以ModuleListStream紧挨着ThreadInfoListStream,大小为26680字节。数据如下:

这些数据按如下结构组织在一起:

typedef struct_MINIDUMP_MODULE_LIST {
ULONG32 NumberOfModules;
MINIDUMP_MODULE Modules[
0];
} MINIDUMP_MODULE_LIST,
*PMINIDUMP_MODULE_LIST;