Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows x64(侵入式)单链表_Windows_Linked List_Reverse Engineering_Windbg_Intrusive Containers - Fatal编程技术网

Windows x64(侵入式)单链表

Windows x64(侵入式)单链表,windows,linked-list,reverse-engineering,windbg,intrusive-containers,Windows,Linked List,Reverse Engineering,Windbg,Intrusive Containers,我目前正试图在一些Windows查找列表上绞尽脑汁,我看到一些让我困惑的内存地址 从我发布的另一个问题中,由于()产生了一些代码: 从上面的WinDBG输出中可以看出,在地址0x82d5ffc0处有一个单链表。此输出是在32位Windows 7系统上生成的 然而,这就是我感到困惑的地方,当在Windows 7 64位系统上执行相同的操作时,这是输出(地址明显不同): 似乎0x0000000001bf0003的Next值不是有效的虚拟地址,我还尝试对其执行虚拟到物理的转换,但失败了 看起来这个值是

我目前正试图在一些Windows查找列表上绞尽脑汁,我看到一些让我困惑的内存地址

从我发布的另一个问题中,由于()产生了一些代码:

从上面的WinDBG输出中可以看出,在地址0x82d5ffc0处有一个单链表。此输出是在32位Windows 7系统上生成的

然而,这就是我感到困惑的地方,当在Windows 7 64位系统上执行相同的操作时,这是输出(地址明显不同):

似乎
0x0000000001bf0003
Next
值不是有效的虚拟地址,我还尝试对其执行虚拟到物理的转换,但失败了

看起来这个值是某个页面的偏移量,但我不完全确定应该如何计算地址

列表标题中还有其他数据,这是一个
\u SLIST\u header
结构,位于
\u SINGLE\u list\u ENTRY
之前。它包含以下数据:

Alignment: 0x1bf0003
Region: 0xfffffa8001df5b01
在初始头之后是一系列三个联合体,由于这是一个64位系统,我认为应该使用
头16
联合体,它包含以下内容:

Depth: 0x3
Sequence: 0x1bf
HeaderType: 0x1
Init: 0x0
Reserved: 0x0
NextEntry: 0xfffffa8001df5b0
Header16.nextery
元素确实包含有效的虚拟地址,因此我不确定这是下一个列表元素的实际值还是其他值

因此,如果有人能帮助澄清
\u SINGLE\u LIST\u ENTRY.Next
元素是如何在64位系统上计算的,我将不胜感激


谢谢,滑动头记录在WDK中:

typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
    struct {  // original struct
        ULONGLONG Alignment;
        ULONGLONG Region;
    } DUMMYSTRUCTNAME;
    struct {  // 8-byte header
        ULONGLONG Depth:16;
        ULONGLONG Sequence:9;
        ULONGLONG NextEntry:39;
        ULONGLONG HeaderType:1; // 0: 8-byte; 1: 16-byte
        ULONGLONG Init:1;       // 0: uninitialized; 1: initialized
        ULONGLONG Reserved:59;
        ULONGLONG Region:3;
    } Header8;
    struct {  // ia64 16-byte header
        ULONGLONG Depth:16;
        ULONGLONG Sequence:48;
        ULONGLONG HeaderType:1; // 0: 8-byte; 1: 16-byte
        ULONGLONG Init:1;       // 0: uninitialized; 1: initialized
        ULONGLONG Reserved:2;
        ULONGLONG NextEntry:60; // last 4 bits are always 0's
    } Header16;
    struct {  // x64 16-byte header
        ULONGLONG Depth:16;
        ULONGLONG Sequence:48;
        ULONGLONG HeaderType:1; // 0: 8-byte; 1: 16-byte
        ULONGLONG Reserved:3;
        ULONGLONG NextEntry:60; // last 4 bits are always 0's
    } HeaderX64;
} SLIST_HEADER, *PSLIST_HEADER;
所以你想要的是64号机头。此外,NextEntry地址在结构中仅为60位,根据注释,最后四位始终为零。下面是我的系统中的一个示例(稍微清理):

将零位半字节添加到末尾:

1: kd> !pool 0xfffffa80038556b0 2
Pool page fffffa80038556b0 region is Nonpaged pool
*fffffa80038556a0 size:  130 previous size:   80  (Allocated) *Irp 
        Pooltag Irp  : Io, IRP packets

SLIST_标头记录在WDK中:

typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
    struct {  // original struct
        ULONGLONG Alignment;
        ULONGLONG Region;
    } DUMMYSTRUCTNAME;
    struct {  // 8-byte header
        ULONGLONG Depth:16;
        ULONGLONG Sequence:9;
        ULONGLONG NextEntry:39;
        ULONGLONG HeaderType:1; // 0: 8-byte; 1: 16-byte
        ULONGLONG Init:1;       // 0: uninitialized; 1: initialized
        ULONGLONG Reserved:59;
        ULONGLONG Region:3;
    } Header8;
    struct {  // ia64 16-byte header
        ULONGLONG Depth:16;
        ULONGLONG Sequence:48;
        ULONGLONG HeaderType:1; // 0: 8-byte; 1: 16-byte
        ULONGLONG Init:1;       // 0: uninitialized; 1: initialized
        ULONGLONG Reserved:2;
        ULONGLONG NextEntry:60; // last 4 bits are always 0's
    } Header16;
    struct {  // x64 16-byte header
        ULONGLONG Depth:16;
        ULONGLONG Sequence:48;
        ULONGLONG HeaderType:1; // 0: 8-byte; 1: 16-byte
        ULONGLONG Reserved:3;
        ULONGLONG NextEntry:60; // last 4 bits are always 0's
    } HeaderX64;
} SLIST_HEADER, *PSLIST_HEADER;
所以你想要的是64号机头。此外,NextEntry地址在结构中仅为60位,根据注释,最后四位始终为零。下面是我的系统中的一个示例(稍微清理):

将零位半字节添加到末尾:

1: kd> !pool 0xfffffa80038556b0 2
Pool page fffffa80038556b0 region is Nonpaged pool
*fffffa80038556a0 size:  130 previous size:   80  (Allocated) *Irp 
        Pooltag Irp  : Io, IRP packets
1: kd> !pool 0xfffffa80038556b0 2
Pool page fffffa80038556b0 region is Nonpaged pool
*fffffa80038556a0 size:  130 previous size:   80  (Allocated) *Irp 
        Pooltag Irp  : Io, IRP packets