Winapi C++访问PEBJLDDRI数据结构成员偏移 我是C++的新手,我想访问PebjLDRIX数据结构中的InDeuloDealMulteleList成员。

Winapi C++访问PEBJLDDRI数据结构成员偏移 我是C++的新手,我想访问PebjLDRIX数据结构中的InDeuloDealMulteleList成员。,winapi,Winapi,我试过这个: // the ldrData data type is PPEB_LDR_DATA PLIST_ENTRY firstitem_InMemoryOrderModuleList = ((PLIST_ENTRY)(pebLdrData + 0x0010)-> Flink); 没有成功。我应该如何访问它?列表\u条目是Windows在内部处理链接列表的方式。如果你需要更多的细节,网上有很多关于他们的信息,但这里有两件事你需要知道: 下一个/后一个指针不指向对象的头部,这在大多数

我试过这个:

// the ldrData data type is PPEB_LDR_DATA 
PLIST_ENTRY firstitem_InMemoryOrderModuleList = ((PLIST_ENTRY)(pebLdrData + 0x0010)-> Flink);
没有成功。我应该如何访问它?

列表\u条目是Windows在内部处理链接列表的方式。如果你需要更多的细节,网上有很多关于他们的信息,但这里有两件事你需要知道:

下一个/后一个指针不指向对象的头部,这在大多数实现中很常见;因此,为了到达对象的头部,您必须根据LIST_条目成员的偏移量对指针进行修正。这就是使用CONTAIN_RECORD宏的地方。 你不想在PEB_LDR_数据对象中的第一个LIST_条目上做这个修正,把它们想象成头指针,你需要在得到你关心的数据之前通过Flink。 示例代码:

LIST_ENTRY *current_record = NULL;
LIST_ENTRY *start = &(pebLdrData->InLoadOrderModuleList);

// move off the initial list entry to the first actual object
current_record = start->Flink;

while (true)
{
    // find the head of the object
    LDR_DATA_TABLE_ENTRY *module_entry = (LDR_DATA_TABLE_ENTRY*) 
        CONTAINING_RECORD(current_record, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);

    printf("%wZ\n", &module_entry->BaseDllName);

    // advance to the next object
    current_record = current_record->Flink;

    if (current_record == start)
    {
        break;
    }
}

解决方案是声明LDR_DATA_TABLE_ENTRY和PEB_LDR_DATA的typedef结构及其完整结构。

InLoadOrderModuleList无法识别,在尝试这样访问它时,我无法运行它。这就是我试图通过offsetI访问列表的原因。我可以在visual studio调试中看到MemoryordModuleList flink和blink中的firstitem_为空。结构位于winternl.h中。microsoft结构不是完整的结构