c ++ доступ к элементу структуры PEB_LDR_DATA по смещению - PullRequest
0 голосов
/ 02 апреля 2020

Я новичок в c ++ и пытаюсь получить доступ к члену InLoadOrderModuleList в структуре PEB_LDR_DATA.

Я пробовал это:

// the ldrData data type is PPEB_LDR_DATA 
PLIST_ENTRY firstitem_InMemoryOrderModuleList = ((PLIST_ENTRY)(pebLdrData + 0x0010)-> Flink);

безуспешно. Как мне получить к нему доступ?

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

LIST_ENTRY - это то, как Windows внутренне связывает списки. Есть много информации о них в Интернете, если вам нужно больше деталей, но здесь вам нужно знать две вещи:

  1. - это то, что следующие / обратные указатели не указывают на верхнюю часть объект (который распространен в большинстве реализаций); поэтому, чтобы добраться до заголовка объекта, вы должны исправить указатель на основе смещения члена LIST_ENTRY. Именно здесь вступает в действие макрос CONTAINING_RECORD.
  2. состоит в том, что вы не хотите вносить исправления в первый объект LIST_ENTRY в объекте PEB_LDR_DATA, думайте о них как о указателе "head", и вам нужно чтобы перейти через 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;
    }
}
0 голосов
/ 03 апреля 2020

Решение состоит в том, чтобы объявить структуры typedef для LDR_DATA_TABLE_ENTRY и PEB_LDR_DATA с их полной структурой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...