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